如何与持续运行的Python脚本通信?Telegram bot接收网页操作通知方案
合理实现方案
最优方案:回调机制完全替换轮询
这是资源占用最低、实时性最高的方案,核心逻辑是把「bot主动查状态」改成「网页操作完成后主动通知bot」:
- 给用户发送的网页链接中携带唯一标识参数:可以将用户的Telegram ID加密后作为参数拼接在链接后,也可以生成独立的
state随机串,将state和对应用户的Telegram ID绑定存储在Redis这类缓存中,设置24小时自动过期清理无效数据 - 在网页服务的绑定成功逻辑末尾,直接触发bot发消息:
- 如果网页服务和bot服务内部互通,网页后端直接拿到对应用户的Telegram ID,调用Telegram Bot的
sendMessage接口推送确认消息即可 - 如果两者是分离部署的,给bot侧新增一个轻量的内部HTTP接口,网页绑定成功后向该接口发送POST请求,携带用户Telegram ID和通知内容,bot侧收到请求后发送消息即可,注意给内部接口加固定token鉴权,避免恶意调用
- 如果网页服务和bot服务内部互通,网页后端直接拿到对应用户的Telegram ID,调用Telegram Bot的
备选方案:异步延迟任务替代全量轮询
如果无法修改网页服务添加回调逻辑,可以用异步任务队列降低轮询的资源消耗:
- 用户点击启动bot、收到网页链接时,往异步任务队列(比如Celery)添加一个延迟任务,延迟时间设置为你允许的用户最长操作等待时间(比如2小时)
- 延迟任务触发时,仅查询当前对应用户的绑定状态,已完成就推送成功消息,未完成就推送超时提醒或者直接终止任务即可
- 该方案无需全量扫描数据库,每个发起绑定的用户仅会触发一次查询,资源占用比固定间隔全量轮询低90%以上
现有轮询方案临时优化
如果暂时只能保留轮询逻辑,可以做以下优化降低消耗:
- 仅查询最近24小时内发起绑定、且未标记为完成的用户,不要扫描全表
- 动态调整轮询间隔:用户刚收到链接的前10分钟轮询间隔设为1分钟,之后拉长到5分钟,超过24小时未操作的用户直接移出轮询列表
内容的提问来源于stack exchange,提问作者user8094488
相关产品推荐
相关产品推荐

