在Telegram Bot开发中,发送文档文件是极为常见的需求——无论是自动报告、媒体推送,还是用户请求的附件传输,掌握sendDocument方法的正确用法都至关重要。本文将从API基础讲起,提供可直接运行的完整代码示例,并深入解析参数细节与常见陷阱,帮助你快速实现稳定可靠的文件发送功能。
一、Telegram Bot发送文档的基础概念
Telegram Bot API提供了sendDocument方法,用于向指定聊天发送文件。与sendPhoto、sendVideo不同,sendDocument适用于任意格式的文件(PDF、ZIP、DOCX等),且Telegram会将其作为“文档”处理,用户可直接下载或转发。
调用sendDocument时,你需要通过chat_id指定接收方,并通过document参数传递文件。文件来源可以是本地文件(使用multipart/form-data上传)、文件ID(已上传过的文件可直接复用),或文件URL(Telegram会自行下载)。以下各节将分别演示。
二、准备工作:获取Bot Token与聊天ID
在编写代码前,请确保你已经:
- 在Telegram中通过
@BotFather创建了机器人,并获取到API Token(形如123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11)。 - 确定了接收文件的
chat_id(用户ID、群组ID或频道ID)。对于私人对话,可直接使用自己的用户ID;对于群组,通常以-100开头。
获取用户ID的快速方法:将@userinfobot加入对话,或向你的Bot发送消息后通过API查看getUpdates响应。
三、Python完整代码示例(使用python-telegram-bot库)
推荐使用官方维护的python-telegram-bot库。首先安装:
pip install python-telegram-bot
示例1:发送本地文件
from telegram import Bot
# 将Token填入此处
bot = Bot(token="YOUR_BOT_TOKEN")
CHAT_ID = "YOUR_CHAT_ID" # 例如 "123456789" 或 "-1001234567890"
# 发送本地文件(支持相对路径或绝对路径)
with open("report.pdf", "rb") as f:
message = bot.send_document(chat_id=CHAT_ID, document=f, filename="月度报告.pdf", caption="这是月度报告")
print("发送成功,消息ID:", message.message_id)
示例2:通过URL发送远程文件
from telegram import Bot
bot = Bot(token="YOUR_BOT_TOKEN")
CHAT_ID = "YOUR_CHAT_ID"
url = "https://example.com/files/spec.pdf"
# 注意:Telegram需要能够直接访问该URL,否则会报错
message = bot.send_document(chat_id=CHAT_ID, document=url, caption="远程文档")
print(message)
示例3:使用file_id发送已上传文件
# 获取file_id的典型方式:接收用户发送的文档后,从update中提取
# file_id = update.message.document.file_id
# 之后可直接反复使用,无需重新上传
bot.send_document(chat_id=CHAT_ID, document="BQACAgQAAxkBAAIB..." )
四、Node.js完整代码示例(使用node-telegram-bot-api)
对于JavaScript开发者,可安装node-telegram-bot-api:
npm install node-telegram-bot-api
const TelegramBot = require('node-telegram-bot-api');
const token = 'YOUR_BOT_TOKEN';
const chatId = 'YOUR_CHAT_ID';
const bot = new TelegramBot(token, { polling: true });
// 发送本地文件
bot.sendDocument(chatId, 'report.pdf', { caption: '节点示例' })
.then(msg => console.log('发送成功', msg.message_id))
.catch(err => console.error('错误', err));
// 发送远程文件
bot.sendDocument(chatId, 'https://example.com/spec.pdf')
.then(() => console.log('远程已发送'));
// 发送Buffer或流
const fs = require('fs');
bot.sendDocument(chatId, fs.createReadStream('report.pdf'));
五、使用HTTP API直接调用(curl示例)
若不依赖任何SDK,可通过原生HTTP请求实现。以下为使用curl发送本地文件的示例:
curl -F "chat_id=YOUR_CHAT_ID" \
-F "document=@/path/to/file.pdf" \
-F "caption=来自curl的文档" \
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/sendDocument
注意:document参数需使用@前缀指定本地文件路径。若发送URL,则直接传入字符串,但需保证URL可公开访问。
六、常用参数详解与自定义
sendDocument支持以下常用参数,合理使用可增强交互性:
caption:文件标题,最长1024字符,支持HTML或Markdown格式。parse_mode:设置caption的格式(HTML或MarkdownV2),需与实体配合。filename:覆盖Telegram显示的文件名。thumbnail:缩略图(仅限JPEG或PNG,且小于200KB),提升视觉体验。disable_notification:静默发送,不打扰用户。reply_to_message_id:回复某条消息,便于上下文关联。reply_markup:附加内联键盘或自定义键盘。
示例:带缩略图和内联按钮
from telegram import Bot, InlineKeyboardButton, InlineKeyboardMarkup
bot = Bot(token="YOUR_BOT_TOKEN")
keyboard = InlineKeyboardMarkup([
[InlineKeyboardButton("下载文件", url="https://example.com/dl")]
])
with open("guide.pdf", "rb") as f:
bot.send_document(
chat_id=CHAT_ID,
document=f,
filename="使用指南.pdf",
caption="PDF指南",
parse_mode="HTML",
thumbnail=open("thumb.jpg", "rb"),
reply_markup=keyboard
)
七、常见错误与解决方案
- 文件过大:Telegram Bot API限制上传文件最大50MB(通过Bot发送),下载则可达20MB。超过需使用本地Bot或分割文件。
- chat_id无效:确保用户或群组未屏蔽机器人,且ID格式正确。群组ID通常为负数。
- 文件格式不支持:某些MIME类型可能被拒,建议使用通用格式(如PDF、ZIP)。
- URL无法访问:Telegram服务器无法解析你的URL时,会返回
Bad Request: wrong URL,请使用公网可访问的HTTPS地址。 - 429请求过多:触发限流时,需等待retry_after秒后重试。
八、完整实战:实现一个自动发送日报的Bot
下面是一个综合示例,脚本每日生成日志文件,并自动发送到指定群组:
import logging
from datetime import datetime
from telegram import Bot
logger = logging.getLogger(__name__)
TOKEN = "YOUR_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"
# 生成当日报告文件
def generate_report():
filename = f"daily_report_{datetime.now().strftime('%Y%m%d')}.txt"
with open(filename, "w", encoding="utf-8") as f:
f.write(f"日期: {datetime.now().date()}\n")
f.write("项目状态: 完成\n")
return filename
# 发送文件
def send_report():
bot = Bot(token=TOKEN)
file_path = generate_report()
try:
with open(file_path, "rb") as f:
bot.send_document(chat_id=CHAT_ID, document=f, caption="每日报告自动推送")
logger.info("发送成功")
except Exception as e:
logger.error(f"发送失败: ")
finally:
import os
os.remove(file_path) # 清理临时文件
if __name__ == "__main__":
send_report()
将此脚本部署为定时任务(cron或系统计划程序),即可实现无人值守的日报推送。
九、性能与安全建议
- 复用file_id:对于频繁发送的相同文件,先上传一次获取file_id,后续直接使用可大幅提升速度并减少资源消耗。
- 使用HTTPS:确保你的服务器支持HTTPS,避免中间人攻击。
- 限制文件类型:对于不可信来源,在服务端校验MIME类型和大小,防止恶意文件传播。
- 日志监控:记录发送结果,便于排查问题。
总结
本文提供了Telegram Bot发送文档文件的多种完整代码示例,涵盖Python、Node.js和原生HTTP调用方式。从本地文件、远程URL到file_id复用,你可以根据实际场景灵活选择。关键在于理解sendDocument的参数细节和潜在错误,并遵循最佳实践。掌握了这些,你就能轻松构建自动化文件分发、报告推送等实用Bot。更多高级玩法,不妨查阅官方API文档并动手实践。