Twitter-Bot

Really simple Twitter bot for educational purposes, written in Python, continually tested with Travis CI, deployed on Heroku.

1. Twitter

1.1 Account anlegen

Der Bot benötigt Zugang zu einem Twitter-Account

  • Falls ein bestehender Account verwendet werden soll: Schritt überspringen.

1.2 API Keys erstellen

Der Bot benötigt für den Zugriff auf Twitter API keys und tokens (statt Username und Passwort). Diese Token sind, wie Passwörter, geheimzuhalten. Alles, was du im GitHub-Repository hochlädst ist öffentlich!

  • Gehe auf https://apps.twitter.com/ und klicke auf Create New App
  • Bei "Website" eine beliebige gültige URL angeben (z.B. http://hpi.de), "Callback URL" kann leer bleiben.
  • Auf der Übersichtsseite der Twitter-Anwendung: Unter dem Tab "Keys and Access Tokens" findest du Consumer Key und Consumer Secret.
  • Nach einem Klick auf "Create my access token" weiter unten auf der Seite können Access Token und Access Token Secret abgelesen werden.
  • Speicher die 4 Schlüssel in einer Text-Datei oder lass das Browser-Tab offen während du weiterarbeitest.

2. Github

2.1. Account erstellen

2.2 Beispiel-Repository forken

Wir haben bereits einen Bot vorbereitet (https://github.com/hpi-swt2-exercise/py-twitter-bot, dieses Repository).

  • Mit dem “Fork” Knopf oben rechts kann ein eigene Kopie vom Projekt erstellt werden.

2.3 Github-Repository auf den Rechner clonen

Um die Dateien lokal zu bearbeiten und die Verbindung zu Github herzustellen, muss das Repository auf deinen Rechner mit git "geklont" werden. Grundsätzlich kann git entweder über die Kommandozeile (cmd) oder mit einer grafischen Oberfläche (GUI) nutzen. Auf den Rechnern ist die GUI "GitExt" installiert.

  • Unter “Clone or Download” auf der Github-Seite deines Projekts findest du die Git-URL, mit der du das Projekt auf deinen Rechner klonen kannst. (Der Download als Zip reicht nicht!)

  • Lege in deinem persönlichen Verzeichnis einen neuen Ordner an.
  • In diesem kannst du entweder über den Kommandozeilen-Befehl git clone https://github.com/DEIN_ACCOUNT/py-twitter-bot, oder über das Kontextmenü im Windows-Explorer (Rechtsklick -> GitExt clone) das Projekt klonen.

3. Projekt lokal einrichten

3.1 Abhängigkeiten installieren

Alle Abhängigkeiten des Twitter-Bots, d.h. aller Code aus Bibliotheken, sind in einer requirements.txt festgehalten. Diese müssen auf euren Rechnern installiert sein, damit der Bot funktioniert.

  • Im script Ordner liegt eine requirements.bat Datei, die die Abhängigkeiten unter Windows installiert. Ihr könnt es durch Doppelklick ausführen.

3.2 Twitter Credentials im Bot eintragen

  • Kopiere die Datei credentials.example.py und nenne die Kopie credentials.py. Zu deiner Sicherheit ist das Repository bereits so konfiguriert, dass diese Datei nicht hochgeladen wird.
  • Trage hier die Twitter Access Keys und Tokens aus Schritt 1.2 ein.
  • Starte das Skript run_bot per Doppelklick.
  • Die Ausgabe enthät einen Link auf den soeben gesendeten Tweet. Auf Twitter sollte ein Tweet erscheinen, der die aktuelle Uhrzeit enthält.

3.3 Die erste Änderung

Der Bot tweetet im Moment die Uhrzeit immer nach demselben Schema: "It is HH:MM:SS on a DAY." Wenn du möchtest, ändere was der Bot von sich gibt.

  • Öffne dazu die tweet_text.py in der "IDLE" Umgebung (Rechtsklick -> "Edit with IDLE"). IDLE ist eine Programmierumgebung für Python, der Programmiersprache des Bots.
  • Ändere den Inhalt der Variable text (Zeile 23), z.B. in

text = "Hallo HPI! Dies ist der Bot NAME"

  • Speichere deine Änderungen
  • Führe die twitter_bot.py aus (wiederum mit dem run_bot Skript) und schaue nach, ob der Bot nun anders twittert.
  • Versuche, deine Änderungen zu "committen" (GitExt commit...) und wieder nach GitHub zu Übertragen, sodass andere sie sehen können. Du musst deine GitHub-Anmeldedaten eingeben, damit GitHub dich identifizieren kann.

4. Travis CI

Als nächstes möchten wir Continuous Integration für das Projekt anlegen.

  • Gehe dazu auf http://travis-ci.org. Hier benötigst du keinen neuen Account, du kannst dich direkt über dein Github-Konto anmelden.
  • Aktiviere automatische Builds für dein Repository.

Wenn du das nächste mal eine Änderung "push"st (auf den Server bei Github überträgst), wird Travis dein Projekt automatisch erstellen. Um jederzeit den Build-Status sehen zu können, kannst du eine Badge auf deiner Projekt-Seite einbinden.

  • Klicke dazu in Travis auf die Badge, wähle als Format "Markdown" aus, und kopiere den Text in die README.md in deinem Projekt.

  • Commite nun deine Änderung:
    • GitExt (Rechtsklick -> GitExt Commit) zeigt die welche Änderungen du vorgenommen hast (siehe 1 und 2).
    • Stage (3) die geänderten Dateien damit die Änderung Teil des Commits ist.
    • Trage dann eine Commit-Nachricht ein (4), die die Änderungen zusammenfasst und bestätige den Commit (5).

Nach dem Commit kannst du die Änderung pushen und auf der Travis-Seite beobachten wie dein Projekt gebaut wird. Nachdem der Vorgang erfolgreich abgeschlossen wurde, kannst du die Projektseite auf Github neu laden. Die Badge sollte jetzt grün erscheinen.

5. Heroku

5.1 Account erstellen

Damit du deinen Twitter-Bot nicht immer per Hand ausführen musst, möchten wir ihn jetzt auf Heroku deployen. Heroku ist eine Plattform auf der Code kontinuierlich auf Servern ausgeführt werden kann.

5.2 Anwendung erstellen

  • Auf dem Heroku-Dashboard, klicke auf New und Create new app und erstelle eine neue Anwendung.
  • Unter Deploy wählst du “Github” als “Deployment Method”.
  • Verbinde deinen Github-Account und wähle das richtige Repository aus.

  • Setze das Häkchen bei “Wait for CI to pass before deploy” und klicke auf “Enable Automatic Deploys”.
  • Da automatische Deploys erst nach einem Push passieren, kannst du außerdem unter “Manual Deploy” auf “Deploy Branch” klicken um ein deployment (das übertragen des codes zum Server) anzustoßen.

Auch auf Heroku muss der Bot wissen, wie er sich bei Twitter anmelden kann. Damit die geheimen Daten nicht in einer Datei gespeichert werden müssen, kannst du sie direkt in Heroku konfigurieren.

  • Gehe auf das Tab Settings, klicke auf Reveal Config Vars und trage dort die 4 Access Keys / Tokens des Bots ein.

5.3 Anwendung auf Heroku starten

  • Damit der Bot tatsächlich ausgeführt wird, wechselst du nun auf das Tab Resources und aktivierst dort den Clock-Prozess.

Die logs, d.h. die Nachrichten, die der Bot schreibt, können im Heroku-Interface nachgelesen werden. Hier kannst du überprüfen, ob der Bot erfolgreichen starten konnte. Falls du noch einen Twitter-Account hast, schreibe ihm doch einfach mal “hi!”. In spätestens 10 Minuten solltest du eine Antwort bekommen.

6. Und noch viel weiter

Die verbleibende Zeit kannst du nutzen, um den Funktionsumfang deines Bots zu erweitern.

  • Öffne dazu die tweet_text.py in der IDLE. Tipp: wenn du den Bot testen möchtest, ohne jedes mal einen neuen Tweet zu senden, drücke F5 um die Python Shell zu öffnen.

  • Mit idle_text() und reply({'text': 'hi!', 'user': {'screen_name': 'Foo'}}) kannst du die Funktionen direkt testen.

  • Mit Alt + n und Alt + p musst du die Aufrufe nicht jedes mal neu schreiben.

Ein Cheatsheet für Python ist hier zu finden: link

Funktionen um mit Strings zu arbeiten gibt es hier

6.1 Externe Daten anfordern

Natürlich kann der Bot statt nur mit der Uhrzeit zu antworten auch beliebige andere Dinge tweeten. Insbesondere sollte er vielleicht mit der Außenwelt kommunizieren um weitere Daten zu erhalten. Solche Schnittstellen, die mit Programmen einfach nutzbar sind, heißen APIs (Application programming interface). Zum Beispiel könnten Chuck Norris Witze abgefragt und getweetet werden:

from requests import get
# Some more ideas: https://www.programmableweb.com/category/humor/api
data = get('https://api.chucknorris.io/jokes/random').json()
joke = data['value']
print joke

6.2 Zufall

Möglicherweise sollte der Bot nicht immer nach demselben Schema tweeten, sondern zufällig unterschiedliche Text tweeten. Dazu kann das random Modul von Python verwendet werden. Beispiel:

import random

# random() returns a floating point number in the range [0.0, 1.0)
if random.random() > 0.5:
    print('GROSS')
else:
    print('klein')

Build Status