Wenn ein Tor im Fußball fällt -> Telegram Nachricht

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


Beitrag veröffentlicht

in

,

von

Schlagwörter:

Kommentare

Eine Antwort zu „Wenn ein Tor im Fußball fällt -> Telegram Nachricht“

  1. Deine Gedächtnis täuscht dich nicht, zumindest wurden sogenannte Tokens auch bei den Eisenbahnen verwendet. https://de.wikipedia.org/wiki/Token_(Eisenbahn)

    Allerdings wird der Begriff Token vielfältig verwendet und ob die Herkunft im Bereich der Zugriffsberechtigung von dem Eisenbahn Token abgeleitet wurde, weiß ich auch nicht. Klingt aber plausibel.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert