## LinkBot v. 0.2 ## Autore Mario Sabatino ## e-mail: mario@sabatino.pro ## jid xmpp: 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. ## Un ringraziamento a: Simome roughnecks@woodpeckersnest.space ################################################################################################################################# # 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, rooms, nick): # Inizializzazione del client XMPP con le credenziali e informazioni di stanza ClientXMPP.__init__(self, jid, password) self.rooms = rooms 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.rooms, 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" rooms = "nome@muc1", "nome@muc2" nick = "nickbot" # Creazione dell'istanza del bot e registrazione dei plugin necessari xmpp = XMPPBot(jid, password, rooms, 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)