Zu unmenschlichen Zeiten schläft auch ein Bot!

Seit einer Weile schwirrt in meinem Kopf schon der Gedanke eines Twitterbots. Das ganze soll ähnlich wie Hootsuite funktionieren, allerdings wünsche ich mir noch ein paar individuellere Features, die mir Hootsuite nicht bieten kann / können wird. Alle die es nicht kennen, können sich hier das Hootsuite Review von Michael Gray reinziehen – und den Blog in den Feedreader aufnehmen ;-) Gut, nun wisst ihr, worum es geht.

Twittern kann mein Bot schon, dafür muss man nur eine TwitterApp registrieren, mal einen Abend die Doku der Twitter API durchlesen – die übrigens erstklassig dokumentiert ist – und die ebenfalls erstklassige Twitter OAuth Library von Abraham benutzen. Die Tweets werden dann aus der Datenbank gezogen und über die REST API zu Twitter gepusht.

Nun stellt sich nur noch die Frage, wie man den Bot twittern lässt, ohne das es unmenschlich aussieht, denn niemand hat Bock, einem Bot zu folgen. Ich weiß, dass jeder zweite Leser hier selbst einen automatisierten Twitter Account benutzt und es den meisten nicht auffällt, aber hey: für Conversions ist es wohl zu wenig, ein paar RSS Feeds durchlaufen zu lassen.

Bitte nur zwischen 06:00 und 24:00

Also twittert der Bot nicht ständig, sondern zu einer Zeit, in der Leute die Tweets auch lesen. Die Idee ging jetzt noch etwas weiter. Lassen wir den Bot doch ausschlafen und zeitig ins Bett gehen. Morgens und Abends twittert er also wesentlich seltener. Das Ziel ist jetzt klar. Aber die Umsetzung?

Crons

Als erstes habe ich einen Cron erstellt, der alle 10 Minuten zwischen 6:00 Uhr und 23:59 Uhr ein Shellskript ausführt. Eine kurze Erklärung, für alle die nicht über die Crons Bescheid wissen: Der Cron prüft jede Minute, ob ein Job, ein sogenannter Cronjob, auszuführen ist. Diese Cronjobs sind im Crontab eingetragen, jeder User besitzt seine eigene Liste an Cronjobs. Wie das bei Windoof ist und ob es das ein Komplement gibt weiß ich nicht – und es ist mir auch egal. :P Pro Zeile lassen sich 6 Optionen einstellen:

  • m – Minute : Zu welcher Minute der Stunde soll ein Cron ausgeführt werden? (0-59)
  • h – Stunde: Zu welcher Stunde des Tages soll der Cron ausgeführt werden (0-23)
  • dom – Day of Month: An welchem Tag im Monat soll der Cron… (1-31)
  • mon – Monat: In welchem Monat… (1-12)
  • dow – Day of Week: Und schließlich, an welchem Tag der Woche soll der Cron ausgeführt werden.

Einstellen kann man als Minute dann zum Beispiel 10 (zur zehnten Minute ausführen), verschiedene Werte mit Komma trennen (10,12,17,23 – zur zehnten, zwölften, 17. und 23. Minute), eine Range angeben (0-29, jede Minute der ersten halben Stunde) oder aller x Minuten ( */10 – Aller zehn Minuten). Letzte Option habe ich gewählt. Was der Eintrag bei den Stunden bedeutet, sollte euch jetzt auch klar sein. Ein “*” steht für immer. Schließlich erfolgt noch der Befehl, der ausgeführt werden soll. In meinem Fall wird ein Shellscript ausgeführt. Dieses muss natürlich vorher mittels chmod +x /home/netzaffin/crons/myawesometwitterbot/updateStatus.sh ausführbar gemacht werden.

 # m h dom mon dow command # SHELL=/bin/bash 10 6-23 * * * /home/netzaffin/crons/myawesometwitterbot/updateStatus.sh 

Jetzt kommt die Magie: Bashscripting

Zuerst wird die aktuelle Stunde mit Hilfe der Funktion date ausgewertet und in eine Variable gespeichert. Danach wird mit einer case Abfrage ausgewertet, wie wahrscheinlich das Skript zu einer bestimmten Zeit ausgeführt werden soll. So weit, so gut:


#!/bin/bash
#get current hour 
iHour=`date +"%H"` 
#get probability for executing the tweetscript by time 
case $iHour in 
 6|7) 
    iProbability=5 # set a 5% probability for tweets between 6:00 and 8:00 
 ;; 
 8|9|10) 
    iProbability=20 # set a 20% probability for tweets between 8:00 and 11:00 
 ;; 
 1[1-9]) 
     iProbability=50 # set a 50% probability for tweets between 11:00 and 20:00 
 ;; 
 20|21) 
     iProbability=20 # set a 20% probability for tweets between 20:00 and 22:00 
 ;; 22|23) 
     iProbability=5 # set a 5% probability for tweets between 22:00 and 0:00 
 ;; 
esac

Wenn übrigens jemand weiß, wie man 11|12|13|14|15|16|17|18|19) zusammen fassen kann… Immer raus damit. 11-19 ging jedenfalls nicht. Danke Matthias! Nachdem die Wahrscheinlichkeiten für die Zeiträume festgelegt sind, benötige ich noch eine weitere Zufallszahl, um zu prüfen, ob der Wert auch wirklich in dem Wahrscheinlichkeitsbereich liegt. Also erstelle ich mir eine weitere Zufallszahl – 1 bis 100 – und prüfe, ob iProbability kleiner als meine neue Zufallszahl ist. Wenn ja, soll das PHP Script zum twittern ausgeführt werden. Aber halt. Auch den nicht Mathematikern fällt da etwas auf, denn das sind doch ein paar Tweets zu viel…

So viele Tweets wären auch den Junkies nicht zumutbar...

So viele Tweets wären auch den Junkies nicht zumutbar...

Da mir aber ein Tweetvolumen von 3-4 Tweets am Tag vorschwebte, habe ich meine Wahrscheinlichkeitszufallszahl einfach um den Faktor 10 multipliziert. Haben wir halt Promille, statt Prozente. Damit kennen wir uns sowieso besser aus ;-)

 # get random number for probability check iRandom=$(($RANDOM % 1000 + 1)) # if probabilty > random, execute the tweet if [ $iProbability -gt $iRandom ]; then # but first, wait some seconds (up to 9.5 minutes) iRandomSleep=$(($RANDOM % (9*60)+30 )) sleep $iRandomSleep # then curl the php script to execute url='http://myawesometwitterbot.com/tweet.php' curl -s "$url" >> /dev/null # and save the logfile echo `date`': update status for '$1 >> /home/netzaffin/crons/myawesometwitterbot/log fi 

Dieses Stück Bashcode einfach noch hinten dran. Was euch auch noch aufgefallen sein könnte, ist der sleep Befehl. Ich warte also eine zufällige Zeit ab, damit die Tweets nicht immer nur zu jeder xten Minute erscheinen, sondern tatsächlich kein Muster zu erkennen ist.

Das war auch schon fast alles. Probehalber habe ich das Skript mal in eine Schleife mit 3348 Durchläufen gepackt (31 Tage zu je 108 Aufrufen (Anzahl pro Tag)). Die Verteilung, die sich daraus ergab, sieht so aus:

Verteilung der Tweets durch den Twitterbot

Verteilung der Tweets durch den Twitterbot

Ich denke, das sollte als Anregung genügen. Wenn du Ideen hast, was mein Twitterbot alles können sollte, freue ich mich über deinen Kommentar.

Patrick

3 Kommentare

  1. Bei Windows kannst du den Taskplaner nutzen. Der macht im Endeffekt das gleiche nur halt mit ein paar Klicks :)

    Aber eine andere Herangehensweise:
    Warum lässt du den Bot nicht permanent laufen und er entscheidet dann per Zufall wann er einen Tweet absetzt?

    ala:
    //6:17
    if(TIME_TO_TWEET && TWEETCOUNTER<MAXTWEETSPERDAY)
    if(rand(0,1)==1)TWEET;TWEETCOUNTER++;

    Spart man sich die "Arbeit" für die Cronjobs und man könnte auch variieren sodass an einem Tag 2 am nächsten 5 darauf 4 usw an Tweets gesendet werden.

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.