Telegram机器人实现定时推送日报/周报的代码示例

本教程提供使用Python和Node.js编写Telegram机器人定时推送日报/周报的完整代码示例,涵盖调度配置、消息格式化和部署建议。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

在日常运营中,团队或个人经常需要定期接收日报、周报。Telegram机器人可以自动完成这项工作。本文将提供可运行的代码示例,帮助开发者快速实现定时推送功能,无需依赖第三方付费服务。

方案概览与适用场景

实现定时推送通常需要两个核心部分:定时调度器Telegram Bot发送逻辑。调度器负责在指定时间触发任务,而Bot负责将准备好的报告发送到目标聊天(个人、群组或频道)。我们使用最流行的Python和Node.js环境来演示,你也可以轻松迁移到其他语言。

环境准备

你需要准备:

  • 一个Telegram Bot Token(通过@BotFather获取)
  • 目标聊天ID(可以是用户ID、群组ID或频道ID)
  • 一个能长期运行的服务器或本机(如使用Cron或Systemd)

Python实现(基于python-telegram-bot和APScheduler)

首先安装依赖:

pip install python-telegram-bot apscheduler

完整示例代码:

import logging
from datetime import datetime
from telegram import Bot
from apscheduler.schedulers.blocking import BlockingScheduler

# 配置
BOT_TOKEN = 'YOUR_BOT_TOKEN'
CHAT_ID = 'YOUR_CHAT_ID'

bot = Bot(token=BOT_TOKEN)
scheduler = BlockingScheduler()
logging.basicConfig(level=logging.INFO)

def generate_report():
    # 这里替换为你实际的日报/周报内容生成逻辑
    today = datetime.now().strftime('%Y-%m-%d')
    report = f"📊 日报 \n\n" \
             f"- 项目进展:...\n" \
             f"- 待办事项:...\n" \
             f"- 风险提示:..."
    return report

def send_report():
    report = generate_report()
    try:
        bot.send_message(chat_id=CHAT_ID, text=report)
        logging.info('报告已发送')
    except Exception as e:
        logging.error(f'发送失败: ')

# 每天早上9点发送日报
scheduler.add_job(send_report, 'cron', hour=9, minute=0)
# 每周一早上10点发送周报(可选注释)
# scheduler.add_job(send_report, 'cron', day_of_week='mon', hour=10, minute=0)

if __name__ == '__main__':
    scheduler.start()

Node.js实现(基于node-cron和node-telegram-bot-api)

安装依赖:

npm install node-telegram-bot-api node-cron

完整示例代码:

const TelegramBot = require('node-telegram-bot-api');
const cron = require('node-cron');

const token = 'YOUR_BOT_TOKEN';
const chatId = 'YOUR_CHAT_ID';
const bot = new TelegramBot(token, { polling: true });

function generateReport() {
    const now = new Date();
    const dateStr = now.toISOString().slice(0, 10);
    return `📊 周报 $\n\n- 完成事项:...\n- 进行中:...\n- 下周计划:...`;
}

function sendReport() {
    const report = generateReport();
    bot.sendMessage(chatId, report)
        .then(() => console.log('报告已发送'))
        .catch(err => console.error('发送失败', err));
}

// 每天早上9点发送日报
cron.schedule('0 9 * * *', () => {
    sendReport();
});

// 每周一和周四早上10点发送周报(示例)
// cron.schedule('0 10 * * 1,4', () => {
//     sendReport();
// });

定时策略与时间配置

上面的示例使用了Cron表达式。对于不同频率,可以参考:

  • 每天:在Python中hour=9, minute=0;在Node.js中0 9 * * *
  • 每周一:Python中day_of_week='mon', hour=9;Node.js中0 9 * * 1
  • 每月1号:Python中day=1, hour=9;Node.js中0 9 1 * *

实战建议:让报告更智能

  1. 动态数据:从数据库、API或文件中读取数据生成报告,而不是写死内容。
  2. Markdown格式化:使用Telegram支持的Markdown或HTML增强可读性。
  3. 失败重试:在try-catch中加入重试机制,避免因网络抖动丢失推送。
  4. 时区设置:确保服务器时区与目标用户时区一致,或使用UTC时间+偏移量。
  5. 记录日志:记录每次推送的日志,便于排查问题。

部署与运维

推荐在云服务器上运行python main.pynode bot.js。也可以使用Docker容器化,配合Systemd或Kubernetes保证持久运行。如果使用临时代码,可以使用GitHub Actions的schedule功能,但需要注意长时间token安全。

总结

通过本文的代码示例,你已经能快速实现Telegram机器人定时推送日报/周报。核心逻辑是结合调度任务与Bot API,你可以根据自己的需求扩展、美化报告内容。记得保护你的Bot Token,并定期测试定时任务是否正常触发。

FAQ

下载与安装

常见问题

如何获取目标聊天ID?

首先将你的Bot添加到目标群组或频道,或向Bot发送任意消息,然后通过API方法getUpdates获取消息中的chat.id字段。也可以使用@userinfobot等第三方Bot查询用户ID。

APScheduler和node-cron有什么区别?

APScheduler是Python功能丰富的调度库,支持多种触发器;node-cron是Node.js的轻量级Cron库。两者都能满足定时需求,具体选择取决于你更熟悉的技术栈。

如果定时任务错过了执行时间怎么办?

对于关键任务,建议在启动时检查是否有错过的任务并补偿执行。也可以在调度器中设置misfire_grace_time(APScheduler)或使用持久化存储。

如何让报告内容更丰富?

你可以获取数据库统计、外部API数据、股票行情等,使用f-string或模板引擎拼接成文,再通过sendMessage的parse_mode='Markdown'或'HTML'格式化。