Лучшая практика отправки сообщения в python боте telegram от стороннего слушателя - PullRequest
0 голосов
/ 21 января 2020

У меня есть собственный код, который выполняет свою процедуру, и я хочу отправить сообщение в Telegram, если что-то пойдет не так. В моем случае я использую библиотеку python-telegram-bot вместе с apscheduler и ее слушателями, где могут быть зафиксированы определенные события. Я придумал такой рабочий код, но мой вопрос: возможно ли сделать его лучше, а именно без использования глобальной переменной? Это было сделано, чтобы преодолеть проблему, заключающуюся в том, что слушатели не принимают аргументы, необходимые боту для отправки сообщения.

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
from telegram.ext import Updater, CommandHandler
import copy
import my_custom_library

saved_update = None

def my_listener(event): # not related with bot
    if event.exception:
        if saved_update is not None:
            alert(saved_update, 'Scheduler threw event.exception.') # should have bot related args
    else:
        record = event.retval # get returned value from my_custom_library.repetitive_function
        try:
            processed_record = my_custom_library.my_unsafe_business_logic(record) # something might go wrong here
            my_custom_library.add_to_db(processed_record) # and here
        except Exception as e:
            if saved_update is not None:
                alert(saved_update, e) # should have bot related args

def start(update, context):
    global saved_update
    saved_update = copy.deepcopy(update) # this is what I don't like
    update.message.reply_text('You have subscribed for notifications.')

def alert(update, reason):
    update.message.reply_text('Something went wrong: {}'.format(reason))

def main():
    scheduler = BackgroundScheduler()
    scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
    scheduler.add_job(my_custom_library.repetitive_function, args=(my_args,), trigger='interval', minutes=1)
    scheduler.start()

    # bot
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", callback=start))
    updater.start_polling()
    updater.idle()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 21 января 2020

API Telegram Bot довольно прост, вам просто нужно отправить запрос HTTP GET на этот URL: https://api.telegram.org/bot_token_/sendMessage?chat_id=123&text=Hello%20World!

Просто создайте бота с Botfather и отправьте бота сообщение. С указанным токеном от Botfather и этим URL: https://api.telegram.org/bot_token_/getUpdates

Вы можете получить сообщения, которые были отправлены Боту, и chat_id.

Самый простой способ использовать модуль запросов и отправить выходные данные средства обновления по первому URL-адресу в качестве текстового параметра.

...