5

我正在使用 制作 Telegram 机器人python-telegram-bot,我需要某种方式来接收语音消息。为此,我需要下载它们,为此,我必须获得它们file_id的 s。但是,MessageHandler句柄...嗯,消息,并Handler给了我一个NotImplementedError. 有没有办法得到file_id

4

4 回答 4

7

我知道这个问题很老,但我在最新版本(12+)中遇到了这个问题

因此,回调函数中的 botpass_user_data 似乎已被弃用,从现在开始,您应该使用基于上下文的回调。

CallbackContext 是一个对象,它包含有关更新、错误或作业的所有额外上下文信息。

使用 CallbackContext 的新样式:

def voice_handler(update: Update, context: CallbackContext):
    file = context.bot.getFile(update.message.audio.file_id)
    file.download('./voice.ogg')

您可以在Transition-guide-to-Version-12.0中阅读更多内容

于 2019-12-03T08:47:59.887 回答
4

下载语音消息的最简单方法是使用语音过滤器注册 MessageHandler。文档提供了有关过滤器语音模块的更多信息。

import telegram
from telegram.ext import Updater

def voice_handler(bot, update):
    file = bot.getFile(update.message.voice.file_id)
    print ("file_id: " + str(update.message.voice.file_id))
    file.download('voice.ogg')

updater = Updater(token='TOKEN')
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.voice, voice_handler))
于 2016-12-20T23:36:04.927 回答
2

在 13+ 版本中,您需要使用 update.message。语音.file_id 而不是 update.message。音频.file_id。所以代码将是:

def voice_handler(update: Update, context: CallbackContext):
    file = context.bot.getFile(update.message.voice.file_id)
    file.download('./voice.ogg')
于 2021-03-29T04:30:12.133 回答
2

我将向您展示一个带有照片文件的示例,但它适用于任何文件(您只需要更改参数)

from telegram.ext import Updater, CommandHandler
from telegram.ext.callbackcontext import CallbackContext
from telegram.update import Update

def start (update: Update, context: CallbackContext):

    # getting chat_id:
    chatID = update.effective_chat.id

    # sending the photo to discover its file_id:
    photo1 = context.bot.send_photo(chat_id=chatID, photo=open('photo1.jpg','rb'))
    photo1_fileID = photo1.photo[-1].file_id
    context.bot.send_message(chat_id=update.effective_chat.id, text=('file_id photo1.jpg = ' + photo1_fileID))

def main():
    updater = Updater(token='TOKEN', use_context=True)
    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler('start', start))

    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()
于 2021-11-05T05:37:44.940 回答