From 4e46de827a0ee7c13de7aa574e0ea734a5ee5af5 Mon Sep 17 00:00:00 2001 From: Mario Sabatino Date: Fri, 17 Nov 2023 17:20:44 +0100 Subject: [PATCH] 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 --- linkbot.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 linkbot.py diff --git a/linkbot.py b/linkbot.py new file mode 100644 index 0000000..f0ff112 --- /dev/null +++ b/linkbot.py @@ -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)