python-telegram-bot报错:Updater对象无add_handler属性的解决方法
解决python-telegram-bot中
Updater无add_handler属性的问题 你在使用最新版python-telegram-bot时遇到报错'Updater' object has no attribute 'add_handler',相关代码及导入语句如下:
原代码
def main() -> None: update_queue = queue.Queue() bot_token = "token" bot = Bot(token=bot_token) updater = Updater( bot=bot, update_queue=update_queue ) conv_handler = ConversationHandler( entry_points=[CommandHandler('book', book_appointment)], states={ NAME: [MessageHandler(filters.TEXT & (~filters.COMMAND), book)], PHONE: [MessageHandler(filters.TEXT & (~filters.COMMAND), phone)], EMAIL: [MessageHandler(filters.TEXT & (~filters.COMMAND), email)], ISSUE: [MessageHandler(filters.TEXT & (~filters.COMMAND), issue)], TIME: [MessageHandler(filters.TEXT & (~filters.COMMAND), time)], }, fallbacks=[CommandHandler('start', start)], ) updater.add_handler(conv_handler) updater.add_handler(CommandHandler("info", info)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
导入语句
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CommandHandler, CallbackContext, CallbackQueryHandler, ConversationHandler, MessageHandler, filters import queue from telegram import Bot
解决方案
问题源于python-telegram-bot v20及以上版本的API变更:Updater类不再直接提供add_handler方法,需要通过其内部的dispatcher对象添加处理器,同时新版可以简化Updater的初始化逻辑。
修改后的代码
def main() -> None: bot_token = "token" # 新版无需手动创建Bot和queue,直接传入token即可初始化Updater updater = Updater(token=bot_token) conv_handler = ConversationHandler( entry_points=[CommandHandler('book', book_appointment)], states={ NAME: [MessageHandler(filters.TEXT & (~filters.COMMAND), book)], PHONE: [MessageHandler(filters.TEXT & (~filters.COMMAND), phone)], EMAIL: [MessageHandler(filters.TEXT & (~filters.COMMAND), email)], ISSUE: [MessageHandler(filters.TEXT & (~filters.COMMAND), issue)], TIME: [MessageHandler(filters.TEXT & (~filters.COMMAND), time)], }, fallbacks=[CommandHandler('start', start)], ) # 通过dispatcher对象添加处理器 updater.dispatcher.add_handler(conv_handler) updater.dispatcher.add_handler(CommandHandler("info", info)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
关键修改点
- 将
updater.add_handler(...)替换为updater.dispatcher.add_handler(...) - 简化
Updater初始化:直接传入token参数,新版会自动处理Bot实例和消息队列的创建
内容的提问来源于stack exchange,提问作者Polina Ivy
相关产品推荐
相关产品推荐

