使用python-telegram-bot获取语音文件时遇RuntimeWarning问题求助
解决python-telegram-bot中协程未await的RuntimeWarning问题
错误原因
context.bot.get_file是异步协程方法,调用时必须用await关键字等待其执行完成,否则会触发RuntimeWarning: coroutine 'ExtBot.get_file' was never awaited错误。- 你把机器人应用的初始化代码(
ApplicationBuilder创建实例、添加handler)放在了get_voice异步函数内部,这会导致每次收到语音消息都重复创建应用,逻辑完全错误。
修正后的代码
from telegram import Update from telegram.ext import ApplicationBuilder, CallbackContext, MessageHandler, filters TOKEN = "你的机器人令牌" async def get_voice(update: Update, context: CallbackContext): # 给get_file添加await,等待协程返回文件对象 new_file = await context.bot.get_file(update.message.voice.file_id) # 打印文件对象信息,而不是固定字符串 print(new_file) # 可选:下载语音文件到本地,比如保存为received_voice.ogg # await new_file.download_to_drive("received_voice.ogg") if __name__ == "__main__": # 应用初始化和handler注册只执行一次,放在函数外部 app = ApplicationBuilder().token(TOKEN).build() app.add_handler(MessageHandler(filters.VOICE, get_voice)) # 启动机器人的轮询模式 app.run_polling()
关键修改点
- 调用
context.bot.get_file时添加await,确保协程被正确执行并获取返回结果 - 将机器人应用的初始化逻辑移到
get_voice函数外,放在主程序入口中,避免重复创建应用 - 修正print语句,实际打印文件对象而非固定字符串,方便调试
- 补充了下载文件的示例代码,按需使用
内容的提问来源于stack exchange,提问作者Mahdi mk
相关产品推荐
相关产品推荐

