sorcio / python-italia-telegram-bot

0 stars 0 forks source link

[feature] Anti spam #8

Open sorcio opened 5 years ago

sorcio commented 5 years ago

Sarebbe estremamente utile se il bot fosse capace di identificare spam, ed eliminarlo, o bannare gli utenti che lo producono.

Non so cosa significhi "spam" nel contesto di Telegram e come identificarlo. Apro la discussione per accogliere qualunque input a riguardo.

Kavuti commented 5 years ago

Potremmo considerare spam qualunque riferimento a canali e link. Potrebbe essere utile definire una whitelist di canali e siti web consentiti. Per i siti web poi bisognerebbe fare un lavoro di parsing per verificare che il link sia parte di un sito web o meno. In caso di spam, utilizzerei il warn come metodo di disciplina, che ovviamente porta al ban in caso di comportamenti recidivi. Il resto dello spam credo vada identificato tramite segnalazioni degli utenti e sguardo degli amministratori (non implementerei language-processing per leggere messaggi tipo "chi vuole soldi mi contatti in privato" 😂). A quel punto bisogna aiutare gli utenti ad identificare lo spam e invitarli a segnalarlo ogni qual volta si verifichi.

nocturn9x commented 5 years ago

Penso che la feature sia interessante. Si potrebbe pensare di fare un parsing con delle regex per identificare eventuali link in whitelist e punire gli altri utenti con del+warn

iflare3g commented 5 years ago

In realtà ci sono canali di SpamWatch che hanno già una bella blacklist/s di user_id conosciuti e bannati per quanto riguarda la spam e quindi si potrebbe pensare anche di sfruttarli per rendere il lavoro più semplice Però devo informarmi di più a riguardo, giusto per non partire da zero e avere giù una base di spammers conosciuti

MattiaFailla commented 5 years ago

Nel caso in cui volessimo definire le cose a mano o prendere spunto da una lista di link e/o messaggi ci torna utile il modulo di tgbot "warn".

Kavuti commented 5 years ago

Ieri sera stavo pensando proprio allo spam. Forse sarebbe opportuno creare un modulo a sé stante per lo spam e fare in modo che interagisca con i vari moduli di warn, kick e ban. Più che altro se vogliamo implementare un meccanismo abbastanza preciso e complesso, può essere utile separare il codice per mantenerlo ordinato e modulare. Che dite?

iflare3g commented 5 years ago

Non riesco a rientrare nel gruppo di test, ma avevo visto che @sorcio parlava di spam, quindi "riapro" qui la discussione. @sorcio di solito in altri gruppi per quanto riguarda lo spam è capitato quello che ti stavano già dicendo, in @django e @python ma anche in @djangoitalia ogni tanto arrivano messaggi di pubblicità riguardo criptovalute ecc ecc, roba del genere

MattiaFailla commented 5 years ago

Non riesco a rientrare nel gruppo di test, ma avevo visto che @sorcio parlava di spam, quindi "riapro" qui la discussione.

Ora apro un issue con tutti i link

Per quanto riguarda lo spam come volete gestirlo? una lista di IDs in "blacklist" oppure analisi dei link?

iflare3g commented 5 years ago

Devo controllare come funzionano le federations di Rose/Marie, perchè c'è SpamWatch federation che ha migliaia di user_id già segnalati ed è possibile "sottoscriversi" a queste federations in modo da poter avere accesso a quel db e quindi far bannare in automatico se arriva un messaggio da uno di quegli id

Kavuti commented 5 years ago

Io pensavo ad un meccanismo del genere:

Fatemi sapere se fa acqua da qualche parte.

sorcio commented 5 years ago

Non so come funzionino queste federation e queste raccolte di user_id segnalati come spammer. Non conosco i loro criteri. Può essere una possibilità che anziché bannare direttamente questi utenti gli chiediamo di risolvere un captcha?

sorcio commented 5 years ago

PS: varie fonti mi hanno convinto che sia inopportuno usare la terminologia white/blacklist e piuttosto usare termini più descrittivi tipo allowlist/denylist.

iflare3g commented 5 years ago

PS: varie fonti mi hanno convinto che sia inopportuno usare la terminologia white/blacklist e piuttosto usare termini più descrittivi tipo allowlist/denylist.

A questo punto l'idea potrebbe essere appunto che ogni utente del gruppo possa, tramite il comando /spam messaggio ( dovrebbe funzionare col reply di TG ) , lo user_id venga buttato nella denylist Ovviamente se è stato fatto per errore e l'utente contatta in privato chiedendo di essere riammesso, solo gli admin possono "sbannarlo" Non so, magari può essere utile anche salvare il contenuto del messaggio bannato in modo da aiutare il bot a riconoscere successivi messaggi di quel tipo da user_id differenti

Kavuti commented 5 years ago

Valutiamo prima se quello che vogliamo fare non è già riconducibile ai moduli locks, warn, muting, kick, ban, dato che la denylist di utenti mi sembra sia di fatto la lista di utenti bannati. Per il riconoscimento del messaggio non saprei come fare, mi sembra una problematica da machine learning. Hai qualche idea in merito?

iflare3g commented 5 years ago

In effetti è un problematica forse troppo complessa, oppure potremmo salvare solo l'entity ( url/text_url ) visto che di solito spammano siti web/web app

Kavuti commented 5 years ago

@iflare3g comunque per evitare lavoro in più lascio che sia tu a lavorare sullo spam, altrimenti rischiamo di accavallarci. Stavo pensando invece a stabilire strettamente ciò che per il gruppo Python Italia è spam. Riflettendoci, si potrebbe parlare di:

Dimentico qualcosa? Possiamo già iniziare a pensare a come gestire ognuna di queste casistiche?

iflare3g commented 5 years ago

@Kavuti va benissimo! In @django/@python abbiamo preferito rimuovere i permessi a condivisione di foto/audio/video in modo da "forzare" all'uso di pastebin, gist ecc. ecc. per esempio Per gli stickers non saprei, valgono come entity , come li dovremmo filtrare ?

sorcio commented 5 years ago

Non mi piace che gli URL siano bloccati salvo eccezioni, perché non possiamo costruire una lista di tutti i domini buoni del web, né credo che possiamo richiedere l'intervento di un admin per ogni url non previsto. Condividere articoli, pagine di documentazione, esempi, e simile richiede inviare url. Non vedo una soluzione facile a questo problema.

iflare3g commented 5 years ago

Non mi piace che gli URL siano bloccati salvo eccezioni, perché non possiamo costruire una lista di tutti i domini buoni del web, né credo che possiamo richiedere l'intervento di un admin per ogni url non previsto. Condividere articoli, pagine di documentazione, esempi, e simile richiede inviare url. Non vedo una soluzione facile a questo problema.

Nemmeno io, per questo ho evidenziato il fatto che in @django qualsiasi user può fare /ban spam @messaggio , poi al massimo sta agli admins dare la grazia o meno in caso di richieste dall'utente bannato. Ma tanto se è pura spam, non si faranno più vivi. Non possiamo bloccare o controllare tutte le URL del web , come giustamente dici anche tu

MattiaFailla commented 5 years ago

Il discorso di whitelist/allowlist - blacklist/denylist mi sembra troppo restrittivo per l'uso dei link che facciamo sul gruppo (io in primis, che molto spesso condivido link di tutorial o altre versioni di documentazione da fonti diverse).

In tgbot, grazie ai moduli locks, warn, kick e ban manca solo l'integrazione della logica.. Per il resto i moduli funzionano e sono up-to-date.

Come suggerito da @iflare3g potremmo pensare ad una estensione del modulo warn in modo da fornire agli utenti un comando per evidenziare e bloccare gli spammers.

Fatemi sapere cosa ne pensate.

iflare3g commented 5 years ago

Anche perché così facendo, riusciamo indirettamente a creare una lista di user_id/link considerati spam e quindi è possibile poi implementare l'autoeliminazione da parte del bot , soprattutto per quanto riguarda i link, visto che lo user_id una volta bannano , se non erro, non può più entrare