Heute geht es um SocialPy, einem kleinen Python-Paket von mir, dass Informatikern das Interagieren mit sozialen Netzwerken vereinfachen soll. In dem Beispiel geht es um das automatisierte Veröffentlichen von Beiträgen.
Soziale Netzwerke
Soziale Netzwerke sind heutzutage so populär wie nie zu vor und der Trend scheint auch in nächster Zeit nicht abzuflachen. Inzwischen sind soziale Netzwerke nicht nur ein Zeitvertreib für den normalen Bürger, sie werden auch immer mehr kommerziell genutzt. Viele Geschäftsmodelle stützen sich auf soziale Netzwerke und nutzen diese für ihr Marketing-Aktionen und um mit ihren Kunden zu interagieren. Auch gibt es inzwischen diverse Firmen die sich hauptsächlich mit der Beratung im Bereich Sozial Media Marketing bewegen. Mit steigendem Interesse an Sozialen Netzwerken, steigt auch die Nachfrage an zusätzlichen Tools, um mit den Netzwerken einfach zu interagieren.
Um das Leben von Informatikern, Data Scientist, Analysten, FBI, etc. einfach zu machen, haben fast alle großen Netzwerke eine Programmierschnittstelle (API). Die API ermöglicht es Software zu schreiben, die mit dem Netzwerk interagiert. Allerdings gibt es nicht eine einheitliche API, sondern sehr viele verschiedene Methoden. Um das Ganze ein bisschen zu strukturieren, habe ich ein Python Paket geschrieben, bzw. Angefangen es zu schreiben.
SocialPy
Die meisten APIs benötigen irgendeine Form der Authentisierung, ein Passwort, ein Key oder Token. SocialPy sammelt diverse APIs mit deren Parametern und Funktionen an einer Stelle. Um nun automatisiert mit sozialen Netzwerken zu interagieren, können eigene Skripte geschrieben werden, die sich nur auf die speziellen Aufgaben konzentrieren. Die allgemeinen Aufgaben werden von SocialPy übernommen. Im Wesentlichen habe ich SocialPy geschrieben, um meine Aufgaben zu automatisieren, es kann aber auch für viele andere Aufgaben verwendet werden.
Neben dem verwalten der API’s, hat SocialPy auch eine integrierte Datenbank um Beiträge zu speichern. Über ein einfaches Web-Frontend können die Beiträge verwaltet werden. Dabei handelt es sich um ein angepasstes Django Projekt. Für die Datenhaltung wurde nicht besonders stark auf die Sicherheit geachtet, da es sich nur um eine lokale Anwendung handelt. Wer mehr über SocialPy wissen will, kann sich hier um gucken. Es befindet sich allerdings noch in der Entwicklung. Daher beschränke ich mich heute auch erstmal nur auf Twitter. Facebook und Instagram sind zwar auch schon in SocialPy integriert, wurden aber noch nicht ausreichend getestet.
Das Setup
Fangen wir an. Als erstes erstelle ich mir einen neuen Twitter Account. SocialPy ist ein Python Paket, also benötigen wir eine aktuelle Version von Python. Die gibt es hier, sowohl für Linux als auch für Windows. Danach installieren wir ganz einfach SocialPy:
pip install socialpy
Um die Twitter-API nutzen zu können, benötigen wir insgesamt 4 Keys. Diese können aber ganz einfach mit dem folgenden Python-Skript erstellt werden.
from tweepy import OAuthHandler, TweepError import webbrowser from socialpy import SOCIALPY_KEY_FILE from socialpy.funcs import check from socialpy.client import Gateway check(create=True) # Mit dem Token für meine App den Auth-Handler erstellen consumer_token = 'kYdbvAGXIhWGHyNKdNTssfpzE' consumer_secret = 'MM2EVucINNxfFEB0akTenqConUnucj9FaS4hMX1F7wEw5WDvD1' auth = OAuthHandler(consumer_token, consumer_secret) # Öffnet einen Browser zur Bestätigung der App try: redirect_url = webbrowser.open(auth.get_authorization_url()) except TweepError: print('Error! Failed to get request token.') exit() #Auf die Eingabe des Pins warten pin = input('Verification pin number from twitter.com: ').strip() token = auth.get_access_token(verifier=pin) kwargs = { 'ckey': consumer_token, 'csecret': consumer_secret, 'akey': auth.access_token, 'asecret': auth.access_token_secret, } # Das Gateway erstellen und die Keys laden gateway = Gateway(keyfile=SOCIALPY_KEY_FILE) gateway['twitter'].setup(**kwargs) gateway.save_to_file(SOCIALPY_KEY_FILE)
Das Skript hat automatisch dafür gesorgt, dass SocialPy die Keys importiert. Es wird über deinen Browser geöffnet und fordert dich auf die Anwendung freizugeben. Bestätigt du das, wird dir ein Pin im Browser angezeigt. Diese musst du dann in der Konsole eingeben.
Damit sind wir für das Posten auf Twitter bereit. Das gleiche Skript wir allerdings auch schon bei der Installation von SocialPy bereit gestellt. Daher kannst du auch alternativ einfach den folgenden Befehl ausführen:
socialpy-twitter-setup
SocialPy kann ganz bequem über den Terminal bedient werden. Mit dem folgenden Befehl postest du den Text „Hallo, ich bin #SocailPy“:
python -m socialpy.client post --text "Hallo, ich bin #SocialPy"
Die Beiträge
Weiter geht’s, wir brauchen noch unsere Beiträge. Dafür verwenden wir den Daten-Server von SocialPy. Bevor wir den Daten-Server verwenden können, muss dieser initialisiert werden. Der Server wurde allerdings schon mit dem vorherigen Skript eingerichtet, daher können wir uns den Befehl auch sparen und gleich den Server starten.
python -m socialpy.server run
Jetzt kannst du einfach auf http://127.0.0.1:8000/data/post/ gehen und Beiträge anlegen.
Falls du den Server doch noch initialisieren musst, hilft dir folgender Befehl:
python -m socialpy.server setup
Die Beiträge kannst du dir auch in der Konsole anzeigen lassen.
python -m socialpy.data show
Tauscht du ’show‘ gegen ‚post‘ aus, werden alle angezeigten Beiträge veröffentlicht. Mit diversen Filtereinstellungen kannst du dafür sorgen, dass nur das Richtige angezeigt wird. Mit:
python -m socialpy.data show --limit 1
wird zum Beispiel nur ein Beitrag angezeigt. Wird ein Beitrag veröffentlicht, wird er automatisch nicht mehr als neu markiert und so auch nicht mehr angezeigt. Probieren wir das nun einfach aus.
python -m socialpy.data post --limit 1
Und das wars schon. Jedes Mal wenn wir dieses Kommando ausführt wird, wird ein Beitrag auf Twitter veröffenlicht. Damit wir nicht jedes Mal in dem Terminal dieses Kommando eingeben müssen, schreiben wir uns noch ein kleines Skript.
Das finale Skript
Im Prinzp ist es egal was für ein Skript du hier schreibst. Das könnte ein ganz einfaches Shell-Skript sein. Aber ich möchte an dieser Stelle zeigen, wie man SocialPy auch als Python-Module benutzen kann. Daher habe ich das folgendes Python-Programm geschrieben:
from socialpy import SOCIALPY_KEY_FILE
from socialpy.client import Gateway
from socialpy.data import Post
import time, random, datetime
# Nur auf Twitter posten
networks = ['twitter']
# Das Gateway erstellen und die Keys laden
gateway = Gateway(keyfile=SOCIALPY_KEY_FILE)
gateway.clear(networks)
# Die Endlosschleife starten
while True:
# Nur am Tag posten, zwischen 6:00 und 21:00
now = datetime.datetime.now().time()
if datetime.time(6, 0, 0) < now and now < datetime.time(21, 0, 0):
# Aus der Datenbank einen zufälligen Beitrag finden
post = Post.objects.filter(status='new').order_by('?').first()
if post:
# Nur eine Statusmeldung für den Log
print(datetime.datetime.now(), 'post:', post.id, post.text[:40])
# Den Beitrag veröffentlichen
gateway.post(text=post.text)
# Und auch in der Datenbank als veröffentlicht markieren
post.publish(networks)
else:
# Wenn es keine Beiträge mehr gibt
print(datetime.datetime.now(), 'no posts available')
# Jetzt nur noch ein bisschen warten, 1 bis 2 Stunden
wait = 60 + 60 * random.random()
print(datetime.datetime.now(), 'wait:', round(wait))
time.sleep(3600 * wait)
Im Wesentlichen ist es eine Endlosschleife die sich einen zufälligen Beitrag aus der Datenbank holt und diesen dann über das Gateway veröffentlicht. Hier muss jedoch darauf geachtet werden, dass der Beitrag als veröffentlicht markiert wird. Die Wartezeit zwischen zwei Veröffentlichungen ist nicht fest, sondern eine zufällige Zeit zwischen ein und zwei Stunden.
Jetzt kannst du einfach das Skript starten und deine Beiträge werden auf Twitter veröffentlicht.
python run.py
Das war das
Wie du siehst brauchen wir nicht mal 40 Zeilen um einen einfachen Twitter-Bot zu schreiben. Die Datenbank von SocialPy ermöglicht es dir auch Kategorien zu vergeben und nach diesen zu filtern. Damit könntest du zum Beispiel morgens andere Beiträge veröffentlichen als abends. Durch die Konsolen-Befehle kannst du auch ganz bequem über den Terminal mit sozialen Netzwerken interagieren. Mein Ziel ist es, SocialPy so flexibel wie möglich zu gestalten und jeder soll es ohne großen Aufwand verwenden können.
In Zukunft wird es noch weitere Beispiele für SocialPy geben und hoffentlich kann SocialPy bald auch mit mehreren Netzwerken arbeiten.