Add linkbot.py
Questo bot estrae il titolo da ogni link pubblicato in un muc xmpp e lo pubblica nel muc stesso. Esempio: user: https://www.xmpp-it.net linkbot: Title: XMPP-IT Italian Community
This commit is contained in:
parent
2c432812d2
commit
4e46de827a
1 changed files with 91 additions and 0 deletions
91
linkbot.py
Normal file
91
linkbot.py
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
## LinkBot
|
||||||
|
## Autore Mario Sabatino
|
||||||
|
## mario@sabatino.pro
|
||||||
|
## Questo software viene rilasciato con la licenza GPL3
|
||||||
|
##
|
||||||
|
## Ringraziamenti:
|
||||||
|
## Questo software è stato sviluppato con il supporto di ChatGPT, un modello di intelligenza artificiale sviluppato da OpenAI.
|
||||||
|
#################################################################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
# Importazione delle librerie necessarie
|
||||||
|
import logging
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from slixmpp import ClientXMPP
|
||||||
|
|
||||||
|
# Definizione della classe XMPPBot, che estende ClientXMPP
|
||||||
|
class XMPPBot(ClientXMPP):
|
||||||
|
|
||||||
|
# Costruttore della classe
|
||||||
|
def __init__(self, jid, password, room, nick):
|
||||||
|
# Inizializzazione del client XMPP con le credenziali e informazioni di stanza
|
||||||
|
ClientXMPP.__init__(self, jid, password)
|
||||||
|
self.room = room
|
||||||
|
self.nick = nick
|
||||||
|
|
||||||
|
# Configurazione degli event handlers per gestire l'inizio della sessione e i messaggi della chat
|
||||||
|
self.add_event_handler("session_start", self.session_start)
|
||||||
|
self.add_event_handler("groupchat_message", self.muc_message)
|
||||||
|
|
||||||
|
# Metodo asincrono eseguito all'avvio della sessione
|
||||||
|
async def session_start(self, event):
|
||||||
|
# Imposta la presenza online del bot e recupera il roster (lista contatti)
|
||||||
|
self.send_presence()
|
||||||
|
await self.get_roster()
|
||||||
|
# Il bot si unisce alla stanza della chat usando il plugin 'xep_0045'
|
||||||
|
self.plugin['xep_0045'].join_muc(self.room, self.nick)
|
||||||
|
|
||||||
|
# Metodo asincrono per la gestione dei messaggi ricevuti nella chat di gruppo
|
||||||
|
async def muc_message(self, msg):
|
||||||
|
# Filtra i messaggi per evitare di rispondere a quelli inviati dallo stesso bot
|
||||||
|
if msg['mucnick'] != self.nick and 'body' in msg.keys():
|
||||||
|
text = msg['body']
|
||||||
|
# Estrae gli URL dal messaggio ricevuto
|
||||||
|
urls = self.extract_urls(text)
|
||||||
|
for url in urls:
|
||||||
|
# Ottiene il titolo della pagina web dall'URL e invia un messaggio con il titolo
|
||||||
|
title = self.get_web_title(url)
|
||||||
|
if title:
|
||||||
|
self.send_message(mto=msg['from'].bare, mbody=f"Title: {title}", mtype='groupchat')
|
||||||
|
|
||||||
|
# Metodo per estrarre gli URL da un testo
|
||||||
|
def extract_urls(self, text):
|
||||||
|
words = text.split()
|
||||||
|
# Restituisce una lista di parole che sono URL validi
|
||||||
|
return [word for word in words if urlparse(word).scheme in ('http', 'https')]
|
||||||
|
|
||||||
|
# Metodo per recuperare il titolo di una pagina web dall'URL
|
||||||
|
def get_web_title(self, url):
|
||||||
|
try:
|
||||||
|
# Esegue una richiesta HTTP all'URL e analizza il contenuto HTML
|
||||||
|
r = requests.get(url, timeout=5)
|
||||||
|
soup = BeautifulSoup(r.text, 'html.parser')
|
||||||
|
# Restituisce il titolo della pagina web
|
||||||
|
return soup.title.string
|
||||||
|
except Exception as e:
|
||||||
|
# Registra l'eccezione se non riesce a recuperare il titolo
|
||||||
|
logging.exception(f"Could not retrieve title for URL: {url}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Punto di ingresso principale del programma
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Configura il logging a livello DEBUG
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
# Impostazione delle credenziali e informazioni del bot
|
||||||
|
jid = "jidbot"
|
||||||
|
password = "password"
|
||||||
|
room = "nome@muc"
|
||||||
|
nick = "nickbot"
|
||||||
|
|
||||||
|
# Creazione dell'istanza del bot e registrazione dei plugin necessari
|
||||||
|
xmpp = XMPPBot(jid, password, room, nick)
|
||||||
|
xmpp.register_plugin('xep_0030') # Service Discovery
|
||||||
|
xmpp.register_plugin('xep_0045') # Multi-User Chat
|
||||||
|
xmpp.register_plugin('xep_0199') # XMPP Ping
|
||||||
|
|
||||||
|
# Connessione del bot al server XMPP e avvio del processo
|
||||||
|
xmpp.connect()
|
||||||
|
xmpp.process(forever=False)
|
Loading…
Reference in a new issue