Justus Blümer

Wie man Twitter-Spam (nicht) betreibt

Wer mir noch bis vor Kurzem auf Twitter folgte, hat vielleicht gemerkt, dass er das jetzt nicht mehr tut. Das passiert nämlich, wenn Twitter einen Account sperrt („This account ist suspended […]“): Keine Follower mehr, die eigene Following-Liste wird gelöscht und bis auf den Accountinhaber kann niemand die Twittertimeline des Accounts aufrufen ohne von der Nachricht über die Accountsperrung gestoppt zu werden.

Das ist mir Anfang Februar passiert. Nicht ganz ungerechtfertigt:

Ich habe auf Twitter gespammt. Bei weitem nicht so viel wie die Großen, aber doch durchaus ein bisschen. Während sich andere riesige Accounts aufbauen, indem sie automatisch irgendwelchen Accounts followen und un-followen, um damit die wenigen echten Follower, die sie damit „nebenbei“ sammeln mit Werbung vollzutexten oder Werbedienste auszunehmen, oder die Real-Time-Search mit ihren Affiliate-Links zu füllen, habe ich mich am klassischen @reply-Spam versucht. Jemand schreibt einen Tweet, mein Bot antwortet mit „@username blablablabla http://link.com“.

Die Motivation dahinter war auszuprobieren wie die API funktioniert, wo die Limits sind, wie und wann Twitter den Spam erkennt und wie viel (wenn überhaupt) man damit verdienen kann.

Theorie

Monetarisieren wollte ich den Spam über Amerikanische Amazon-Affiliate-Links. Amerikanische deshalb, weil Twitter in Deutschland bei der breiten Bevölkerung noch keine wirklich nennenswerte Verbreitung hat. Ein Tweet à la

„Oh, need a new laptop? Amazon’s got some good offers http://bit.ly/cX3oxI“

und fertig ist die Kiste. Die Leute klicken auf den Link und wenn sie in den Laptop-Suchergebnissen nichts finden, stoßen sie vielleicht auf irgendwas anderes was sie noch brauchen. Mit 5% Provision und 24 Stunden Cookie-Lifetime nicht der Renner, aber für’s Erste einfach umzusetzen und jeder kennt und vertraut Amazon.

Zunächst habe ich mir überlegt wie man möglichst effektiv spammen kann, mit hoher CTR & hoffentlich einer vernünftigen Conversion. Deswegen und auch in Anbetracht der gegebenen Limits (mehr dazu weiter unten), sollte man die Tweets so gut wie möglich targetten. Man könnte nach Tweets suchen, die ein Stichwort (z.B. „laptop“) enthalten und mit einem Link zu Laptop-Angeboten antworten, aber da nur sehr wenige der dabei gefundenen Tweets mit einer Kaufintention verbunden sind und eine Spamantwort darauf null Erfolgsaussichten hätte, muss man die Suche verfeinern.
Sucht man nach Keyphrases wie „get a laptop“,“buy a laptop“,“need a laptop“ aber auch „laptop is broken“ usw., liefert das Tweets, die zu rund 70-80% tatsächlich aussagen, dass der Twitterer gerne einen neuen Laptop hätte – es lohnt sich also zu antworten. Der zweite Effekt ist, dass die Antworten oftmals nicht als Spam wahrgenommen werden, weil sie so gut getargetted sind. Das resultiert in weniger Spamreports und einem geringeren Risiko dass ein Account gemeldet und gesperrt wird.

Die Limits

Twitter hat eine tolle und einfach bedienbare API, aber sie hat Einschränkungen. Pro Account und IP kann man sie höchstens 150 mal pro Stunde aufrufen. Um nicht aufzufallen, darf man es nicht übertreiben. Ein Tweet pro Minute ist denke ich noch im Rahmen, die Accounts bleiben nicht bemerkenswert länger bestehen wenn man nur alle zwei Minuten eine Nachricht zwitschert. Weniger als das macht wenig Sinn, weil man dann wesentlich mehr Accounts braucht, um ein brauchbares Tweet-Volumen zu erreichen.

Auf jeden Fall zu unterlassen: 100 Tweets innerhalb von 30 Sekunden. Bei solchen Extremen springt sofort der Filter ein und der Account wird automatisch abgeschaltet. Wie viel Automatisierung dahintersteht wenn ein Account 3 Tage überlebt und dann auf einmal gekillt wird, ist schwer zu schätzen, baut aber wohl hauptsächlich auf Spam Reports auf, jedenfalls wurden Accounts immer innerhalb von ein paar Stunden gesperrt sobald eines der Spamopfer antwortete, er habe den Account gemeldet.

Aufbau

Das ganze beruht auf einfachen PHP-Skripten und Cronjobs, das heißt die Skripte wurden automatisiert einmal pro Minute aufgerufen. Die API habe ich über die curl-Befehle, die PHP anbietet, aufgerufen. Dank der besagten Limits pro IP und Account muss man verteilt arbeiten und von verschiedenen IPs aus senden. Das erledigen die Clients.

Ein Client besteht aus einem einfachen PHP-Skript, das man zwecks IP-Diversität bei möglichst vielen Webhostern hochlädt. Dann einfach die Adressen zu den Skripten in die Cronjob-Liste (crontab) eintragen und sie minütlich aufrufen lassen. Idealerweise trägt man die Cronjobs auf einem Server ein der rund um die Uhr läuft, ich habe dazu den vServer Bronze von netcup benutzt, speed- und performancetechnisch kann man für 4 Euro im Monat nicht meckern. Wenn man dann eine gewisse Menge solcher Clients hat, wird es irgendwann unübersichtlich und damit man nichts mehr an ihnen ändern muss, macht man sie simpel. Sie tragen dazu die Adresse eines zentralen Servers (gleich mehr dazu) in sich, können von dort Daten abfragen und Tweets posten, mehr nicht.

Der Server, auch nur ein PHP Skript, das automatisch aufgerufen wird, ist das eigentliche Hirn des Spamprogramms. Zum Speichern von Daten habe ich eine MySQL Datenbank benutzt und zwar für

Das Server-Skript sucht – auch über die API – nach Tweets, die Signale erhalten. Schreibt jemand

„omg i t0ld my cousin to get a laptop, srsly hes such a douche n should rathr buy an iPad lawlz^^“

oder

„Mmmh damn it, my laptop is broken, I want to buy a really expensive new one on Amazon like right now“

dann wird der Tweet (inklusive ID und Absender) in der Datenbank gespeichert.

Wenn nun eine Minute vergangen ist und der Cronjob ein Client-Skript aufruft, stellt es eine Verbindung zum Server-Skript her. Das Server-Skript sendet einen Fetzen XML an den Client. Das sieht etwa so aus:

<user>
<username>douchyDork76</username>
<password>legendary</password>
</user>
<tweet>
<answerTo>ActuallyNPH</answerTo>
<answerToID>8564898333</answerToID>
<answer>Oh, need a new laptop? Amazon’s got some good offers http://bit.ly/cX3oxI</answer>
</tweet>

Sicherheitstechnisch nicht das Gelbe vom Ei, aber es sind ja ohnehin nur Spamaccounts. Dadurch werden die Clients von den Accounts entkoppelt und wenn ein Account gesperrt wird, löscht man ihn eben aus der Datenbank mit den Accountdaten. Das habe ich immer per Hand gemacht, einfach alle zwei Tage mal durchgehen was noch läuft und was nicht, könnte man aber auch leicht automatisieren.

Die übermittelten Daten benutzt der Client dann, um den Tweet abzusetzen.

Auch wenn man es anders regeln könnte, ich bin immer dabei geblieben, immer nur mit einem Account von einer IP zu zwitschern, alles andere sähe ziemlich unmenschlich und damit spammy aus.

Und das ist es, gar nicht kompliziert.

Warum habe ich aufgehört?

Weil mein normaler Twitter-Account (@justusbluemer) gesperrt wurde. Erklären kann ich mir das nur so: Ich hatte, während ich frische Spamaccounts erstellt habe, immer Tweetie offen, also einen ganz normalen Client der ganz legitim minütlich nach neuen Nachrichten gesucht hat. Als dann eine gewisse Zahl meiner Spamaccounts gesperrt waren haben Sie sich wohl die IPs angeschaut und haben gemerkt, dass @justusbluemer die gleiche IP hat, die auch ständig Spam-Accounts registiert. Ärgerlich und auch nach mehrfachen hin und her mit dem Support wollte man meinen Account auch nicht wieder entsperren. Immerhin habe ich wenigstens den Accountnamen wieder. Beim gesperrten den Namen & die EMail-Adresse ändern, einen neuen mit den selben Daten registrieren und gut ist.

Fand ich frustrierend und habe mir gesagt ich stecke meine Zeit lieber in sinnvollere Aktivitäten.

Beobachtungen

Über einen ganz unspammigen Tweet über diesen Artikel und über neue Follower für @justusbluemer würde ich mich sehr freuen!