Nachdem ich schon in einigen Beiträgen beschrieben habe wie einfach man den Kurzmessenger Telegram mit Python ansteuern kann (hier, hier) wollte nun jemand den Programmcode meines Programmes haben welches automatisch mit einem Bot eine Telegram Nachricht schickt wenn ein Tor im Fußball fällt. Na dann…
Zuallererst solltet ihr in diesem Beitrag nachlesen wie ihr einen Bot erzeugt und für diesen ein Token bekommt. (Ich finde jetzt gerade keine Quelle, aber ich hatte mal gelesen dass das Wort ‚Token‘ aus den Anfangszeiten der Eisenbahn kommt. Bei eingleisigen Strecken gab es einen Holzstab (den Token) und nur derjenige Lokführer welcher diesen Stab hatte durfte die Strecke fahren. Somit wurden Zusammenstöße verhindert.)
Und dann braucht ihr eigentlich nur den Programmcode. Ich bin mir nicht ganz sicher wie die Nutzungsbedingungen des RSS-Feeds von „xxcker.de“ sind, meinen Recherchen nach sollte man diesen aber privat nutzen können. Ärger gibt es Selbstverständlich wenn man das ganze kommerziell nutzt.
Ich frage den RSS Feed schon seit Jahren minütlich ab und habe bisland noch keine Probleme bemerkt. Und ja: Man könnte die Abfrageip mir zuordnen.
Jedenfalls habe ich die Website die ich abfrage unkenntlich gemacht. Ich denke selbst wenn man kein Fußballfan ist sollte man hier trotzdem sofort erkennen wo es hingeht 🙂
#!/usr/bin/python # -*- coding: utf-8 -*- # Dieses Python2 Programm liest einen RSS-Feed in dem die Ergebnisse des 1.FC Nuernberg vorkommen, # sodann prueft es ob sich hier etwas veraendert hat und schreibt eine Telegram-Nachricht wenn dem so ist. # Die Adressen der RSS-Feeds sind: # 1. Bundesliga: http://rss.xxcker.de/live/bundesliga # 2. Bundesliga: http://rss.xxcker.de/live/2bundesliga # Und so sieht der Teil des Feeds aus der uns interessiert: ###<item> ###<title>Schalke - 1. FC Nürnberg 4:1 (2:0)</title> ###<link>http://www.xxcker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2013-14/34/1895172/spielanalyse_fc-schalke-04-2_1-fc-nuernberg-81.html#omrss_live_bundesliga</link> ###<description><![CDATA[Schalke erreicht nach einer ganz starken Rückrunde die Champions League, der 1. FC Nürnberg steigt ab, so das Fazit nach einer einseitigen Partie in Gelsenkirchen, die die Keller-Schützlinge souverän gewannen. Die Königsblauen bestimmten das Spiel nach Belieben, nach früher Führung legte die Keller-Elf gegen mutlose Franken, denen es einfach auch an Qualität fehlte, kurz vor der Pause nach und entschied das ungleiche Duell so frühzeitig.]]></description> ###<content:encoded><![CDATA[<p>Schalke erreicht nach einer ganz starken Rückrunde die Champions League, der 1. FC Nürnberg steigt ab, so das Fazit nach einer einseitigen Partie in Gelsenkirchen, die die Keller-Schützlinge souverän gewannen. Die Königsblauen bestimmten das Spiel nach Belieben, nach früher Führung legte die Keller-Elf gegen mutlose Franken, denen es einfach auch an Qualität fehlte, kurz vor der Pause nach und entschied das ungleiche Duell so frühzeitig.<br />[<a href="http://www.xxcker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2013-14/34/1895172/spielanalyse_fc-schalke-04-2_1-fc-nuernberg-81.html">zum ausführlichen Spielbericht</a>]<br />[<a href="http://www.xxcker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2013-14/34/0/spieltag.html">zur aktuellen Tabelle</a>]</p>]]></content:encoded> ###<category>1. Bundesliga</category> ###<category>1. FC Nürnberg</category> ###<category>34. Spieltag</category> ###<category>FC Schalke 04</category> ### ### ###<guid isPermaLink="true">http://www.xxcker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2013-14/34/1895172/spielanalyse_fc-schalke-04-2_1-fc-nuernberg-81.html#omrss_live_bundesliga</guid> ###<pubDate>Mon, 12 May 2014 13:07:56 +0200</pubDate> ###</item> # Imports import urllib import json import xml.etree.ElementTree as xml # Globals # Hier speichern wir unsere Ergebnisse (als JSON) zwischen savefilename = "glubbbot.dat" # Hier holen wir die Daten her: feedaddress = "http://rss.xxcker.de/live/2bundesliga" # Diesen Text suchen wir suchtext = u"N\xc3\xbcrnberg" # Mit diesem Token steuern wir unseren Telegram-Bot: bottoken = "152192659:AAGHJA710MDWxxxxxxxxxxxxxxxxxxxxxx" # Dies ist die ChatID des Telegram-Chats mit mir: chatmittc = "11551000" # Dies ist die ChatID des Telegram-Chats mit Klaus: chatmitklaus = "34245000" # Ab wieviel Textzeichen ist die Beschreibung so interessant dass wir diese mitsenden? anz_zeichen_beschreib = 1 # Prozeduren def sendtelegrammessage(messagetext, chatid): messagetext = messagetext.encode('iso-8859-1') messagedata = { "chat_id": chatid, "disable_web_page_preview": True, "parse_mode": "Markdown", "text": messagetext } messagedata = urllib.urlencode(messagedata) messagedata = messagedata.encode('utf-8') result = urllib.urlopen("https://api.telegram.org/bot" + bottoken + "/sendMessage", messagedata).read() result = result.decode('utf-8') print(result) # Gespeicherte Daten einlesen (letzter Titeltext, letzter Volltext) try: print("Lese Daten") datfile = open(savefilename, "r") savedata = json.load(datfile) datfile.close() except: print("Problem mit gespeicherten Daten. Setze leere Daten.") savedata = {"spieltitel": "", "spieldescription": "", "timestamp": ""} #print("*********************************************************************") #print("Gespeicherter Titel: ") #print(savedata["spieltitel"]) #print("Gespeicherte Beschreibung: ") #print(savedata["spieldescription"]) #print("Gespeichertes Datum: ") #print(savedata["timestamp"]) #print("*********************************************************************") # Feed einlesen feed = urllib.urlopen(feedaddress).read() # Feed nach UTF-8 kodieren feed = feed.decode('iso-8859-1').encode('utf8') # Feed in unser xml-Objekt bringen xmldata = xml.fromstring(feed).getchildren() # Xml durchgehen newdata = {"spieltitel": "", "spieldescription": "", "timestamp": ""} for item in xmldata[0]: if item.tag == "item": # Ein Item ist ein Spiel, in dem Text des Items suchen wir nun nach unserem Suchtext if item.find("title").text.find(suchtext) != -1: # Text gefunden! Wir sind der Club! newdata["spieltitel"] = item.find("title").text newdata["spieldescription"] = item.find("description").text newdata["timestamp"] = item.find("pubDate").text newdata["link"] = item.find("link").text #print("*********************************************************************") #print("Aktueller Titel: ") #print(newdata["spieltitel"]) #print("Aktuelle Beschreibung: ") #print(newdata["spieldescription"]) #print("Aktuelles Datum: ") #print(newdata["timestamp"]) #print("Link zum Spiel: ") #print(newdata["link"]) #print("*********************************************************************") # Hat sich der Titel oder die Beschreibung zu vorher geändert? if savedata["spieltitel"] != newdata["spieltitel"] or savedata["spieldescription"] != newdata["spieldescription"]: print("Daten haben sich geaendert. Schicke Nachricht") nachricht = newdata["spieltitel"] if len(newdata["link"]) >= 1: nachricht = nachricht + "\n" + "[(Link)](" + newdata["link"] + ")" if len(newdata["spieldescription"]) >= anz_zeichen_beschreib: # Scheint eine interessante Beschreibung zu sein, diese mitsenden print("Beschreibung laenger als " + str(anz_zeichen_beschreib) + " Zeichen. Sende diese mit") sendtelegrammessage(nachricht + "\n\n" + newdata["spieldescription"], chatmittc) sendtelegrammessage(nachricht + "\n\n" + newdata["spieldescription"], chatmitklaus) else: sendtelegrammessage(nachricht, chatmittc) sendtelegrammessage(nachricht, chatmitklaus) # Daten speichern (letzter Titeltext, letzter Volltext) -> Datei wird ueberschrieben print("Speichere Daten") datfile = open(savefilename, "w") json.dump(newdata, datfile) datfile.close() else: print("Keine Aenderung, keine Nachricht wird verschickt.")
PS: Der Programmcode ist mittlerweile schon etwas älter und „historisch gewachsen“. Heißt also dass man das wahrscheinlich heutzutage deutlich eleganter lösen könnte. Aber er funktioniert 🙂
PPS: Das Script solltet ihr jetzt mit einem Cronjob aufrufen und schon könnt ihr es automatisieren.
PPPS: Hier gibts den Programmcode als Download: https://www.thomaschristlieb.de/wp-content/uploads/2017/02/glubbbot.zip
Schreibe einen Kommentar