Twitter eBooks Bot auf Uberspace

Wie ich hier bereits schrieb, habe ich vor kurzem einen Twitter Bot auf meinem Uberspace aufgesetzt. Dieser Post soll nun als kurz gefasstes, auf uberspace maßgeschneidertes How-To dienen.

Shell Befehle fangen mit > an.

Basics

Bevor es losgehen kann muss der Uberspace erstmal vorbereitet werden.

1. Ruby einrichten
Wie das geht steht im Uberspace Wiki. Es sollte mindestens Version 2.1 sein. Hier muss zwingend Version 2.1 ausgewählt werden.

2. Ruby Gems immer ins Nutzerverzeichnis installieren.

> touch ~/.gemrc
> echo "gem: --user-install --no-rdoc --no-ri" > ~/.gemrc

3. Bundler installieren

> gem install bundler

Twitter Accounts einrichten

Der eigene Account soll als Datenquelle für den Bot dienen. Der Zugriff erfolgt über die Twitter API. Damit das funktioniert muss eine App angelegt werden.

1. Eigenen Account vorbereiten

  1. Mail-Adresse und Handynummer bei Twitter hinterlegen und bestätigen.
  2. Unter https://apps.twitter.com/ eine App anlegen.
  3. Auf der Seite der neu angelegten App unter Keys and Access Tokens das Access Level auf Read-only stellen und Access Token und Token Secret generieren lassen
  4. Access Token und Access Token Secret notieren
  5. Die Handynummer wieder vom Account entfernen

2. Bot Account einrichten

  1. Neuen Twitter Account für den Bot anlegen
  2. Mail-Adresse und Handynummer hinterlegen und bestätigen.
  3. Unter https://apps.twitter.com/ eine App anlegen.
  4. Auf der Seite der neu angelegten App Access Token und Token Secret generieren lassen
  5. Consumer Key, Consumer Secret, Access Token und Access Token Secret notieren

Bot einrichten

Auf dem Uberspace:

1. Sourcen holen

> cd ~
> git clone https://github.com/mispy/ebooks_example.git twitter_bot

Der Twitter Bot verlangt explizit Ruby 2.1.3. Zum Zeitpunkt dieses Tutorials ist die aktuellste 2.1er Version auf Uberspace allerdings 2.1.6. Der Bot funktioniert auch mit dieser Version prima, allerdings muss dafür das Gemfile angepasst werden.

> cd twitter_bot
> nano Gemfile

Hier muss jetzt ruby '2.1.3' durch ruby '2.1.6' ersetzt werden. Anschließend kann der Bot mit folgendem Befehl installiert werden:

> bundle install
> gem install twitter_ebooks

2. Bot konfigurieren

> nano bots.rb

Alles was ich mit # <-- gekennzeichnet habe muss entsprechend des Kommentars angepasst werden:

...

def configure  
  # Configuration for all CloneBots
  self.consumer_key = "" # <-- Consumer Key der Bot App eintragen
  self.consumer_secret = "" # <-- Consumer Secret der Bot App eintragen
  self.blacklist = ['kylelehk', 'friedrichsays', 'Sudieofna', 'tnietzschequote', 'NerdsOnPeriod', 'FSR', 'BafflingQuotes', 'Obey_Nxme']
  self.delay_range = 1..6
  @userinfo = {}
end

...

def on_startup  
  load_model!

  scheduler.cron '0 0 * * *' do # <-- Wie oft soll der Bot twittern? In crontab Syntax (http://troubadix.dn.fh-koeln.de/unix/cronjobs_syntax.html)
    # Each day at midnight, post a single tweet
    tweet(model.make_statement)
  end
end

...

CloneBot.new("") do |bot| # <-- Twitter Handle des Bots eintragen  
  bot.access_token = "" # <-- Access Token der Bot App eintragen
  bot.access_token_secret = "" # <-- Access Token Secret der Bot App eintragen

  bot.original = "" # <-- Twitter Handle des Accounts eintragen, der als Datenquelle dienen soll
end  

Speichern und Editor schließen.

3. Bot mit Daten füttern

Bei nachfolgenden Befehlen [twitter handle] durch den Twitter Handle des Accounts ersetzen, der als Datenquelle dienen soll.

> cd ~/twitter_bot
> ebooks archive [twitter handle] corpus/[twitter handle].json

Beim ersten Mal werdet ihr jetzt nach Access Token und Access Token Secret gefragt.

> ebooks consume corpus/[twitter handle].json

Testlauf mit

> ebooks start

Wenn keine Fehler auftreten kann es weiter gehen.

4. Service einrichten

Damit der Bot immer läuft, richten wir einen Service für ihn ein.

> cd ~
> test -d ~/service || uberspace-setup-svscan
> uberspace-setup-service twitter_bot ebooks start
> sed -i -e 's/exec/cd ~\/twitter_bot\/\nexec/' ~/service/twitter_bot/run
> svc -u twitterbot

Es lebt!

Ab jetzt wird der Bot im eingestellten Intervall einen Tweet auf die Menschheit loslassen.

5. Automatische Updates einrichten

Damit die Quellen immer auf dem neuesten Stand sind, ist noch etwas Nacharbeit nötig.

> cd ~/twitter_bot

Jetzt wird es etwas tricky. Das Updatescript habe ich für meinen Uberspace geschrieben. Ich bin mir nicht sicher, ob die Pfade und Versionsnummern bei anderen Maschinen abweichen. Deswegen muss das erst überprüft werden. In der Shell muss dafür folgendes nacheinander ausgeführt werden. Das Ergebnis gibt den jeweiligen Pfad auf dem System an.

> which ebooks
> which svc

Nun kann das Shellscript angelegt werden.

> nano update.sh

Die usernames in den eckigen Klammern und eventuell die Pfade müssen angepasst werden.

#!/bin/bash
cd /home/[uberspace username]/twitter_bot/  
/usr/local/bin/svc -d /home/[uberspace username]/service/twitter_bot
/home/[uberspace username]/.gem/ruby/2.1.0/bin/ebooks archive [twitter handle] corpus/[twitter handle].json
/home/[uberspace username]/.gem/ruby/2.1.0/bin/ebooks consume corpus/[twitter handle].json
/usr/local/bin/svc -u /home/[uberspace username]/service/twitter_bot

Nach dem Speichern das Shellscript noch ausführbar machen:

> chmod +x update.sh

Ein kurzer Test, ob auch alles funktioniert:

> ./update.sh

Zum Abschluss noch einen Eintrag in der Crontab, damit das Script automatisch ausgeführt wird:

> crontab -e

Hier jetzt das Script eintragen. Den Zeitpunkt für das Update habe ich bei mir auf 5 Uhr festgelegt. Der Eintrag sieht dann wie folgt aus:

0 5 * * * /home/[uberspace username]/twitter_bot/update.sh  

Nur noch abspeichern und fertig. 🎉

In diesem Zustand twittert der Bot aus den Quell-Tweets zusammengesetzte Nachrichten. Ich habe mir noch ein Plugin geschrieben, welches Bilder aus den Tweets nimmt und diese verfremdet. Sobald ich den Code aufgeräumt und veröffentlicht habe kommt dazu auch noch ein kurzes how-to.