引言:为什么音频发送与众不同
在Telegram机器人的众多媒体类型中,音频(Audio)一直占据特殊地位。与普通文档或语音消息不同,音频文件拥有独立的元数据体系:封面、时长、表演者、标题等字段共同构成了一个完整的“音乐播放器”体验。无论你是开发音乐分享机器人、播客订阅Bot,还是需要发送有声书,理解sendAudio的每一个参数都至关重要。本文将从零开始,为你拆解Telegram Bot API中发送音频文件的全部参数,并给出可直接落地的代码片段。
sendAudio方法概览
在Telegram Bot API中,发送音频文件的请求端点位于POST bot/sendAudio,与发送其他媒体相比,它提供了更丰富的音乐相关字段。其核心参数可分为三大类:文件定位参数、音乐元数据参数、回复与界面参数。下面逐个详解。
文件定位参数:chat_id与audio(必选)
- chat_id — 必填,整数或字符串。会话的唯一标识,可以是用户ID、群组ID(负数)或频道ID(需 @ 前缀)。例如群组ID通常形如
-1001234567890。 - audio — 必填。该参数接受三种来源:
- 文件ID:将已存在Telegram服务器上的音频文件ID直接传入,格式为字符串,例如
AwADBAADb2QAAp5idQI...。这是最推荐的方式,因为无需重新上传,且响应速度快。 - HTTP URL:传递一个公开可访问的音频文件链接。Telegram会自动下载并发送,但建议仅在文件较小且稳定性有保障时使用。
- multipart/form-data上传:将本地文件作为multipart表单中的
audio字段上传,适用于新建文件或初次发送。
- 文件ID:将已存在Telegram服务器上的音频文件ID直接传入,格式为字符串,例如
音乐元数据参数:让音频更有信息量
这是sendAudio区别于sendDocument的关键所在。Telegram允许你在发送时附加一系列音乐标签,使客户端能显示精美的播放界面。
- title — 可选的字符串,音频标题。如果不填写,Telegram会尝试从文件名或ID3标签中提取。但建议显式提供,避免乱码。
- performer — 可选的字符串,表演者或艺术家名称。用于在播放器中显示“作者”信息。
- duration — 可选的整数,音频时长(秒)。如果省略,Telegram会通过解码自动检测。对于大文件,手动指定可减少网络等待。
- thumbnail — 可选的图片文件。这里需要注意:缩略图需要先作为
photo上传获得file_id,或者直接传递URL/multipart文件。缩略图必须是JPEG格式(或支持WebP),尺寸限制在200KB以内,建议尺寸为800x800像素。合理设置封面图能大幅提升用户体验。 - album_thumb — 这个参数已弃用,请勿使用。
回复与界面参数:控制消息行为
除了音乐属性,你还可以控制消息的回复方式、附加说明等。
- caption — 可选的字符串,音频说明文字。支持最多1024个字符,可以使用换行符和行内链接(格式为
[文本](URL))。例如:来自《XX专辑》特别放送。 - parse_mode — 可选的字符串,用于解析caption的格式。支持
HTML或MarkdownV2。当你的说明包含特殊字符时,记得转义。 - caption_entities — 可选的实体数组,如果不想用parse_mode,可以手动传递格式化实体(如加粗、斜体)。
- reply_to_message_id — 可选的整数,指定要回复的消息ID。适合在对话中引用场景。
- reply_markup — 可选的InlineKeyboardMarkup或ReplyKeyboardMarkup,用于在音频消息下方显示自定义按钮。
实战:Python(aiogram)完整示例
以下代码展示了如何通过aiogram发送本地音频文件,并附带封面和元数据。假设你已安装aiogram库并设置好Bot Token。
import asyncio
from aiogram import Bot, Dispatcher, types
async def main():
bot = Bot(token="YOUR_BOT_TOKEN")
dp = Dispatcher(bot)
# 方式1:使用URL发送音频(注意需公网可访问)
await bot.send_audio(
chat_id=123456789,
audio="https://example.com/audio.mp3",
title="夏日协奏曲",
performer="V.A.",
duration=232,
caption="点击上方播放器收听"
)
# 方式2:使用本地文件上传并附加缩略图
with open("audio.mp3", "rb") as f, open("cover.jpg", "rb") as img:
# 先上传缩略图获得file_id
thumb = await bot.send_photo(chat_id=123456789, photo=img)
thumb_id = thumb.photo[-1].file_id
# 发送音频
await bot.send_audio(
chat_id=123456789,
audio=f,
title="本地音频示例",
performer="开发者",
thumbnail=thumb_id,
caption="附有封面图的音频"
)
await dp.start_polling()
if __name__ == "__main__":
asyncio.run(main())实战:Node.js(node-telegram-bot-api)示例
对于Node.js开发者,可以使用著名的node-telegram-bot-api库。下面示例展示用文件流发送并指定参数:
const TelegramBot = require('node-telegram-bot-api');
const fs = require('fs');
const bot = new TelegramBot('YOUR_BOT_TOKEN', { polling: true });
// 使用URL
bot.sendAudio(123456789, 'https://example.com/audio.mp3', {
title: 'Sunny Day',
performer: 'Artist Band',
duration: 190,
caption: '送给大家一首歌'
});
// 使用文件流上传并附带缩略图(缩略图需先获取file_id)
async function sendWithThumb() {
const photoResp = await bot.sendPhoto(123456789, 'cover.jpg');
const thumbId = photoResp.photo[0].file_id;
const audioStream = fs.createReadStream('audio.mp3');
await bot.sendAudio(123456789, audioStream, {
title: 'Local Song',
performer: 'Artist',
thumbnail: thumbId,
caption: '本地音频+封面'
});
}
sendWithThumb();常见问题与避坑指南
1. 缩略图上传顺序问题:缩略图不能直接作为multipart的String传入URL,必须先上传缩略图获得file_id,再在sendAudio中引用。否则会报错。
2. 文件格式与扩展名:Telegram对音频格式没有严格限制,但为了更好的兼容性,建议使用MP3、M4A或OGG。如果上传的是非音频扩展名(如.mp3但实际是音乐文件),客户端可能无法播放。
3. 从回复中获取file_id:每次发送后,API响应中会返回文件ID,请妥善保存。后续发送可复用file_id,减少上传流量和处理延迟。
4. 性能优化:当需要批量发送时,建议先上传文件获得file_id,再利用file_id进行快速发送;若音频较大且频繁发送,考虑使用Telegram Bot API的getFile方法获取文件路径,减轻服务器压力。
总结
掌握sendAudio的API参数,不仅能让你构建出功能完备的音乐机器人,还能提升用户收听体验。本文详细介绍了每个字段的作用,并给出了两种主流语言的可运行示例。在实际开发中,请务必测试不同参数组合以观察客户端展示效果。如果你需要更深入的案例,例如如何利用键盘按钮切换曲目,欢迎查阅本站其他文章。