在Telegram生态中,机器人(Bot)是连接服务与用户的桥梁。很多运营者或开发者都希望利用机器人主动向用户推送通知、活动信息或重大更新。然而,Telegram的API设计存在一些限制——机器人无法直接获取用户的“在线状态”,也不能随意向未交互过的用户主动发起会话。那么,如何实现“向在线用户广播消息”呢?本文将为你揭开广播机制的秘密,提供一套安全、高效且合规的实现方案。
一、广播消息的核心原理
Telegram机器人本质上是基于HTTP API的应用程序。要发送任何消息,都需要通过sendMessage方法调用Bot API。广播消息就是批量执行sendMessage,将同一条内容依次发送给多个用户。但机器人有一个硬性限制:只能向主动给机器人发送过消息的用户发起对话。换句话说,用户必须先按“开始”或与机器人产生过交互,机器人才能推送消息。
因此,“向在线用户广播”实际上是指向所有“已订阅”机器人且处于可接收状态的用户发送消息。所谓的“在线状态”无法直接获取,但可以通过用户活跃时间、最近交互记录等间接优化推送时机,提高消息触达率。
二、获取用户ID列表:三种主流方式
要进行广播,首先需要知道向谁发送。以下是常见的收集用户ID的方法:
1. 本地存储用户ID
当用户向机器人发送任何消息时,您的后端会通过getUpdates接口收到包含chat.id的更新对象。您可以将这个ID持久化到数据库,构建自己的订阅者列表。这是最简单、最可靠的方式。
# 伪代码示例(使用python-telegram-bot库)
def start(update, context):
user_id = update.effective_user.id
save_to_db(user_id) # 保存到数据库
2. 通过聊天室成员列表获取
如果您的机器人是群组或频道管理员,可以通过getChatMember或getChatAdministrators接口获取成员ID。但注意:getChatMember只能获取单个成员信息,完整的成员列表需要借助第三方库或多次调用,且Telegram对获取群成员列表有严格限制,不建议大规模爬取。
3. 使用现成的用户管理平台
很多开源项目已经封装了用户注册和广播功能,例如著名的TelegramBotBase、pyTelegramBotAPI等。您可以直接复用这些代码,快速搭建广播系统。
三、使用Bot API发送广播消息
假设您已经有了用户ID列表,接下来就可以逐个调用sendMessage。这里提供一个Python示例,使用requests库实现简单的广播:
import requests
import time
TOKEN = 'YOUR_BOT_TOKEN'
user_ids = [123456789, 987654321] # 从数据库获取
for uid in user_ids:
url = f'https://api.telegram.org/bot/sendMessage'
payload = {
'chat_id': uid,
'text': '你好!这是我们的最新消息。'
}
r = requests.post(url, json=payload)
if r.status_code != 200:
print(f'发送失败: - {r.text}')
time.sleep(0.05) # 控制频率
注意:sendMessage支持parse_mode、reply_markup等参数,您可以根据需要发送富文本或内联按钮。
四、如何实现“在线用户”定向推送?
Telegram没有公开的用户在线状态查询接口,但可以用以下策略提高针对性:
- 根据活跃时段推送:通过分析用户最后一次交互时间,选择大多数用户活跃的时段发送,比如晚上8点到10点。
- 使用发送优先级:优先发送给最近几天内有交互行为的用户,这类用户大概率在线。
- 提供订阅选项:在机器人中增加“接收通知”开关,让用户主动选择接收广播,这既符合隐私要求,又能提高转化率。
- 利用“在线”指示(仅限客户端):如果您使用Telegram客户端,能看到联系人的“最后一次上线”时间,但机器人无法获取,因此只能通过间接方式判断。
五、广播消息的频率限制与最佳实践
Telegram对BOT API有明确的速率限制:每个频道每秒最多30条消息,每个群组/用户每秒最多1条消息(大约每秒钟发送给不同用户的数量也有上限)。如果不节制,机器人会被限制甚至封禁。以下为您提供黄金法则:
- 控制速度:全局发送时,建议每秒不超过20条,并随机延迟0.05~0.1秒。
- 处理错误码:当收到
429(请求过多)错误时,一定要等待retry_after字段指定的时间,否则会被拉黑。 - 分批次发送:将用户列表分成小批次(例如每批100人),每批间隔几秒,并添加日志记录。
- 遵守隐私法规:广播内容应包含退订方式,尊重用户删除聊天记录的权利。在部分国家,未经同意发送营销信息违法,请务必先获得用户授权。
- 测试先行:先向自己的另一个机器人或测试账号发送,确保内容格式正确。
六、总结
Telegram机器人广播消息不是简单的“循环发送”,而需要综合考虑API限制、用户体验和合规性。通过合理构建订阅者列表、优雅地处理速率限制,并借助活跃时段分析,您的机器人完全可以实现高效、精准的消息触达。记住,永远把用户的选择权放在第一位——提供随时退订的入口,才能让广播成为提升价值的工具,而不是打扰用户的噪音。