想象这样一个场景:每天早上九点,你的Telegram频道准时推送一条每日摘要;每周一上午,你的群里自动发布本周工作计划;每小时的整点,你的个人账号收到一条提醒……这些都可以通过Telegram机器人定时发送消息来实现。本教程将带你从零开始,使用Python和schedule库搭建一个完整的定时发送机器人,全程手把手指导,即使没有编程经验也能跟上。
为什么要用机器人定时发送消息?
定时发送消息的应用场景非常广泛:个人提醒、团队协作、内容自动化运营、数据监控报警等。相比手动发送,定时机器人可以做到:
- 精准执行:按照预设时间精确触发,不遗漏、不迟到。
- 高效省力:一次搭建,长期自动运行,节省人力成本。
- 灵活可控:可随时调整发送内容、时间与频率。
前置准备:创建Bot并获取Token
在编写代码之前,你需要有一个Telegram机器人,并获得API Token。如果还没有Bot,请按以下步骤操作:
- 在Telegram中搜索 @BotFather,并启动对话。
- 输入
/newbot,按提示为机器人命名(如MySchedulerBot)。 - 设置机器人的用户名(必须以bot结尾,如MySchedulerBot)。
- 创建成功后,BotFather会返回一串API Token,格式如
123456:ABC-DEF1234...,请务必妥善保存。
另外,你需要知道目标聊天(频道、群组或个人)的chat_id。获取方式最简单的是给机器人发送一条消息,然后通过 getUpdates API 查询,我们将在下文代码中实现。
方法一:使用Python + schedule库实现基础定时发送
这是最轻量、最容易上手的方式。我们使用Python的 schedule 库处理定时任务,用 requests 库调用Telegram Bot API发送消息。
第一步:安装依赖库
在终端中执行以下命令:
pip install schedule requests第二步:编写完整代码
创建脚本文件 scheduled_bot.py,输入以下内容:
import requests
import schedule
import time
import logging
# 配置区
BOT_TOKEN = "123456:YOUR_API_TOKEN" # 将此处替换为你的Bot Token
CHAT_ID = "@your_channel_or_group" # 你的频道/群组ID,如 @MyChannel
TEXT_CONTENT = "这是一条定时消息" # 要发送的内容
# 初始化日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(message)s")
logger = logging.getLogger()
def send_message(text):
"""向指定chat发送文本消息"""
url = f"https://api.telegram.org/bot/sendMessage"
payload = {
"chat_id": CHAT_ID,
"text": text
}
try:
r = requests.post(url, json=payload, timeout=10)
if r.status_code == 200:
logger.info("消息发送成功")
else:
logger.error(f"发送失败: {r.text}")
except Exception as e:
logger.error(f"请求异常: ")
def daily_job():
"""每天要执行的定时任务"""
send_message(TEXT_CONTENT)
# 在这里可以修改每天的内容,例如动态生成
# 设置定时规则
schedule.every().day.at("09:00").do(daily_job) # 每天09:00执行
# schedule.every().monday.at("10:00").do(daily_job) # 每周一10:00执行
# schedule.every().hour.do(daily_job) # 每小时执行
logger.info("机器人定时任务已启动,按 Ctrl+C 停止...")
while True:
schedule.run_pending()
time.sleep(1)第三步:运行脚本
在终端中执行:
python scheduled_bot.py如果你正确配置了Token和Chat ID,脚本会持续运行,并在设定时间发送消息。首次运行前,请先给机器人发一条消息以获取chat_id。
获取chat_id的快速技巧
在脚本开头加上下面的代码,然后运行一次,从日志中读取你的chat_id:
def get_updates():
url = f"https://api.telegram.org/bot/getUpdates"
r = requests.get(url)
data = r.json()
if data["ok"] and data["result"]:
# 打印每条更新中的chat id和text
for update in data["result"]:
print("chat_id:", update["message"]["chat"]["id"], "| text:", update["message"]["text"])
# 在main前调用一次
get_updates()方法二:使用APScheduler实现更强大的调度
如果你需要复杂的调度需求(如cron表达式、动态添加任务、持久化任务),推荐使用 APScheduler。它比schedule功能更丰富,适合生产环境。
安装
pip install apscheduler代码示例
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import requests
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()
BOT_TOKEN = "YOUR_API_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"
def send_message(text):
url = f"https://api.telegram.org/bot/sendMessage"
payload = {"chat_id": CHAT_ID, "text": text}
requests.post(url, json=payload)
# 定义任务
def scheduled_job():
send_message("这是APScheduler定时消息")
# 创建调度器
scheduler = BlockingScheduler()
# 每天9:30执行(cron表达式:分 时 日 月 周)
scheduler.add_job(scheduled_job, CronTrigger(hour=9, minute=30))
# 周一到周五每小时执行一次
# scheduler.add_job(scheduled_job, CronTrigger(day_of_week='mon-fri', hour='*'))
scheduler.start()APScheduler支持时区设置、任务持久化、线程池等,适合更复杂的应用。
将脚本部署到服务器,实现7x24小时运行
本地电脑关机后定时任务就会中断,因此推荐部署到云服务器或树莓派等常开设备。下面以Linux服务器和systemd为例:
- 将脚本上传到服务器,例如
/opt/scheduled_bot/。 - 创建系统服务文件:
sudo nano /etc/systemd/system/telegram-bot.service,内容如下:
[Unit]
Description=Telegram Scheduled Bot
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/scheduled_bot/scheduled_bot.py
WorkingDirectory=/opt/scheduled_bot
Restart=always
RestartSec=10
Environment="PYTHONUNBUFFERED=1"
[Install]
WantedBy=multi-user.target- 启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl start telegram-bot
sudo systemctl enable telegram-bot这样你的定时机器人就会长时间稳定运行了。
常见问题与排错
1. 发送消息时提示“chat not found”
检查CHAT_ID是否正确。若目标为频道,需要将机器人设为频道管理员;若为群组,需将机器人拉入群组。对于个人聊天,需要先由用户主动给机器人发消息,机器人才能向用户发送消息。
2. 定时任务不执行
检查脚本是否持续运行(可能被关闭),查看日志有无报错。另外,schedule库的时区为系统默认时区,请确保服务器时区设置正确,或者在任务配置中显式指定时区。
3. Telegram API发送频率限制
Bot API限制每秒最多1条消息(广播长文本时允许约30条/秒,但受具体条件影响)。如果你的任务量极大,建议增加延时或使用队列。
4. 服务器重启后任务未恢复
按照上文systemd配置,设置Restart=always并enable,即可自动重启并运行。
总结与进阶建议
通过本教程,你已经掌握了Telegram机器人定时发送消息的两种核心方法:轻量的schedule和强大的APScheduler。无论是个人提醒还是企业级自动化,都能轻松应对。进阶玩法还包括:动态获取数据并发送图文消息、结合数据库实现用户个性化推送、使用Webhook实现事件驱动等。
现在就开始动手构建属于你的第一个定时机器人吧!如果在操作中遇到任何问题,欢迎在评论区留言交流。