为什么需要机器人批量发送文件
在Telegram运营中,经常需要向多个用户或群组发送文件,例如产品资料、电子书、课程视频、发票等。手动逐个发送效率极低,而Telegram机器人提供了官方API,可以编程方式向任意用户或群聊发送文件,实现批量推送。本文将基于Python + python-telegram-bot库,演示如何构建一个稳定、可靠的批量文件发送机器人。
方案概览:三种批量发送模式
- 逐用户发送:遍历用户ID列表,逐个发送文件,适合数量较少、需要精确控制的场景。
- 广播模式:将同一文件同时推送给多个聊天,需要处理速率限制与失败重试。
- 队列模式:使用异步队列控制发送频率,避免触发Flood Control,适合大规模群发。
基础准备:创建机器人与获取用户ID
- 在Telegram中找到@BotFather,发送
/newbot,按提示设置名称和用户名,获得BOT_TOKEN。 - 获取目标用户或群组的Chat ID:可向机器人发送任意消息,然后访问
https://api.telegram.org/bot<你的TOKEN>/getUpdates,在返回的JSON中查找message.chat.id。 - 对于群组,可通过添加机器人到群后,使用
@getidsbot等辅助机器人获取群ID。
核心实现:使用python-telegram-bot发送文件
安装依赖:pip install python-telegram-bot
以下代码演示如何向多个用户发送文件(以图片为例):
from telegram import Bot
from telegram.error import TelegramError
import asyncio
async def send_file_to_users(token, chat_ids, file_path, caption=None):
bot = Bot(token)
for chat_id in chat_ids:
try:
with open(file_path, 'rb') as f:
await bot.send_document(chat_id=chat_id, document=f, caption=caption)
print(f"发送成功: ")
except TelegramError as e:
print(f"发送失败 : ")
await asyncio.sleep(0.5) # 控制频率,避免触发限制
if __name__ == "__main__":
TOKEN = "你的BOT_TOKEN"
USERS = [123456789, 987654321, 555123456] # 替换为目标Chat ID
FILE = "report.pdf"
asyncio.run(send_file_to_users(TOKEN, USERS, FILE))发送其他类型文件,只需替换方法:send_photo、send_video、send_audio、send_document等。
高级技巧:处理大文件与速率限制
- 大文件上传:如果文件超过Telegram限制(最大2GB),考虑使用
send_document的thumb参数或压缩文件。 - Flood Control:Telegram对同一次请求有限制(大约每秒1条消息),使用
time.sleep(1)或更智能的指数退避。 - 错误处理:捕获
TelegramError,区分“Chat not found”和“Bot was blocked”,记录失败列表以便重试。 - 并发优化:使用
asyncio.gather配合信号量控制并发数,提升发送效率而不触发限制。
实战:从Excel名单读取并批量发送
更实际的场景是,用户名单存储在Excel表中。使用pandas读取:
import pandas as pd
df = pd.read_excel("users.xlsx")
chat_ids = df["chat_id"].tolist()
# 然后调用上面的发送函数注意:仅能向已主动与机器人互动的用户发送消息,否则Telegram会限制。
完整部署建议
- 将脚本部署到云服务器或GitHub Actions,定时运行实现日常推送。
- 记录发送日志,便于追溯。
- 为机器人添加管理员权限(若发送到群组),否则可能被限制。
常见问题与解决方案
Q1: 提示“Chat not found”怎么办?
确认Chat ID正确,且用户未屏蔽机器人。若用户从未与机器人对话,需先由用户主动发送/start。
Q2: 发送文件时收到“Bad Request: file is too big”
Telegram对文件大小有限制,机器人在发送时必须提供本地文件或已有文件的file_id,不能直接发送URL。如使用URL,需先调用getFile获取file_id。
Q3: 如何动态修改接收者列表?
可以结合Webhook或定时从数据库读取,或通过机器人命令/subscribe收集用户ID。
总结
Telegram机器人批量发送文件并不复杂,核心是调用sendDocument等API,配合合理的频率控制和错误处理。通过本文的Python示例,你可以快速构建自己的文件群发工具。注意遵守Telegram的使用政策,避免骚扰用户,保护好用户隐私。