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:
Mario Sabatino 2023-11-17 17:20:44 +01:00
parent 2c432812d2
commit 4e46de827a

91
linkbot.py Normal file
View 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)