Wie ich neulich Spam aut Twitter loswurde

16. Mai 2014


Ich habe von Zeit zu Zeit auf Twitter ein ganz klassisches Problem: Spam.

Twitter Spam

Diesen loszuwerden ist sehr ätzend, besonders wenn man, so wie ich, nur das Webinterface benutzt. Dort muss man jeden Tweet einzeln anklicken und auf "Block User" gehen. "Das geht doch sicher besser", dachte ich mir.

Geht auch besser - mit dem in Ruby geschriebenen Konsolentool " t ".

Das Tool erlaubt einen sehr flexiblen Zugriff auf alle Twitter-Daten. Zuvor muss man noch eine Authentifizierung vornehmen und einige Tokens über die Twitter-Api generieren. Aber das ist halb so wild und "t" hilft einem auch dabei.

Der folgende Befehl gibt Zugriff auf alle Nachrichten, die öffentlich sind und in denen mein Name vorkommt:

$ t mentions

Genau das trifft auf den Spam ja zu. Dieser ist immer direkt an mich gerichtet. Leider kann ich nun nicht einfach alle diese Nachrichten blockieren - immerhin bekomme ich ja auch sinnvolle Nachrichten auf diesem Wege übermittelt. Auffällig ist das Muster, das die Spammer verwenden um das Spam-Schlagwort "followers" zu obfuskieren. Einfach ein paar Punkte dazwischenmogeln - schon kann man automatisch spammen, wie es scheint. Aber das kann ich auch rumdrehen:

$ pattern=$(python -c "print '\\.?'.join([c for c in 'followers']) + '?'")

Der Code ist simpel. Er führt direkt ein Python Kommando aus. Dieses trennt alle Buchstaben des Wortes followers heraus und setzt es wieder zusammen, indem \.? dazwischen geklebt wird. Das so entstehende Muster wird einfach ausgegeben und in einer Variable namens pattern in der aktuellen Shellsitzung gespeichert:

$ echo $pattern
f\.?o\.?l\.?l\.?o\.?w\.?e\.?r\.?s?

Inhaltlich steht da lediglich: "followers" oder "follower" - und hinter jedem Buchstaben kann ein Punkt stehen oder auch nicht. Mit diesem Pattern bewaffnet gehe ich nun auf die Jagd.

$ t mentions -n 100 -l -r > spam.txt

Zuerst packe ich die letzten 100 Mentiones tabellarisch in eine Datei namens spam.txt . Die Operation dauert etwas länger und ich möchte erstmal rumprobieren, daher speichere ich das Ergebnis in der Datei zwischen. Danach kann ich mit Hilfe des Patterns die entsprechenden Einträge suchen.

$ cat spam.txt | grep -E $pattern

4...0  May 16 21:59  @fl...m5  ... gain some extra fo.llo.wers
4...1  May 16 21:59  @Cr...an  ... gain some extra fo.llo.wers
4...8  May 16 21:59  @gu...Wi  ... gain more fo.llo.wers
4...0  May 16 21:59  @ch...vi  ... get f.ol.lo.wer
4...2  May 16 21:59  @mo...ua  ... get more f.ol.lo.wer

Bei mir hat das Pattern geholfen und ich hatte nach diesem Schritt nurnoch Zeilen mit Spam übrig und keine echten Personen. Gegebenenfalls sollte das Pattern aber hier verfeinert werden, damit keine echten Follower blockiert werden.

Danach filtere ich die Benutzernamen heraus. Dazu habe ich mir das tabellarische Output zunutze gemacht:

$ cat spam.txt | grep -E $pattern | cut -d " " -f -7

@flang...tm5
@Cross...ian
@guvac...rWi
@chich...Avi

Und die schicke ich jetzt an t zum blockieren:

$ cat spam.txt | grep -E $pattern | cut -d " " -f 7 | xargs t block
Run `t delete block @flang...tm5 @Cross...ian @guvac...rWi @chich...Avi ...
to unblock.

Sehr nett, t , aber das werde ich sicher nicht tun.

Das gesamte script ist also:

p=$(python -c "print'\\.?'.join([c for c in 'followers'])+'?'")
t mentions -n 100 -l -r > spam.txt
cat spam.txt | grep -E $p | cut -d " " -f 7 | xargs t block