telegram 机器人本身不具备“自动唤醒”或“离线执行”能力,必须持续运行在一台 24/7 在线的服务器上;本地电脑关机即停止发送,需借助云平台(如 pythonanywhere、heroku 或 vps)实现真正的每日定时推送。
telegram 机器人本身不具备“自动唤醒”或“离线执行”能力,必须持续运行在一台 24/7 在线的服务器上;本地电脑关机即停止发送,需借助云平台(如 pythonanywhere、heroku 或 vps)实现真正的每日定时推送。
要让 Telegram 机器人真正实现「每天 00:01 自动向群组发送消息」,关键不在于代码逻辑是否正确,而在于运行环境是否始终在线。你当前的 requests.get(url) 方式虽能成功发消息,但 schedule 库仅在 Python 进程活跃时生效——一旦本地电脑关机、休眠或网络中断,任务立即失效,且不会补发。
✅ 正确架构应为:常驻进程 + 可靠调度 + 持久化托管
✅ 推荐方案:使用轻量级 Web 服务 + APScheduler(更健壮替代 schedule)
schedule 库适合开发调试,但生产环境建议改用 APScheduler(Advanced Python Scheduler),它支持持久化作业存储、多任务协程及错误恢复机制。以下是一个可直接部署的最小可行示例:
# bot_runner.py
from apscheduler.schedulers.blocking import BlockingScheduler
import requests
import logging
# 配置日志(便于排查线上问题)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
TOKEN = "YOUR_ACTUAL_BOT_TOKEN" # ⚠️ 务必替换为真实 Token,勿硬编码于公开仓库
GROUP_CHAT_ID = "-1001234567890" # ⚠️ 注意:群组 ID 必须是负数(超群 ID 格式),且需确保 Bot 已被添加为管理员
POST_TEXT = "? 每日提醒:今天也要元气满满!"
def send_message():
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
payload = {
"chat_id": GROUP_CHAT_ID,
"text": POST_TEXT,
"parse_mode": "Markdown" # 可选:支持格式化
}
try:
resp = requests.post(url, data=payload, timeout=10)
resp.raise_for_status()
logger.info("✅ 消息已成功发送到群组")
except Exception as e:
logger.error(f"❌ 发送失败:{e}")
if __name__ == "__main__":
scheduler = BlockingScheduler()
# 设置每日 00:01 执行(注意:服务器时区决定实际触发时间)
scheduler.add_job(send_message, 'cron', hour=0, minute=1)
logger.info("? 机器人定时任务已启动,等待 00:01...")
try:
scheduler.start()
except (KeyboardInterrupt, SystemExit):
logger.info("? 任务已手动停止")
? 托管选择指南(按推荐度排序)
| 平台 | 是否免费 | 是否 24/7 运行 | 备注 |
|---|---|---|---|
| Railway.app | ✅ 免费层可用 | ✅ 是 | 支持 GitHub 直连部署,自动构建+重启,推荐新手首选 |
| Render.com | ✅ 免费 Web Service | ✅ 是(Web 服务需保持 HTTP 响应) | 可配合 Flask + APScheduler,或使用其 Cron Jobs 功能替代定时器 |
| PythonAnywhere | ✅ 免费账户 | ❌ 否(每日休眠,需手动唤醒) | 仅适合学习验证,不可用于生产级每日推送 |
| Heroku | ❌ 免费层已下线 | ✅ 是(付费后稳定) | 需配置 Procfile 和时区(TZ=Asia/Shanghai) |
? 关键提示:所有托管平台均以服务器本地时间为准。务必确认部署环境的系统时区(如 TZ=Asia/Shanghai),否则可能在 UTC 时间 00:01(即北京时间 08:01)触发。
⚠️ 安全与运维注意事项
-
Token 保密:切勿将 TOKEN 硬编码在代码中。使用环境变量:
# 部署时设置(如 Railway 的 Environment Variables) TELEGRAM_TOKEN=your_real_token_here
代码中读取:os.getenv("TELEGRAM_TOKEN")
-
群组 ID 格式:普通群组 ID 为负数(如 -1001234567890),可通过 @RawDataBot 获取;确保 Bot 已被添加至目标群组并拥有发送权限。
-
错误重试机制:生产环境建议为 send_message() 添加指数退避重试(如 tenacity 库),避免因网络抖动导致当日漏发。
-
监控与告警:在 send_message() 结尾加入日志上报(如 Telegram Bot 自己发状态通知),或接入 UptimeRobot 检测进程存活。
只要将上述脚本部署至任意 24/7 在线平台,并正确配置环境与时区,你的 Telegram 机器人就能真正实现「无人值守、每日准点、稳定可靠」的消息推送——它不再是“你电脑上的一个脚本”,而是一个独立运行的微型服务。
就爱读