fen0x / marvin Goto Github PK
View Code? Open in Web Editor NEWUn bot per l'integrazione fra il gruppo Telegram e il subreddit /r/ItalyInformatica
Home Page: https://reddit.com/r/ItalyInformatica
License: MIT License
Un bot per l'integrazione fra il gruppo Telegram e il subreddit /r/ItalyInformatica
Home Page: https://reddit.com/r/ItalyInformatica
License: MIT License
Nel controllo se un comando può essere eseguito, andrebbe data la precedenza a quello se un utente è moderatore. Altrimenti gli utenti si prendono messaggi di errore che, da un punto di vista formale, non sono corretti.
In questo caso il bot avrebbe dovuto rispondere che non è moderatore e non che deve rispondere ad un messaggio.
Ora il formato del commento postato con il comando /comment è questo:
[Telegram - @nomeutente] commento
Dovrebbe diventare (in formato markdown):
[[Telegram](link al commento) - @nomeutente] commento
Come da best practice per il posting sul subreddit, se il link è in inglese sarebbe buona norma inserire nel titolo un tag [ENG].
https://www.reddit.com/r/ItalyInformatica/wiki/guidelines
I moderatori del gruppo telegram, se non sono moderatori del subreddit, non dovrebbero avere la possibilità di utilizzare il comando /delrule.
Il messaggio di errore è il seguente:
2019-05-05 16:43:16,795 - __main__ - WARNING -
Update status:
"{'message': {'delete_chat_photo': False, 'new_chat_photo': [], 'text': '/delrule 6', 'reply_to_message': {'delete_chat_photo': False, 'new_chat_photo': [], 'text': 'Cercasi Scripter per progetto Italiano FIVEM RP\nhttps://redd.it/bkygo5', 'supergroup_chat_created': False, 'photo': [], 'new_chat_members': [], 'channel_chat_created': False, 'message_id': 488417, 'entities': [{'length': 22, 'offset': 48, 'type': 'url'}], 'chat': {'username': 'ItalyInformatica', 'title': '/r/ItalyInformatica', 'id': -1001076982426, 'type': 'supergroup'}, 'from': {'first_name': 'bifrost|bot', 'is_bot': True, 'id': 706670142, 'username': 'bifrost_robot'}, 'group_chat_created': False, 'date': 1557067311, 'caption_entities': []}, 'photo': [], 'new_chat_members': [], 'channel_chat_created': False, 'message_id': 488418, 'entities': [{'length': 8, 'offset': 0, 'type': 'bot_command'}], 'chat': {'username': 'ItalyInformatica', 'title': '/r/ItalyInformatica', 'id': -1001076982426, 'type': 'supergroup'}, 'from': {'first_name': 'Fen0x', 'is_bot': False, 'id': 117903015, 'username': 'Fen0x'}, 'supergroup_chat_created': False, 'group_chat_created': False, 'date': 1557067391, 'caption_entities': []}, 'update_id': 333249479}"
Caused error:
"Reply message not found"
Dovrebbe essere il messaggio di partenza, non il comando di fen0x
In un test effettuato oggi in locale il bot non riusciva a scaricare i titoli delle pagine
Controllare se la funzione "get_page_title_from_url" funziona come dovrebbe
Line 19 in 9d926f0
(Basta togliere l'if dalla funzione comment)
In riferimento a quanto ho scritto in #20, prendendo questo commento di test
https://www.reddit.com/r/ItalyInformatica/comments/al2edh/telegram_delooo_provissima/efa0lbb/
Sarebbe bello cambiare il link delle parole "gruppo telegram" da https://t.me/ItalyInformatica a https://t.me/ItalyInformatica/1234 dove 1234 è il message_id del messaggio da cui proviene il post
Se viene dato il comando /delrule <link al post> <numero della regola>
, il commento di rimozione include erroneamente anche il link al post.
Esempio: https://www.reddit.com/r/ItalyInformatica/comments/jqu7a1/impossibile_accedere_a_xboxlive_per_pc/
Attualmente il carattere iniziale è '/'
esempio: /postlink
Sfortunatamente, quello è il carattere dei veri comandi di telegram. Il bot che usiamo per moderare il gruppo, ha la possibilità di cancellare all'istante i comandi che non riconosce. Ovviamente /postlink non lo riconosce.
Questa funzionalità è molto comoda, e non bisogna perderla. Il bot admin è talmente veloce che cancella /postlink prima che possa essere visto dal bot marvin.
Per ora, ho spento la cancellazione dei comandi.
Tuttavia, con questa segnalazione, diciamo anche che possiamo considerarla un mezzo bug, chiedo di scegliere un nuovo carattere.
Suggerisco qualcosa come
+postlink
-postlink
=postlink
$postlink
&postlink
%postlink
ecc...
Sono sicuro che questi il bot li cancella
/ ! # .
Slash, punto esclamativo, cancelletto, punto
Discutiamo insieme su quale carattere è giusto scegliere (ovviamente va bene anche un altro rispetto a quelli che ho proposto io)
Nel caso il messaggio su cui si fa la richiesta non contenga un link, il bot deve richiedere un titolo e sottometterà al sub un post in formato testuale
Come /posttext e /postlink, ma pubblica una foto o un video
Forse potrebbe essere /postmedia e non /postphoto e /postivideo separati, se video e photo funzionano uguali (bisogna vedere l'implementazione delle librerie)
I comandi riconoscono il parametro anche se non è separato da uno spazio.
Esempio:
esempio:
Delooo, Il tuo commento è stato aggiunto al post!
Il bot in questo caso sarà utilizzato dai mod del gruppo telegram di ItalyInformatica, fare in modo che solo loro possano utilizzare il bot (quindi non deve essere possibile utilizzarlo in privato o utilizzarlo aggiungendolo ad un altro gruppo)
A seguito del comando /delrule, il bot dovrebbe evitare di avvisare sul gruppo principale che il post è stato eliminato. Per logging, potrebbe comunque farlo sul gruppo di controllo dei mod.
Il commento di cancellazione del post va fatto mod e sticky
Testare a fondo il comando per vedere se effettivamente funziona bene cancellando i messaggi telegram
/admin contatterà in privato gli amministratori oppure li taggherà nel gruppo #64
Il bot tagga se stesso col comando /admin perché prova ad inviarsi un messaggio privato e Telegram glielo impedisce.
Se qualcuno apre una issue (o una pr) su questa repo, sarebbe carino si inviasse un messaggio nel gruppo telegram, di modo da renderne partecipi tutti
Per sostituire il bot di @armef97, si potrebbe implementare questa funzionalità temporizzando l'eliminazione di tutti i messaggi che iniziano con /.
Tramite un comando sul gruppo telegram (ipotizzo /linkuser nomeutentereddit) il bot richiederebbe il permesso di postare contenuti al posto dell'utente, potendo così sottomettere a nome dell'utente reddit associato.
L'idea è un thread in cui vengono pubblicati come commenti di un post su reddit magari
Al contrario di /delrule, questo comando dovrebbe, in risposta ad un link sul subreddit, approvare il post e aggiungere un tag fra quelli disponibili nel sub.
Un esempio di sintassi potrebbe essere:
/approve programmazione
Non è bello dare comandi di cancellazione di post in un gruppo pubblico. Non si potrebbe fare nella privacy del gruppo di logging dei post?
Quando si usa /admin, se il bot è riuscito a contattare tutti gli admin in privato, dovrebbe comunque confermare all'utente che il comando è andato a buon fine
Nel caso dell'immagine, il bot risponde a qualcosa che il bot stesso cancella, lasciando uno spazio inutile. Non ha senso che il bot risponda a quel messaggio se appunto è lui stesso a cancellarlo, è meglio che sia un messaggio normale allora, senza essere una risposta ad un messaggio. Oppure potrebbe essere una reply al messaggio di partenza, quello al quale ha fatto reply anche chi ha scritto /postlink o /posttext
Con un json si tiene traccia delle parole che compaiono del titolo e della lista dei possibili autori, se un post rientra in queste caratteristiche, viene pinnato:
esempio:
https://www.reddit.com/r/ItalyInformatica/comments/amytg7/il_mercatino_digitale_consigli_per_hardware/
Avrebbe testo "mercatino digitale" e utenti "automoderator"
Invocando /delcomment (nome temporaneo) in maniera:
/delcomment <link> <rule_num>
Il bot deve:
Ha un funzionamento simile a /delrule
Il bot dovrebbe potere rilevare i nuovi post sul subreddit e, in maniera temporizzata, riportarne il link sul gruppo telegram, magari escludendo quelli che sono stati postati dal gruppo stesso.
Rispondendo ad link postato dal bot (quindi un post del subreddit postato direttamente da reddit) con il comando, ad esempio /delrule 1, il bot commenta che viola la regola 1 (e magari scrive anche la regola (vedi commento d'esempio https://www.reddit.com/r/ItalyInformatica/comments/al305w/semplice_crm_per_consulente/efa79k6/), il bot poi cancella il post, e elimina anche il comando /delrule del gruppo e il post sul gruppo telegram al quale si aveva risposto con /delrule. Il bot blocca anche i commenti al post di reddit appena cancellato (su questo non saprei, deciderà fen0x)
Spero di essermi spiegato bene.
Sostanzialmente riduce molto lavoro a fen0x
Ciao,
attualmente il bot inoltra sul gruppo Telegram anche post reddit vecchi (20 giorni?).
Consiglio di mettere un blocco per cui il bot non inoltra niente che sia più vecchio di un TOT numero (da decidere) di ore.
Ora esistono un paio di automatismi creati su IFTTT che, quando rilevano un nuovo post sul subreddit, postano sulla pagina FB e sull'account Twitter.
https://www.facebook.com/rItalyInformatica/
https://twitter.com/ItalyITC
Sarebbe bello che fosse il bot stesso a provvedere e a permettere la cancellazione di tali post sempre con il comando /delrule.
Alla fine non credo che ci sarebbero grandi abusi e comunque si possono sempre moderare.
Se io scrivo "ciao" su telegram, e qualcuno ci fa /posttext, esso viene pubblicato
Il post su reddit conterrà "ciao".
Io invece propongo di aggiungere, sul fondo, una dicitura del tipo
"questo post proviene da telegram grazie al bot marvin"
dove
Possibilità di modificare un commento postato dal gruppo al subreddit
Il log prima del restart
2019-01-29 19:08:16,074 - __main__ - INFO - Starting bot... Reading login Token...
2019-01-29 19:08:16,075 - __main__ - INFO - Unable to load cached cookies, creating new ones automatically.
2019-01-29 19:08:17,437 - __main__ - INFO - Connecting to subreddit:ItalyInformatica - ItalyInformatica: Il panorama informatico italiano
2019-01-29 19:08:17,438 - __main__ - INFO - Starting bot... Logging in...
2019-01-29 19:08:17,439 - __main__ - INFO - Starting bot... Setting handler...
2019-01-29 19:08:17,441 - __main__ - INFO - check_new_reddit_posts thread started
2019-01-29 19:08:17,441 - __main__ - INFO - Starting bot... Bot ready!
2019-01-30 09:48:06,429 - __main__ - WARNING - Update "{'update_id': 333239450, 'message': {'channel_chat_created': False, 'supergroup_chat_created': False, 'new_chat_photo': [], 'reply_to_message': {'channel_chat_created': False, 'new_chat_photo': [], 'text': 'Sviluppo Bot telegram\nhttps://redd.it/alasda', 'new_chat_members': [], 'delete_chat_photo': False, 'photo': [], 'entities': [{'offset': 22, 'type': 'url', 'length': 22}], 'caption_entities': [], 'message_id': 478011, 'from': {'username': 'bifrost_robot', 'id': 706670142, 'first_name': 'bifrost|bot', 'is_bot': True}, 'date': 1548837756, 'group_chat_created': False, 'supergroup_chat_created': False, 'chat': {'username': 'ItalyInformatica', 'id': -1001076982426, 'type': 'supergroup', 'title': '/r/ItalyInformatica'}}, 'text': '/comment puoi connetterti ad un db MSSQL e salvare la pagina corrente di ogni utente, oppure puoi usare delle variabili (che però devi salvare da qualche parte per non perderle quando lo riavvii)', 'new_chat_members': [], 'delete_chat_photo': False, 'photo': [], 'entities': [{'offset': 0, 'type': 'bot_command', 'length': 8}], 'caption_entities': [], 'chat': {'username': 'ItalyInformatica', 'id': -1001076982426, 'type': 'supergroup', 'title': '/r/ItalyInformatica'}, 'from': {'username': 'Delooo', 'id': 340271798, 'first_name': '𝑳𝒖𝒄𝒂 {...}', 'is_bot': False}, 'date': 1548838085, 'group_chat_created': False, 'message_id': 478012}}" caused error "Reply message not found"
2019-01-30 15:30:10,078 - __main__ - INFO - Default comment sent!
2019-01-30 15:30:10,134 - __main__ - INFO - New text-post submitted
2019-01-30 18:04:40,361 - __main__ - INFO - Comment added to post with id:aldrfg
2019-01-31 11:30:56,873 - __main__ - INFO - Comment added to post with id:alndq4
2019-02-01 08:25:51,679 - __main__ - INFO - Default comment sent!
2019-02-01 08:25:51,774 - __main__ - INFO - New text-post submitted
2019-02-01 09:56:26,840 - __main__ - INFO - Default comment sent!
2019-02-01 09:56:26,919 - __main__ - INFO - New link-post submitted
Il comando /comment accetta come parametro anche tutti spazi.
Esempio:
Il comando /comment dovrebbe essere in grado di inviare un commento a qualsiasi link al subreddit che appare sul gruppo telegram.
Se un utente scrive solo /postalink stampare un errore adatto
Come:"Solo i mod possono usare questo comando"
E anche:"Per utilizzare questo comando devi rispondere ad un messaggio"
Nel post sul subreddit viene riportato il nome utente di chi ha dato il comando e non quello dell'utente che ha creato il messaggio contenente il link
Sempre più bot entrano nel canale solamente per postare link di spam/phishing relativi a qualche sito malevolo che ha a che fare con qualche cryptocurrency. Esempio più comune: una foto seguita da un link che il è spesso nel formato http[s]://t.cn/...
o http[s]://tinyurl.com...
.
La quantità di bot di questo genere sembra essere non insignificante e suppongo che sia difficile e noioso gestire a mano la cosa. L'aggiunta al bot di una funzionalità di controllo dei messaggi dei nuovi utenti ed eventuale ban istantaneo dei bot sarebbe una ottima feature.
Un bot del genere solitamente opera così:
I punti 2, 3, 4, 5 sono più o meno interscambiabili a patto che ovviamente 2 avvenga prima di 4 e 3 avvenga prima di 5.
Non conosco la API fornita dalla specifica libreria Python utilizzata in questo bot, ma conosco la API Telegram, quindi parlerò basandomi sulla seconda. La libreria Python utilizzata dice di supportare completamente la Telegram Bot API 4.1, quindi il modo di fare quel che dico dovrebbe esserci, e non dovrebbe neanche essere difficile da capire.
Cosa andrebbe fatto:
Ogni messaggio ricevuto, controllare il campo new_chat_members
dell'oggetto Message
, aggiungendo l'ID di tutti i nuovi utenti ad un set di watchlist. Gli utenti in questo set avranno associato un contatore del numero di messaggi inviati nel gruppo (inizialmente settato a zero) ed una data dell'ultima interazione (inizialmente settata al momento di entrata nel gruppo).
Ogni messaggio ricevuto, controllare se il messaggio è stato inviato da uno degli utenti nel set di watchlist.
Se l'utente è nel set:
3.1. Incrementare il contatore: se il contatore supera una certa soglia (direi >= 3
), eliminare l'utente dalla watchlist. I bot solitamente inviano i primi due messaggi contenenti spam, poi basta.
3.2. Se è passato abbastanza tempo dall'ultima interazione (1h? 3h? da definire), eliminare l'utente dalla watchlist. I bot solitamente operano nel giro di pochi minuti/secondi di tempo dall'entrata nel gruppo.
3.3. Se il messaggio contiene una foto (campo photo
), una possibile azione potrebbe essere il ban istantaneo (e rimozione da watchlist), inviando poi un messaggio privato di default all'utente spiegando il motivo del ban. Nessuno invia foto appena entrato in un gruppo, questo potrebbe essere un buon metodo di riconoscere bot.
3.4. Se il messaggio contiene del testo (campo text
), controllare il testo per URL della forma http[s]://t.cn/...
o http[s]://tinyurl.com...
ed in tal caso bannare l'utente allo stesso modo del punto 3.3 (e rimuovere da watchlist).
3.5. Se il messaggio contiene una edit di una photo (campo new_chat_photo
), stessa azione del punto 3.3.
3.6. Se il messaggio è una edit del testo (campo edit_date
diverso da date
), stessa azione del punto 3.4.
In ogni caso, è necessario avere una seconda funzione che controlli gli utenti nella watchlist ogni TOT ed elimini dalla watchlist gli utenti che hanno una ultima interazione abbastanza vecchia, così da non riempire la watchlist (e quindi anche la RAM) di utenti che sono nel gruppo solo per leggere e non mandano messaggi. Questo potrebbe essere aggiunto all'handler dei messaggi di default.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.