telebot报coroutine 'claimcode' was never awaited警告排查
问题根因
- 你所用的
telebot(即pyTelegramBotAPI)默认运行在同步模式,register_next_step_handler注册的回调函数会被库以同步方式直接调用,不会自动执行await操作。你传入的claimcode是async def定义的协程函数,被同步调用时只会生成一个未被等待的协程对象,直接触发coroutine 'claimcode' was never awaited的RuntimeWarning。 - 代码存在额外逻辑隐患:当前硬编码
chatid,且将机器人自身发送的提示消息返回值作为register_next_step_handler的第一个参数,多用户同时使用时会出现消息串扰、响应错人的问题。
修复方案
根据你的代码整体架构二选一即可:
方案1:保持同步模式(改动量最小)
移除claimcode的异步定义,异步的兑换接口通过asyncio.run()在同步环境中执行,同时修正传参逻辑,从用户触发指令的消息体中动态获取聊天ID,适配多用户场景。
修复后的业务代码:
import asyncio @bot.message_handler(commands=['redeemcode']) def get_code(message): # 从触发指令的消息中动态获取聊天ID,不要硬编码chatid prompt_msg = bot.send_message(message.chat.id, "Send the Code to Redeem") bot.register_next_step_handler(prompt_msg, claimcode) def claimcode(message): code = message.text.strip() print(code) # 同步环境下调用异步兑换方法 asyncio.run(client.redeem_code(code))
方案2:切换为异步Bot模式
如果你的项目整体用异步逻辑,直接替换为异步版Bot实例,所有消息处理器统一使用协程写法,telebot会自动完成协程的等待调度,不会再出现未await的警告。
修复后的业务代码:
from telebot.async_telebot import AsyncTeleBot import asyncio # 替换原有Bot初始化逻辑,填入你的机器人Token bot = AsyncTeleBot("YOUR_BOT_TOKEN") @bot.message_handler(commands=['redeemcode']) async def get_code(message): prompt_msg = await bot.send_message(message.chat.id, "Send the Code to Redeem") bot.register_next_step_handler(prompt_msg, claimcode) async def claimcode(message): code = message.text.strip() print(code) await client.redeem_code(code) # 异步Bot启动方式 asyncio.run(bot.polling())
注意:如果使用异步模式,项目中所有调用telebot接口的地方都要加
await关键字,否则会再次出现协程未等待的警告。
内容的提问来源于stack exchange,提问作者dedSec PC
相关产品推荐
相关产品推荐

