Giter Site home page Giter Site logo

marvin's Introduction

marvin

Questo bot pubblica tutti i link postati sul gruppo Telegram ItalyInformatica (https://t.me/ItalyInformatica) sul subreddit a cui fa riferimento (https://www.reddit.com/r/ItalyInformatica/).

Il bot deve:

  • su comando /postlink, in risposta ad un messaggio contenente un link, postare tale link sul subreddit, indicando il nick Telegram dell'autore;
  • su comando /posttext, in risposta ad un messaggio testuale, postare tale contenuto sul subreddit con il titolo fornito, indicando il nick Telegram dell'autore;
  • su comando /comment, in risposta ad un messaggio contenente un link ad un post di Reddit (solo se del subreddit ItalyInformatica), aggiungere un commento al post;
  • su comando /delrule, in risposta ad un messaggio contenente un link ad un post di Reddit (solo se del subreddit ItalyInformatica), cancellare tale post per violazione della regola fornita.

Wiki completa delle funzionalità: https://old.reddit.com/r/ItalyInformatica/wiki/bot

marvin's People

Contributors

corxo avatar defkon1 avatar drizzt avatar fen0x avatar gbalduzzi avatar ldeluigi avatar mebeim avatar scrappycocco avatar timendum avatar zareclec avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

marvin's Issues

Ban automatico di cryptocurrency spam bot

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....

image

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.

Come funzionano gli spam bot

Un bot del genere solitamente opera così:

  1. Entra nel gruppo, ed aspetta un po' (minuti, secondi).
  2. Invia nel gruppo una foto apparentemente normale.
  3. Invia nel gruppo un messaggio contenente testo casuale.
  4. Modifica la foto nel messaggio del punto 2 cambiandola con una foto contenente spam, come mostrato sopra.
  5. Modifica il testo del messaggio del punto 3 cambiandolo con un link di spam/phishing, come mostrato sopra.

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.

Come contrastarli

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:

  1. 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).

  2. Ogni messaggio ricevuto, controllare se il messaggio è stato inviato da uno degli utenti nel set di watchlist.

  3. 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.

  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.

Non fare reply telegram nel messaggio "post creato"

immagine
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

Aggiungere un comando che approvi un post sul subreddit

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

Associazione fra nome utente telegram e reddit

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.

Bloccare l'utilizzo del comando ai mod di uno specifico gruppo

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)

Risposta di default al comando /admin

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

Precedenza al controllo se moderatore

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.
image
In questo caso il bot avrebbe dovuto rispondere che non è moderatore e non che deve rispondere ad un messaggio.

Aggiungere il link (telegram) del testo da cui proviene il post (su reddit) e altre cosette

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

  • la parola "telegram" sarà un link diretto al messaggio dal gruppo telegram https://t.me/ItalyInformatica/1234 (dove 1234 è il numero [message_id] del messaggio postato)
  • la parola "marvin" avrà un link a questa repo di github

Il messaggio di elminazione del post non viene postato nel gruppo di controllo

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"

Post in formato testo

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

Sistemare /delrule

  • 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

Cambiare il carattere di inizio del comando

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)

Comando /delrule [numero]

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

Il bot smette di creare le notifiche di nuovi post sul sub

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

Non inoltrare post più vecchi di un TOT da reddit

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.

Fare /delrule per i commenti

Invocando /delcomment (nome temporaneo) in maniera:
/delcomment <link> <rule_num>
Il bot deve:

  • lockare/rimuovere il commento
  • lockare le risposte
  • rispondere con: "Il tuo post è stato rimosso per la violazione del seguente articolo del regolamento: "

Ha un funzionamento simile a /delrule

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.