Untitled
unknown
python
2 years ago
6.1 kB
17
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 übergibt diesen an nächste Zeile
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 Nachrichten/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 Bytestream 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 Datenstream, um bei AUSGABE-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