Python Telegram Bot启动报错:Updater不支持use_context参数
解决python-telegram-bot中Updater初始化的TypeError问题
问题背景
用户编写了Telegram机器人的Python代码,启动时触发如下报错,且已确认python-telegram-bot版本高于12.0。
报错信息
Traceback (most recent call last): File "C:\Users\admin\PycharmProjects\NeoTecnoAlCentroBotPrincipale\.venv\Scripts\Bot.py", line 135, in <module> main() File "C:\Users\admin\PycharmProjects\NeoTecnoAlCentroBotPrincipale\.venv\Scripts\Bot.py", line 109, in main updater = Updater('7498845724:AAEI2GTjXMZgGo3S99iBw_OgoKh7Zshf-Oc', use_context=True) TypeError: Updater.__init__() got an unexpected keyword argument 'use_context'
原因分析
python-telegram-bot 13.0及以上版本中,use_context参数已被移除——该版本开始默认启用Context对象,无需手动指定此参数。代码中保留了过时参数,导致初始化失败。
解决方案
1. 移除过时的use_context参数
修改main函数中的Updater初始化代码:
原代码:
updater = Updater('7498845724:AAEI2GTjXMZgGo3S99iBw_OgoKh7Zshf-Oc', use_context=True)
修改后:
updater = Updater('7498845724:AAEI2GTjXMZgGo3S99iBw_OgoKh7Zshf-Oc')
2. 修复其他版本兼容问题
代码中还有几处需适配新版本:
- 过滤器名称修正:将
Filters.command改为filters.COMMAND(新版本中过滤器模块为小写filters) - 移除冗余参数:
CommandHandler中的pass_args=True已被移除,直接删除该参数(新版本context.args默认可用) - 补充缺失函数:添加未定义的
start函数:def start(update: Update, context: CallbackContext) -> None: update.message.reply_text('Bot avviato correttamente!') - 删除重复表创建语句:重复创建
comandi表的语句会覆盖原有表结构,删除第二行创建comandi表的代码:# 删除此行:c.execute('''CREATE TABLE IF NOT EXISTS comandi (user_id integer, username text)''') - 修正权限判断逻辑:
invia_privato函数中,错误地用用户名对比用户ID,修改为:# 原代码:if update.message.from_user.username == ID_USER_PRINCIPALE: if str(update.message.from_user.id) == ID_USER_PRINCIPALE:
最终修改后的main函数示例
def main() -> None: """Avvia il bot.""" updater = Updater('7498845724:AAEI2GTjXMZgGo3S99iBw_OgoKh7Zshf-Oc') # Ottieni il dispatcher per registrare i gestori dp = updater.dispatcher # su differenti comandi - rispondi in Telegram dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("crea_comando", crea_comando)) dp.add_handler(CommandHandler("autorizza_utente", autorizza_utente)) dp.add_handler(CommandHandler("tagga_utenti", tagga_utenti)) dp.add_handler(CommandHandler("invia_privato", invia_privato)) dp.add_handler(ChatMemberHandler(aggiorna_utente, ChatMemberHandler.CHAT_MEMBER_UPDATED)) dp.add_handler(ChatMemberHandler(rimuovi_utente, ChatMemberHandler.CHAT_MEMBER_UPDATED)) # su messaggi non comando - rispondi con lo stesso messaggio in Telegram dp.add_handler(MessageHandler(filters.COMMAND, echo)) # Avvia il Bot updater.start_polling() # Esegui il bot fino a quando non si preme Ctrl-C o il processo non riceve SIGINT, # SIGTERM o SIGABRT. Questo dovrebbe essere usato maggiormente per l'esecuzione del bot # in background. updater.idle()
内容的提问来源于stack exchange,提问作者Domenico Aiello
相关产品推荐
相关产品推荐

