Wie man Twitter-Spam (nicht) betreibt

08.02.2010 von Justus

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

  • Accountdaten von den zuvor angelegten Spam-Accounts
  • Die Satzbausteine, auf die reagiert werden soll („Signale“) in Verbindung mit den passenden Antworttweets.
  • Gefundene Tweets, die ein solches Signal enthalten.
  • Eine Liste mit Tweet-IDs (jeder Tweet hat eine eindeutige Nummer), um festzustellen welche Tweets man schon beantwortet hat und welche nicht.

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.

Aufbau meines Twitter-Spams

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

  • Der Spam war tatsächlich gar nicht schlecht getargetted. Sucht man mal nach Signal-Tweets, merkt man, dass echt viele eine Kaufintention haben. Sieht man auch an den Antworten, die die Spamaccounts bekommen. Viele, die den Bot als solchen erkennen, ihm aber trotzdem antworten, und ebenso viele, die sich für den hilfreichen Tip bedanken. Hier ein Beispiel von Antworten an einen der Spamaccounts: https://twitter.com/#search?q=%40unlimited23 Damit hätte ich nicht gerechnet!
  • Die CTR war echt gut – selbst wenn es ein Spamlink ist, die Leute klicken noch gerne
  • Meine Tweets waren ausschließlich auf Englisch und die Empfänger fast ausschließlich in den USA. Meine Client-Skripts aber waren ausschließlich auf deutschen Servern. Wie man sehen kann, haben aber aus Deutschland doppelt so viele Leute geklickt wie aus den USA. Wo haben die den Tweet gesehen? Real-Time-Suche? Twitter Trends? Ich habe keine Ahnung!
    Das wäre richtig interessant, da mal einen Test zu machen und von amerikanischen Servern zu twittern – kommen dann alle Klicks aus den US of A?
  • Twitter ist gar nicht dumm und erkennt Spammer besser als ich dachte. Wobei mein Spam auch wirklich simpel gestrickt war.
  • Um wirklich viel Tweet-Volumen aufbauen zu können braucht man viele Signale. Da reicht es nicht, nur auf Laptops, Kameras und Handys zu reagieren und wenn man die Sache ernsthaft angeht wird man nicht umhin kommen, das komplett zu automatisieren und vernünftige Produktlisten einzusetzen mit Modellnamen, etc. pp.
  • Gegenständliche Produkte haben meistens miese Provisionen. Amazon ist zwar ein toller Onlineshop, aber die Wahrscheinlichkeit, dass jemand wegen eines Spamtweets einen hochpreisigen Fernseher kauft, ist doch wirklich sehr sehr gering. Handyverträge, Kredite, Poker, es gibt genug zum experimentieren.
    Entsprechend mager waren meine Einkünfte. Obwohl ich teilweise mehrere tausend Tweets am Tag verschickt habe, war die Conversion so mies, dass ich manchmal rein gar nichts losgeworden bin und wenn, dann hielt es sich meistens bei kleinen Produkten bis 20$, die mit dem ursprünglich von mir beworbenen Produkt nichts zu tun hatten.
  • PHP ist eine tolle Sprache und curl extrem vielseitig.
  • Ausprobieren macht Spaß.

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