如何使用Python Telegram Bot在无用户指令触发时主动发送消息
Telegram Bot主动发消息实现方案
核心原理
Telegram Bot支持主动发消息,不需要依赖用户发送指令触发回调,核心前提是你提前获取到目标接收方的chat_id(可以是用户id、群组id、频道id),且bot有向该chat_id发消息的权限。
你原来的写法问题在于,messager是用户指令触发的回调函数,依赖用户发消息时生成的update对象,主动发送场景没有这个对象,完全不需要调用这个回调,直接调用bot的原生发消息方法即可。
实现方案
1. 提前获取chat_id
先给你的bot发送任意消息,在回调函数中打印update.effective_chat.id就能拿到你自己的用户chat_id,存下来备用。
2. 修正后的代码示例
from telegram.ext import Updater, CommandHandler, CallbackContext from telegram import Update from datetime import datetime import logging API_KEY = "替换为你的bot token" # 替换为你提前拿到的目标chat_id TARGET_CHAT_ID = 123456789 logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) # 原有的用户指令触发回调 def messager(update: Update, context: CallbackContext) -> None: update.message.reply_text("message back") # 独立的主动发消息方法 def send_active_msg(bot, content: str): bot.send_message(chat_id=TARGET_CHAT_ID, text=content) if __name__ == "__main__": updater = Updater(API_KEY) dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler("message", messager)) # 程序启动时单次触发判断 start_condition = True if start_condition: send_active_msg(updater.bot, "程序启动,主动推送的测试消息") # 定时/周期性触发场景,用自带JobQueue实现 def condition_check_task(context: CallbackContext): # 这里写你的触发条件逻辑,比如时间判断、接口数据判断、监控告警判断等 trigger_flag = datetime.now().minute % 30 == 0 # 示例:每半小时触发一次 if trigger_flag: context.bot.send_message(chat_id=TARGET_CHAT_ID, text="满足周期性条件,主动推送消息") # 添加周期性任务,每60秒检查一次条件 dispatcher.job_queue.run_repeating(condition_check_task, interval=60, first=0) updater.start_polling() updater.idle()
3. 实时事件触发方案
如果你的触发条件是实时异步事件(比如新订单通知、服务器告警),可以单独开一个守护线程跑事件监听逻辑,满足条件时直接调用updater.bot.send_message发送消息即可,不会和bot的polling逻辑冲突。
注意事项
- bot无法主动给从未和它产生过交互的用户发消息,必须是用户先给bot发过消息,或者bot被加入对应群组/频道且拥有发消息权限
- 不要硬传
update和context参数给主动发消息的逻辑,这两个参数只有用户触发回调的时候才会生成,主动发送场景完全不需要
内容的提问来源于stack exchange,提问作者Astudent
相关产品推荐
相关产品推荐

