Telegram机器人启动报错:Updater.__init__()收到意外参数'token'求助
问题原因
你遇到的错误是因为代码基于python-telegram-bot v13及更早版本编写,但当前安装的是v20+的新版本。v20+版本彻底重构了API,移除了Updater类,并且参数结构完全变更,导致旧代码的Updater(token=TOKEN, use_context=True)调用完全不兼容。
两种解决方案
方案1:降级到兼容的旧版本
如果你想继续使用现有代码,只需将python-telegram-bot降级到v13.x系列(最后一个稳定版是13.7):
pip uninstall python-telegram-bot pip install python-telegram-bot==13.7
同时修正原代码中的导入错误(v13版本中过滤器类为大写Filters):
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
方案2:适配v20+新版本代码
如果要使用最新版本的库,需要重构代码,核心变更点包括:用Application替代Updater、调整handler注册逻辑、改用异步函数、优化任务队列调用方式。
修改后的完整代码:
import datetime import logging from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext from telegram import Update # 配置日志 logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) TOKEN = 'BOT-TOKEN' # 处理setreminder命令 async def set_reminder(update: Update, context: CallbackContext): chat_id = update.effective_chat.id text = update.message.text try: parts = text.split(' ', 2) if len(parts) < 3: await update.message.reply_text('格式错误!请使用:/setreminder <任务内容> <YYYY-MM-DD HH:MM:SS>') return task = parts[1] time_str = parts[2] time_obj = datetime.datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S') now = datetime.datetime.now() if time_obj <= now: await update.message.reply_text('Время напоминания должно быть больше текущего времени!') return delta = time_obj - now seconds = delta.total_seconds() context.job_queue.run_once(send_reminder, seconds, data={'chat_id': chat_id, 'task': task}) await update.message.reply_text('Напоминание установлено!') except Exception as e: await update.message.reply_text(f'Произошла ошибка: {str(e)}') # 发送提醒 async def send_reminder(context: CallbackContext): job = context.job chat_id = job.data['chat_id'] task = job.data['task'] await context.bot.send_message(chat_id=chat_id, text=f'Напоминание: {task}') # 错误处理 async def error(update: Update, context: CallbackContext): logger.warning('Update "%s" caused error "%s"', update, context.error) if __name__ == '__main__': application = Application.builder().token(TOKEN).build() application.add_handler(CommandHandler("setreminder", set_reminder)) application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, set_reminder)) application.add_error_handler(error) application.run_polling()
新版本关键变更说明
- 所有处理器函数必须改为异步函数(添加
async关键字,调用Telegram API方法时加await) - 用
Application.builder().token(TOKEN).build()替代原Updater初始化逻辑 - 定时任务的上下文数据改用
data参数(原context参数已被重命名) - 直接使用
context.bot发送消息,无需单独创建telegram.Bot实例 - 过滤器统一使用小写的
filters(v20+版本规范)
内容的提问来源于stack exchange,提问作者YURII S
相关产品推荐
相关产品推荐

