Untitled

mail@pastecode.io avatar
unknown
python
2 months ago
6.1 kB
5
Indexable
Never
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
Leave a Comment