python-telegram-bot 在对话处理程序之间传递参数

Ami*_*ani 3 python 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()
Run Code Online (Sandbox Code Playgroud)

命令在另一个名为的文件中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
Run Code Online (Sandbox Code Playgroud)

现在的问题是我需要能够在我的函数中使用uuid变量(在 中生成add_linkreceive_link。但我不知道如何传递这个变量。我该怎么做?

Ami*_*ani 5

在这篇文章的帮助下,我是这样解决的。

通过context.user_data在任何处理程序回调中使用,您可以访问特定于用户的字典。

所以我的代码会改变如下:

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
Run Code Online (Sandbox Code Playgroud)

我这样存储uuid变量:

context.user_data["uuid"] = uuid
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

uuid = context.user_data["uuid"]
Run Code Online (Sandbox Code Playgroud)

非常简单直观。这是输出:

python-telegram-bot 存储用户数据