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