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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:31:03