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

Python TeleBot点击Add按钮后无法正确添加书名至列表的问题求助

修复Telegram机器人添加书籍功能的问题

问题核心

你的代码存在两个关键问题:

  • 逻辑判断错误:多个独立的if语句导致else仅对应最后一个if(判断是否为"Додати"的条件),用户点击其他按钮(比如"Вибрати")时,会触发else逻辑,把按钮文本误存为书籍名称。
  • 缺少状态跟踪:无法区分用户是执行常规按钮操作,还是在点击"Додати"后输入书籍名称。

解决方案

通过维护用户状态跟踪操作阶段:当用户点击"Додати"后,标记该用户处于等待输入书名的状态,后续收到文本时优先检查状态,再执行对应逻辑。

修改后的完整代码

import random
import telebot
from telebot import types
import pickle

bot = telebot.TeleBot('你的机器人token')

# 加载本地存储的书籍列表
try:
    with open("book_list.p", "rb") as file:
        books = pickle.load(file)
except:
    books = []

# 存储用户操作状态:key为chat_id,value为当前状态
user_states = {}

@bot.message_handler(commands=['start'])
def button_message(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton("Вибрати")  # 选择书籍
    item2 = types.KeyboardButton("Очистити")  # 清空消息
    item3 = types.KeyboardButton("Додати")  # 添加书籍
    markup.add(item1, item2, item3)
    bot.send_message(
        message.chat.id, 
        "点击'Вибрати'随机选书\n点击'Додати'添加书籍到列表", 
        reply_markup=markup
    )

@bot.message_handler(content_types="text")
def message_reply(message):
    chat_id = message.chat.id
    # 优先处理用户输入书名的状态
    if user_states.get(chat_id) == "awaiting_book_name":
        new_book = message.text.strip()
        if new_book:
            books.append(new_book)
            with open("book_list.p", "wb") as file:
                pickle.dump(books, file)
            bot.send_message(chat_id, "书籍已成功添加!")
        else:
            bot.send_message(chat_id, "请输入有效的书籍名称!")
        # 重置用户状态
        user_states.pop(chat_id, None)
        return
    
    # 处理常规按钮操作
    if message.text == "Вибрати":
        if books:
            bot.send_message(chat_id, random.choice(books))
        else:
            bot.send_message(chat_id, "书籍列表为空,请先添加书籍!")
    elif message.text == "Очистити":
        bot.delete_message(chat_id, message.message_id)
    elif message.text == "Додати":
        bot.send_message(chat_id, "请输入要添加的书籍名称:")
        user_states[chat_id] = "awaiting_book_name"

bot.polling(none_stop=True)

关键修改说明

  • 新增user_states字典,跟踪每个用户的当前操作状态。
  • 优先判断用户状态:若处于等待输入书名的状态,直接处理输入并添加书籍,完成后重置状态。
  • 将独立if改为elif,确保按钮操作逻辑互斥,避免误触发。
  • 增加空列表提示、空输入判断,优化用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:07:02