0

0

Aiogram 3:高效发送远程音频文件(URL)的教程

碧海醫心

碧海醫心

发布时间:2025-09-21 10:00:10

|

327人浏览过

|

来源于php中文网

原创

Aiogram 3:高效发送远程音频文件(URL)的教程

本教程旨在解决Aiogram 3机器人开发中,从远程URL发送音频文件时遇到的“InputFile抽象类实例化”错误。我们将探讨两种推荐的解决方案:使用InputMediaAudio对象或更简洁地直接传递URL给bot.send_audio方法,帮助开发者避免不必要的本地文件处理,实现高效的远程音频发送功能。

Aiogram 3中发送远程音频的常见挑战

aiogram 3中开发telegram机器人时,开发者经常需要处理从远程链接(如mp3文件的url)发送音频的需求。一个常见的尝试是先通过requests库下载文件内容到内存中的bytesio对象,然后尝试将其包装成inputfile发送。然而,这种做法通常会导致以下错误:

import requests
from io import BytesIO
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command, CommandStart
from aiogram.types import Message, BotCommand
from aiogram.types.input_file import InputFile # 错误的用法
from config_weather import TOKEN_BOT # 假设这是你的配置

bot = Bot(token=TOKEN_BOT)
dp = Dispatcher()

@dp.message(lambda link: '.mp3' in link.text)
async def process_mp3_link(message: Message):
    try:
        # 尝试下载并用 InputFile 包装,这是错误的根源
        mp3_file = BytesIO(requests.get(message.text).content)
        await bot.send_audio(chat_id=message.chat.id, audio=InputFile(mp3_file))
    except Exception as ex:
        await message.answer('Error!')
        print(ex)

if __name__ == '__main__':
    dp.run_polling(bot)

当运行上述代码并发送一个MP3链接时,终端会抛出异常:Can't instantiate abstract class InputFile with abstract method read。

错误解析:InputFile的抽象性质

这个错误的核心在于aiogram.types.input_file.InputFile是一个抽象基类。这意味着它不能被直接实例化。它定义了一个抽象方法read,要求其子类必须实现这个方法来处理文件的读取逻辑。当您尝试 InputFile(mp3_file) 时,实际上是试图实例化一个未实现所有抽象方法的类,从而导致运行时错误。

对于远程URL,Aiogram提供了更直接、更优雅的解决方案,无需手动下载文件到BytesIO并尝试用抽象类包装。

解决方案一:使用 InputMediaAudio 对象

InputMediaAudio是Aiogram中用于发送音频媒体的特定对象,它允许您直接指定媒体的URL。当您需要发送一个远程音频文件时,这是非常有效且推荐的方法之一。

from aiogram.types import InputMediaAudio

@dp.message(lambda link: '.mp3' in link.text)
async def process_mp3_link_with_input_media_audio(message: Message):
    try:
        # 直接使用 InputMediaAudio,将URL作为 media 参数
        await bot.send_audio(
            chat_id=message.chat.id,
            audio=InputMediaAudio(media=message.text)
        )
    except Exception as ex:
        await message.answer('发送音频失败!')
        print(f"发送音频时发生错误: {ex}")

这种方法告诉Telegram,您希望发送一个位于特定URL的音频文件。Telegram服务器会直接从该URL获取文件并发送给用户,避免了您的机器人服务器作为中间人下载和上传的开销。

拍我AI
拍我AI

AI视频生成平台PixVerse的国内版本

下载

解决方案二:直接传递 URL (推荐)

最简洁、最推荐的方法是直接将音频文件的URL作为bot.send_audio方法的audio参数传递。Aiogram的send_audio方法被设计为可以直接接受远程URL,极大地简化了代码。

@dp.message(lambda link: '.mp3' in link.text)
async def process_mp3_link_direct(message: Message):
    try:
        # 直接将URL作为 audio 参数传递
        await bot.send_audio(
            chat_id=message.chat.id,
            audio=message.text
        )
    except Exception as ex:
        await message.answer('发送音频失败!')
        print(f"发送音频时发生错误: {ex}")

这种方法是首选,因为它最为简洁,且同样利用了Telegram服务器直接处理URL的机制,减轻了机器人服务器的负担。

完整示例代码

下面是一个结合了两种推荐方法的完整Aiogram 3机器人示例:

import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.filters import CommandStart
from aiogram.types import Message, InputMediaAudio

# 请替换为您的机器人Token
TOKEN_BOT = "YOUR_BOT_TOKEN" 

bot = Bot(token=TOKEN_BOT)
dp = Dispatcher()

# 示例:使用直接URL传递方式 (推荐)
@dp.message(lambda link: link.text.startswith('http') and '.mp3' in link.text)
async def process_mp3_link_direct(message: Message):
    try:
        await message.answer("正在尝试直接发送音频...")
        await bot.send_audio(
            chat_id=message.chat.id,
            audio=message.text,
            caption="这是通过直接URL发送的音频!"
        )
        await message.answer("音频发送成功!")
    except Exception as ex:
        await message.answer('发送音频失败!请检查链接是否有效或稍后再试。')
        print(f"发送音频时发生错误 (直接URL): {ex}")

# 示例:使用 InputMediaAudio 对象方式
@dp.message(CommandStart())
async def send_welcome(message: Message):
    await message.answer("你好!请发送一个MP3链接给我,我将尝试发送它。")
    await message.answer("您也可以尝试发送一个指令 `/send_media_audio` 来体验 InputMediaAudio 方式。")

@dp.message(lambda link: link.text == '/send_media_audio')
async def process_mp3_link_with_input_media_audio(message: Message):
    # 假设一个示例MP3链接
    example_mp3_url = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" 
    try:
        await message.answer("正在尝试通过 InputMediaAudio 发送音频...")
        await bot.send_audio(
            chat_id=message.chat.id,
            audio=InputMediaAudio(media=example_mp3_url, caption="这是通过 InputMediaAudio 发送的示例音频!")
        )
        await message.answer("音频发送成功!")
    except Exception as ex:
        await message.answer('发送音频失败!请检查链接是否有效或稍后再试。')
        print(f"发送音频时发生错误 (InputMediaAudio): {ex}")

async def main():
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())

注意事项与最佳实践

  1. 异常处理: 始终对网络请求和Telegram API调用进行适当的try-except异常处理。网络问题、无效URL或Telegram API的限制都可能导致发送失败。
  2. URL有效性: 确保您提供的URL是直接可访问的MP3文件链接。某些网站可能需要认证或有防盗链机制,导致Telegram无法直接访问。
  3. 文件大小限制: Telegram对可以发送的文件大小有严格的限制(通常为50MB)。如果您的音频文件过大,可能会发送失败。
  4. 性能考量: 直接传递URL或使用InputMediaAudio方式,都可以让Telegram服务器直接从源URL下载文件。这比您的机器人先下载文件再上传要高效得多,尤其是在处理大型文件或高并发请求时。它减少了机器人服务器的带宽和CPU负载。
  5. 元数据: send_audio方法还支持caption(标题)、duration(时长)、performer(表演者)、title(歌曲标题)和thumbnail(缩略图)等参数,您可以根据需要提供这些信息以丰富用户体验。当使用InputMediaAudio时,这些参数可以直接作为InputMediaAudio对象的属性传递。

总结

在Aiogram 3中发送远程音频文件时,避免直接实例化抽象的InputFile类。最推荐且最简洁的方法是直接将音频文件的URL作为bot.send_audio方法的audio参数。如果需要更复杂的媒体对象控制,InputMediaAudio也是一个有效的选择。这两种方法都利用了Telegram服务器直接处理远程链接的能力,从而优化了性能并简化了机器人代码。遵循这些最佳实践,您的Aiogram机器人将能更高效、稳定地处理远程音频发送任务。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

465

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

3

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

14

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号