Telegram机器人定时发送消息搭建教程:Python实现自动推送全攻略

从零开始教你搭建Telegram机器人定时发送消息服务,涵盖Bot创建、Python脚本编写、定时调度与部署,附完整代码和FAQ,助你轻松实现自动化消息推送。

阅读提示建议先浏览文章结构,再按需深入阅读具体段落。

想象这样一个场景:每天早上九点,你的Telegram频道准时推送一条每日摘要;每周一上午,你的群里自动发布本周工作计划;每小时的整点,你的个人账号收到一条提醒……这些都可以通过Telegram机器人定时发送消息来实现。本教程将带你从零开始,使用Python和schedule库搭建一个完整的定时发送机器人,全程手把手指导,即使没有编程经验也能跟上。

为什么要用机器人定时发送消息?

定时发送消息的应用场景非常广泛:个人提醒、团队协作、内容自动化运营、数据监控报警等。相比手动发送,定时机器人可以做到:

  • 精准执行:按照预设时间精确触发,不遗漏、不迟到。
  • 高效省力:一次搭建,长期自动运行,节省人力成本。
  • 灵活可控:可随时调整发送内容、时间与频率。

前置准备:创建Bot并获取Token

在编写代码之前,你需要有一个Telegram机器人,并获得API Token。如果还没有Bot,请按以下步骤操作:

  1. 在Telegram中搜索 @BotFather,并启动对话。
  2. 输入 /newbot,按提示为机器人命名(如MySchedulerBot)。
  3. 设置机器人的用户名(必须以bot结尾,如MySchedulerBot)。
  4. 创建成功后,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为例:

  1. 将脚本上传到服务器,例如 /opt/scheduled_bot/
  2. 创建系统服务文件: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
  1. 启动并设置开机自启:
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实现事件驱动等。

现在就开始动手构建属于你的第一个定时机器人吧!如果在操作中遇到任何问题,欢迎在评论区留言交流。

FAQ

Telegram官方客户端选择

常见问题

如何获取Telegram频道的Chat ID?

最简单的办法:将机器人设为频道管理员,然后在频道中发布一条消息,接着请求 getUpdates API,从返回的 update 中读取 channel_post 的 chat.id 字段。也可以使用 @username 作为 Chat ID,比如 @MyChannel。

定时任务可以设置多个吗?

可以。在 schedule 库中,可以定义多个不同的 job,例如每天9点和18点各执行一次。在 APScheduler 中,可以添加多个触发器不同的 job。

如果脚本崩溃了,如何自动重启?

推荐使用 systemd 服务,配置 Restart=always 和 RestartSec=10,服务退出后会自动重启。也可以使用 supervisor、Docker 等工具管理。