Untitled
unknown
python
a year ago
6.1 kB
13
Indexable
from io import BytesIO from urllib.request import urlopen, Request from telegram.ext import * from telegram.bot import Bot from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update import PyPDF2 PDF_URL = "https://bsz-radeberg.de/images/dokumente/plaene/vertr.pdf" # Vertretungsplan URL OUTPUT = "./out.pdf" # Ausgabe-Pfad API_KEY = "6430929832:AAFkcGoYFuLe33HBMGcyCS1mS4bqpgcxw_M" # API-Key für Telegram API PAGE_MAP = { # "dicitonary" wo Klasse (string) einer Zahl (integer) zugeordnet wird "F22C": 0, "F23C": 1, "V21C": 2, "BVJ23C": 3, "M23C": 4, "K22C": 5, "I21C2": 6, "I21C1": 7, "F21C": 8, "V22C": 9, "V23C": 10, "BGK23C": 11, "Z21C": 12, "VKA23C": 13, } def button(update: Update, context) -> None: chat_id = update.effective_chat.id query = update.callback_query query.answer() # Abfrage nach Eingaben im Auswahlmenü query.edit_message_text(text=f"Vertretungsplan für Klasse: {query.data}") # Ändert Nachricht von Auswahlmenü in eingegeben Auswahl download_pdf(query.data) # läd PDF-Seite herunter (je nach Klassenauswahl) send_pdf("./out.pdf", chat_id) # verschickt PDF def key_from_value(d, val): return [k for k, v in d.items() if v == val][0] # wandelt dictionary-index in Klasse um (value zu key) def send_pdf(file, chat_id): bot = Bot(token=API_KEY) # definiert an welchen Bot die Datei übergeben wird with open(file, 'rb') as f: # öffnet bitstream und speichert diesen in BinbaryIO-Objekt "f" bot.send_document(chat_id=chat_id, document=f, filename="Vertretungsplan.pdf") # versendet Dokument aus dem erstellten bitstream an angegebene chat_id def handle_message(update, context): # Erstellen des Layouts für Auswahlmenü mithilfe eines Arrays: KEYBOARD = [ [ InlineKeyboardButton(str(key_from_value(PAGE_MAP, 0)), callback_data=str(key_from_value(PAGE_MAP, 0))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 1)), callback_data=str(key_from_value(PAGE_MAP, 1))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 2)), callback_data=str(key_from_value(PAGE_MAP, 2))), ], [ InlineKeyboardButton(str(key_from_value(PAGE_MAP, 3)), callback_data=str(key_from_value(PAGE_MAP, 3))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 4)), callback_data=str(key_from_value(PAGE_MAP, 4))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 5)), callback_data=str(key_from_value(PAGE_MAP, 5))), ], [ InlineKeyboardButton(str(key_from_value(PAGE_MAP, 6)), callback_data=str(key_from_value(PAGE_MAP, 6))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 7)), callback_data=str(key_from_value(PAGE_MAP, 7))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 8)), callback_data=str(key_from_value(PAGE_MAP, 8))), ], [ InlineKeyboardButton(str(key_from_value(PAGE_MAP, 9)), callback_data=str(key_from_value(PAGE_MAP, 9))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 10)), callback_data=str(key_from_value(PAGE_MAP, 10))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 11)), callback_data=str(key_from_value(PAGE_MAP, 11))), ], [ InlineKeyboardButton(str(key_from_value(PAGE_MAP, 12)), callback_data=str(key_from_value(PAGE_MAP, 12))), InlineKeyboardButton(str(key_from_value(PAGE_MAP, 13)), callback_data=str(key_from_value(PAGE_MAP, 13))), ], ] reply_markup = InlineKeyboardMarkup(KEYBOARD) # definiert KEAYBOARD Array als Telegram-Keyboard in "reply-markup" variable response = "Wähle deine Klasse aus!" update.message.reply_text(response, reply_markup=reply_markup) # Antwortet mit "response" string und dem erstellten Keyboard def start_bot(): updater = Updater(API_KEY) dp = updater.dispatcher dp.add_handler(MessageHandler(Filters.text, handle_message)) # startet Messagehandler (handle_message Funktion) --> wartet auf Texteingaben dp.add_handler(CallbackQueryHandler(button)) # startet Callbackhandler (button Funktion) --> wartet auf Eingabe und verarbeitet diese ggf. updater.start_polling(0) # startet Abfragen nach neuen Chats print("Bot gestartet!") def download_pdf(KLASSE): remoteFile = urlopen(Request(PDF_URL)).read() # öffnet TCP Verbindung zu URL memoryFile = BytesIO(remoteFile) # konvertiert PDF in einen Bitestream und speichert dieesen dann in den RAM reader = PyPDF2.PdfReader(memoryFile) # liest PDF aus RAM aus writer = PyPDF2.PdfWriter() writer.add_page(reader.pages[PAGE_MAP[KLASSE]]) # Erstellt aus Original PDF neue PDF nur mit ausgewählter Klasse with open(OUTPUT, "wb") as out: # Öffnet Bitstream, um bei OUTPUT-Pfad etwas binär zu schreiben (write binary) writer.write(out) # Speichert neue PDF aus BinaryIO-Objekt "out" # print("PDF gespeichert!") if __name__ == "__main__": start_bot() # Initialisiert Bot
Editor is loading...
Leave a Comment