
在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。
这个错误的核心在于aiogram.types.input_file.InputFile是一个抽象基类。这意味着它不能被直接实例化。它定义了一个抽象方法read,要求其子类必须实现这个方法来处理文件的读取逻辑。当您尝试 InputFile(mp3_file) 时,实际上是试图实例化一个未实现所有抽象方法的类,从而导致运行时错误。
对于远程URL,Aiogram提供了更直接、更优雅的解决方案,无需手动下载文件到BytesIO并尝试用抽象类包装。
InputMediaAudio是Aiogram中用于发送音频媒体的特定对象,它允许您直接指定媒体的URL。当您需要发送一个远程音频文件时,这是非常有效且推荐的方法之一。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
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获取文件并发送给用户,避免了您的机器人服务器作为中间人下载和上传的开销。
最简洁、最推荐的方法是直接将音频文件的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())在Aiogram 3中发送远程音频文件时,避免直接实例化抽象的InputFile类。最推荐且最简洁的方法是直接将音频文件的URL作为bot.send_audio方法的audio参数。如果需要更复杂的媒体对象控制,InputMediaAudio也是一个有效的选择。这两种方法都利用了Telegram服务器直接处理远程链接的能力,从而优化了性能并简化了机器人代码。遵循这些最佳实践,您的Aiogram机器人将能更高效、稳定地处理远程音频发送任务。
以上就是Aiogram 3:高效发送远程音频文件(URL)的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号