python -telegram-bot Передача аргумента между обработчиками разговора - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать бота, в котором пользователь нажимает на команду, отправляет ссылку в виде сообщения, а затем бот добавляет ссылку в некоторую базу данных. Вот как это будет выглядеть:

python-telegram-bot

Поэтому я подумал, что мне следует использовать ConversationHandler. Вот что я написал: bot.py:

from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters,
        ConversationHandler)
from settings import BOT_TOKEN
import commands

def main():
    updater = Updater(BOT_TOKEN, use_context=True)
    dispatcher = updater.dispatcher

    conversation = ConversationHandler(
            entry_points=[
                MessageHandler(
                    (Filters.command & Filters.regex("al_(.*)")),
                    commands.add_link
                )
            ],
            states={
                commands.ADD_LINK: [
                    MessageHandler(Filters.entity("url"), commands.receive_link)
                ]
            },
            fallbacks=[]
    )

    dispatcher.add_handler(CommandHandler("search", commands.search))
    dispatcher.add_handler(conversation)

    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

И команды находятся в другом файле с именем commands.py:

from telegram.ext import ConversationHandler

ADD_LINK = range(1)

def receive_link(update, context):
    bot = context.bot
    url = update.message.text
    chat_id = update.message.chat.id

    bot.send_message(
            chat_id=chat_id,
            text="The link has been added."
    )
    return ConversationHandler.END

def add_link(update, context):
    bot = context.bot
    uuid = update.message.text.replace("/al_", "")
    chat_id = update.message.chat.id
    bot.send_message(
            chat_id=chat_id,
            text="Send the link as a message."
    )

    return ADD_LINK

Теперь проблема в том, что мне нужно иметь возможность используйте переменную uuid (которая генерируется в add_link) в моей функции receive_link. Но я не знаю, как передать эту переменную. Как я могу это сделать?

1 Ответ

0 голосов
/ 06 апреля 2020

С помощью этой статьи я решил это следующим образом.

Используя context.user_data в любом обратном вызове обработчика, вы получаете доступ к пользовательской информации c dict.

Таким образом, мой код изменился бы следующим образом:

from telegram.ext import ConversationHandler

ADD_LINK = range(1)

def receive_link(update, context):
    bot = context.bot
    url = update.message.text
    chat_id = update.message.chat.id
    uuid = context.user_data["uuid"]

    bot.send_message(
            chat_id=chat_id,
            text=f"The link has been added to '{uuid}'."
    )
    return ConversationHandler.END

def add_link(update, context):
    bot = context.bot
    uuid = update.message.text.replace("/al_", "")
    context.user_data["uuid"] = uuid
    chat_id = update.message.chat.id
    bot.send_message(
            chat_id=chat_id,
            text=f"Send the link as a message."
    )

    return ADD_LINK

Я сохранил переменную uuid следующим образом:

context.user_data["uuid"] = uuid

И используйте это так:

uuid = context.user_data["uuid"]

Довольно просто и интуитивно понятно. Вот вывод:

python-telegram-bot store user data

...