You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python Telegram Bot API保存用户偏好选项的技术咨询

使用Python Telegram Bot的Conversation Handler实现语言选择持久化

完全可以用Conversation Handler解决你的问题——它本身就是为跟踪用户会话状态设计的,能自动关联chat_id保存用户的选择,比自己维护字典更可靠且无需额外数据库。

下面是具体实现步骤和代码示例:

核心思路

Conversation Handler会为每个用户会话维护独立上下文(context.user_data),你可以把用户选择的语言存入这里,后续所有翻译操作直接从上下文读取即可。

实现步骤

1. 导入依赖并定义会话状态

先引入所需模块,同时定义状态标记来跟踪用户当前的流程节点:

from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    ApplicationBuilder,
    CommandHandler,
    CallbackQueryHandler,
    MessageHandler,
    filters,
    ConversationHandler,
    ContextTypes
)

# 定义会话状态枚举
CHOOSING_LANGUAGE, LANGUAGE_CHOSEN = range(2)

2. 编写启动命令与语言选择菜单

用户发送/start时,弹出包含波斯语、西班牙语选项的按钮:

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
    # 构建语言选择按钮
    keyboard = [
        [InlineKeyboardButton("波斯语", callback_data="fa")],
        [InlineKeyboardButton("西班牙语", callback_data="es")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    await update.message.reply_text("请选择翻译目标语言:", reply_markup=reply_markup)
    return CHOOSING_LANGUAGE

3. 处理语言选择操作

捕获用户的按钮点击事件,将选中的语言存入会话上下文,并提示用户可以发送待翻译文本:

async def choose_language(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
    query = update.callback_query
    await query.answer()
    
    # 提取用户选择的语言代码,存入上下文
    selected_lang = query.data
    context.user_data["target_lang"] = selected_lang
    
    # 返回友好提示
    lang_name = "波斯语" if selected_lang == "fa" else "西班牙语"
    await query.edit_message_text(text=f"已选择{lang_name},请发送需要翻译的英文文本:")
    return LANGUAGE_CHOSEN

4. 处理翻译请求

在用户选定语言后,接收英文文本并使用保存的目标语言完成翻译(示例用模拟函数替代实际翻译逻辑):

# 模拟翻译函数,实际替换为你的翻译API调用
def translate_text(text: str, target_lang: str) -> str:
    if target_lang == "fa":
        return f"[波斯语翻译] {text}"
    elif target_lang == "es":
        return f"[西班牙语翻译] {text}"
    return text

async def handle_translation(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
    # 从上下文取出用户选择的语言
    target_lang = context.user_data.get("target_lang")
    if not target_lang:
        await update.message.reply_text("请先选择翻译语言,发送/start重新开始")
        return CHOOSING_LANGUAGE
    
    # 处理翻译并返回结果
    original_text = update.message.text
    translated_text = translate_text(original_text, target_lang)
    await update.message.reply_text(translated_text)
    
    # 保持当前状态,后续文本继续使用该语言翻译
    return LANGUAGE_CHOSEN

5. 添加会话重置功能(可选)

提供/cancel命令让用户重置语言选择:

async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
    await update.message.reply_text("已重置语言选择,发送/start重新选择")
    return ConversationHandler.END

6. 组装并启动Bot

将所有Handler整合到Conversation Handler中,启动Bot服务:

def main():
    # 替换为你的Bot Token
    application = ApplicationBuilder().token("YOUR_BOT_TOKEN").build()
    
    # 构建Conversation Handler
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler("start", start)],
        states={
            CHOOSING_LANGUAGE: [CallbackQueryHandler(choose_language)],
            LANGUAGE_CHOSEN: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_translation)]
        },
        fallbacks=[CommandHandler("cancel", cancel)]
    )
    
    application.add_handler(conv_handler)
    application.run_polling()

if __name__ == "__main__":
    main()

关键说明

  • context.user_data是每个用户独立的存储字典,框架自动关联chat_id,无需手动维护映射关系。
  • 会话状态保存在内存中,Bot重启后会丢失用户的选择,但如果你的场景可以接受用户重启后重新选择,这个方案完全够用。
  • 如果后续需要持久化,可在choose_language中将chat_id与语言选择写入本地文件(如JSON),但Conversation Handler已解决无数据库下的会话跟踪核心需求。

内容的提问来源于stack exchange,提问作者Ali Eftekhari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:45:54