diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7d01f4bf16d681b2f44667083a4577d1394a10b1 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Install + +To install all requirements simply type `pip install -r requirements.txt`. It is recommended to use a [virtualenv](https://virtualenv.pypa.io/en/stable/) + +# Usage + +## check output + +``` +usage: program_info.py [-h] [--preview] + +UFC Programminfo Bot + +optional arguments: + -h, --help show this help message and exit + --preview Überprüfe die nächsten 7 Tage statt nur den nächsten Tag. +``` + +## twitter + +``` +usage: twitter_bot.py [-h] [--doit] [--dest DEST] [--preview] + +UFC Twitter Bot + +optional arguments: + -h, --help show this help message and exit + --doit Sendet die Nachricht über den UFC Twitter Account, anstatt sie + nur auszugeben + --dest DEST Schreibe DEST per mention an + --preview Überprüfe die nächsten 7 Tage statt nur den nächsten Tag. +``` + +## telegram + +``` +usage: telegram_bot.py [-h] [--doit] [--dest DEST] [--preview] + +UFC Telegram Bot + +optional arguments: + -h, --help show this help message and exit + --doit Sendet die Nachricht an den UFC Channel, anstatt nur eine + Ausgabe zu machen + --dest DEST Alternativer Telegramchat + --preview Überprüfe die nächsten 7 Tage statt nur den nächsten Tag. + +``` + diff --git a/program_info.py b/program_info.py new file mode 100644 index 0000000000000000000000000000000000000000..908909519adb78413b53851857f63ff2e812b567 --- /dev/null +++ b/program_info.py @@ -0,0 +1,147 @@ +#!/bin/env python3 +import datetime +import json +import re +from argparse import ArgumentParser +from datetime import timedelta +from io import BytesIO +from pprint import pprint + +import requests +from dateutil import parser as date_parser +from pytz import UTC + + +class Date: + weekday = "" + day = "" + month = "" + year = "" + time = "" + + def __init__(self): + pass + +class NextEvent: + date = Date() + title = "" + description = "" + movie_description = "" + tags = "" + link = "" + image = "" + + days = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"] + month = [ + "Januar", + "Februar", + "März", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember" + ] + + def __init__(self, next_event, now): + # passende Zeitangabe raussuchen + event_date = date_parser.parse(next_event["date"]) + tomorrow = now + timedelta(days=1) + if event_date.day == now.day and event_date.month == now.month and event_date.year == now.year: + start = "Heute" + elif event_date.day == tomorrow.day and event_date.month == tomorrow.month and event_date.year == tomorrow.year: + start = "Morgen" + else: + start = self.days[event_date.weekday()] + + self.date.weekday = start + self.date.day = event_date.day + self.date.month = self.month[event_date.month - 1] + self.date.year = event_date.year + self.date.time = event_date.strftime("%H:%M") + + # Title des Events + self.title = next_event["title"] + + # Beschreibung des Events + self.description = next_event["description"] + + # Beschreibung des Films + self.movie_description = next_event["movie"]["description"] + + # Baue die Tag-Reihe zusammen. + self.tags = " | ".join([w["description"] for w in next_event["tags"]]) + + # Generiere die URL zum Event, da diese nicht im JSON steht. + link = next_event["title"].lower().replace('ö', 'o').replace('ä', 'a').replace('ü', 'u').replace('ß', 'ss') + link = re.sub("[^[A-Za-z0-9]", '-', link) + link = re.sub(r"-{2,}", '-', link) + link: str = link.rstrip("-") + link = str(next_event["id"]) + "-" + link + self.link = "https://ufc.tu-dortmund.de/vorstellung/%s" % link + + if next_event["movie"]["youtube_id"] is not "": + self.trailer = "https://youtu.be/%s" % next_event["movie"]["youtube_id"] + + response = requests.get("https://ufc.tu-dortmund.de/%s" + % next_event['movie']['image_url_medium'] + .replace('medium', 'original')) + self.image = BytesIO(response.content) + + +class ProgramInfo: + semester = "" + + next_event = "" + + def __init__(self): + # Hole das UFC Semester + self.semester = json.loads( + requests.get(url="https://ufc.tu-dortmund.de/semesters/current.json").text + ) + + def get_next_event(self, day_diff, just_print=False): + # Finde das nächste Event, dass nach heute ist und in `day_diff` Tagen stattfindet. + now = UTC.localize( + datetime.datetime.now() + ) + for i in self.semester: + d = date_parser.parse(i["date"]) + if d > now and (d - now).days <= day_diff: + if just_print: + pprint(i) + else: + self.next_event = NextEvent(i, now) + return self.next_event + + def get_image(self): + # return image data + return self.next_event.image + + +def main(): + # Parse Arguments + aparser: ArgumentParser = ArgumentParser( + description="UFC Programminfo Bot" + ) + aparser.add_argument( + "--preview", + dest='day_diff', + action="store_const", + const=7, + default=1, + help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag." + ) + args = aparser.parse_args() + + p_info = ProgramInfo() + + p_info.get_next_event(args.day_diff, True) + + +if __name__ == "__main__": + main() diff --git a/programminformbot b/programminformbot deleted file mode 100755 index d0109f6b11038e6ed125157dddbfe21115f53903..0000000000000000000000000000000000000000 --- a/programminformbot +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/env python3 -import requests, json -from pprint import pprint -import datetime -from datetime import timedelta -from dateutil import parser -from pytz import UTC -import re -import telepot -import argparse - -telegram_recv = "@ufcdortmund" #kanal - -#Parse Arguments -aparser = argparse.ArgumentParser( - description="UFC Telegram Bot" -) -aparser.add_argument( - "--doit", - action="store_true", - help="Sendet die Nachricht an den UFC Channel, anstatt nur eine Ausgabe zu machen" -) -aparser.add_argument( - "--dest", - help="Alternativer Telegramchat" -) -aparser.add_argument( - "--json", - action="store_true", - help="Schreibt das nächste Event in JSON nach stdout und beendet das Programm." -) -args = aparser.parse_args() -# Überschreibe den Telegramkanal, wenn einer angegeben wurde. (Praktisch für Debugging) -if not args.dest is None: - telegram_recv = args.dest - -#Hole das UFC Semester -semester = json.loads( - requests.get(url="https://ufc.tu-dortmund.de/semesters/current.json").text -) -now = UTC.localize( - datetime.datetime.now() -) - -# Finde heraus, ob morgen ein Event ansteht. Wenn der Bot nicht im doit-Modus ist, guckt er auch ob übermorgen ein Event ist. -next_event = None -if args.doit: - daydiff = 1 -else: - daydiff = 2 - -# Finde das nächste Event, dass nach heute ist und morgen oder übermorgen stattfindet. -for i in semester: - d = parser.parse(i["date"]) - if d > now and (d-now).days <= (daydiff): - next_event = i - break - -# Wenn es keinen öffentlichen Film gibt, brich ab. -if next_event is None: - print("keine Filme in nächster Zeit") - exit(0) - -# Wenn der Bot nur nach dem JSON des Events suchen sollte, soll er es ausgeben und beenden. -if args.json is True: - print(next_event) - exit(0) - - -# Textkonstanten für Datum -tage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"] -monate = [ - "Januar", - "Februar", - "März", - "April", - "Mai", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "Dezember" -] - -# passende Zeitangabe raussuchen -evda = parser.parse(next_event["date"]) -tomorrow = now + timedelta(days=1) -dif = (evda-now) -if evda.day == now.day and evda.month == now.month and evda.year == now.year: - anfang = "Heute" -elif evda.day == tomorrow.day and evda.month == tomorrow.month and evda.year == tomorrow.year: - anfang = "Morgen" -else: - anfang = tage[evda.weekday()] - - -# Generiere die URL zum Event, da diese nicht im JSON steht. -title = next_event["title"].lower().replace('ö', 'o').replace('ä', 'a').replace('ü', 'u').replace('ß', 'ss') -title = re.sub("[^[A-Za-z0-9]", '-', title) -title = re.sub(r"-{2,}", '-', title) -title = title.rstrip("-") -title = str(next_event["id"]) + "-" + title - -# Baue die Tag-Reihe zusammen. -tags = " | ".join([ w["description"] for w in next_event["tags"]]) - -# Erste Nachricht zusammenbauen -ankündigung = [ - ("%s, %d. %s %d um %s Uhr im UFC:\n" % (anfang, evda.day, monate[evda.month-1], evda.year, evda.strftime("%H:%M"))), - "\n", - "*", next_event["title"], "*\n", - "\n", - next_event["description"], "" if next_event["description"] is "" else "\n", - next_event["movie"]["description"], "\n", - "\n", - tags, "\n", - "\n", - "[Link zur Veranstaltung](https://ufc.tu-dortmund.de/vorstellung/%s?pk_campaign=telegram)" % title -] - - -# Trailernachricht zusammenbauen -if next_event["movie"]["youtube_id"] is "": - print("Es gibt keinen Trailer") -else: - ankündigung.append( - "\n[Link zum Trailer](https://youtu.be/%s)" % next_event["movie"]["youtube_id"] - ) - - -ankündigung=''.join(ankündigung) - -print("Vorschau Ankündigung:") -print(ankündigung) - - -# Nur abschicken, wenn es wirklich verlangt wird. Ansonsten nur in die Konsole schreiben -if args.doit is True: - print("\nSchick Nachricht an Telegramchat " + telegram_recv) - bot = telepot.Bot("247551569:AAHpTb4pR8Vq8FlEWYC3O8cOD2OIzQKADyQ") # UFC-Do-Bot - bot.sendMessage(telegram_recv, ankündigung, parse_mode="markdown", disable_web_page_preview=True) -else: - print("\n--doit wurde nicht gesetzt. Programm endet hier") - diff --git a/requirements.txt b/requirements.txt index 927a31a125aec86c8c468a75554884fdf96aa9e5..98d4c29a4cecfdd479cefb8581357b404bf246a0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ python-dateutil telepot requests pytz +tweepy \ No newline at end of file diff --git a/telegram_bot.py b/telegram_bot.py new file mode 100755 index 0000000000000000000000000000000000000000..f05f2aca680a4c83e931c8080a56fb2b82f36d91 --- /dev/null +++ b/telegram_bot.py @@ -0,0 +1,70 @@ +#!/bin/env python3 +import telepot +import argparse +from program_info import ProgramInfo + +telegram_recv = "@ufcdortmund" # kanal + +# Parse Arguments +aparser = argparse.ArgumentParser( + description="UFC Telegram Bot" +) +aparser.add_argument( + "--doit", + action="store_true", + help="Sendet die Nachricht an den UFC Channel, anstatt nur eine Ausgabe zu machen" +) +aparser.add_argument( + "--dest", + help="Alternativer Telegramchat" +) +aparser.add_argument( + "--preview", + dest='day_diff', + action="store_const", + const=7, + default=1, + help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag." +) +args = aparser.parse_args() +# Überschreibe den Telegramkanal, wenn einer angegeben wurde. (Praktisch für Debugging) +if not args.dest is None: + telegram_recv = args.dest + +program_info = ProgramInfo() + +next_event = program_info.get_next_event(args.day_diff) + +date = next_event.date + +# Erste Nachricht zusammenbauen +message = [ + ("%s, %d. %s %d um %s Uhr im UFC:\n" % ( + date.weekday, date.day, date.month, date.year, date.time)), + "\n", + "*", next_event.title, "*\n", + "\n", + next_event.description, "" if next_event.description is "" else "\n", + next_event.movie_description, "\n", + "\n", + next_event.tags, "\n", + "\n", + "[Link zur Veranstaltung](%s?pk_campaign=telegram)" % next_event.link +] + +# Trailernachricht zusammenbauen +if next_event.trailer is not "": + message.append("\n[Link zum Trailer](https://youtu.be/%s)" % next_event.trailer) + +text = ''.join(message) + +print("Vorschau Ankündigung:") +print(text) + +# Nur abschicken, wenn es wirklich verlangt wird. Ansonsten nur in die Konsole schreiben +if args.doit is True: + print("\nSchick Nachricht an Telegramchat " + telegram_recv) + bot = telepot.Bot("247551569:AAHpTb4pR8Vq8FlEWYC3O8cOD2OIzQKADyQ") # UFC-Do-Bot + bot.sendMessage(telegram_recv, text, parse_mode="markdown", disable_web_page_preview=True) +else: + print("\n--doit wurde nicht gesetzt. Programm endet hier") diff --git a/twitter_bot.py b/twitter_bot.py new file mode 100644 index 0000000000000000000000000000000000000000..830f2e1eab919fa9f8092c43935b09e2a1bf1a2f --- /dev/null +++ b/twitter_bot.py @@ -0,0 +1,66 @@ +import shutil + +import tweepy +import argparse +from program_info import ProgramInfo + +CONSUMER_KEY = 'WEF5WDeWnql2I292voEG9mww3' +CONSUMER_SECRET = 'WrUCif5m7rxWDSDTb2YK7Djtb2MmUqFVZZXXcyH87amLbCgdpM' +ACCESS_TOKEN = '50611492-ALHt50D7VKc8jZA9weQ5zdIF5RWwLhqkTPbgvWG5O' +ACCESS_TOKEN_SECRET = 'z9Pwf5RjuJjJ8bzlMPCCKkYFukdi01j2oAcWnKdXZcAfZ' + +auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) +auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) +api = tweepy.API(auth) + +# Parse Arguments +aparser = argparse.ArgumentParser( + description="UFC Twitter Bot" +) +aparser.add_argument( + "--doit", + action="store_true", + help="Sendet die Nachricht über den UFC Twitter Account, anstatt sie nur auszugeben" +) +aparser.add_argument( + "--dest", + help="Schreibe DEST per mention an" +) +aparser.add_argument( + "--preview", + dest='day_diff', + action="store_const", + const=7, + default=1, + help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag." +) +args = aparser.parse_args() + +program_info = ProgramInfo() + +next_event = program_info.get_next_event(args.day_diff) + +date = next_event.date + +# Twitternachricht zusammenbauen +message = [ + ("%s, %d. %s %d um %s Uhr im Hörsaal 1 der EF50:\n" % ( + date.weekday, date.day, date.month, date.year, date.time)), + "\n", + next_event.title, + "\n", + "%s?pk_campaign=twitter" % next_event.link +] + +text = ''.join(message) + +image = program_info.get_image() + +if not args.dest is None: + text = args.dest + " " + text + +print("Vorschau Twitter:") +print(text) + +if args.doit: + api.update_with_media("image.png", text, file=image)