You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中查看时间并实现每日定时执行命令(适配TelegramBot)

Python实现每日定时发送Telegram消息(无需crontab/timer工具)

嗨,咱们一步步来解决你的问题。你不想用crontab和timer工具,那咱们就用Python自带的模块来实现自定义的定时逻辑,再集成到Telegram Bot里完成每日群发消息的需求。

一、查看当前时间(精确到小时和分钟)

要获取精确到小时分钟的时间,Python的datetime模块就能搞定,用strftime可以轻松格式化输出:

from datetime import datetime

# 获取当前时间(仅小时:分钟)
current_time = datetime.now().strftime("%H:%M")
print(f"当前时间: {current_time}")

# 如果需要带日期的完整时间(精确到分)
full_time = datetime.now().strftime("%Y-%m-%d %H:%M")
print(f"当前完整时间: {full_time}")
  • %H:24小时制的小时(00-23)
  • %M:分钟(00-59)
  • 如果想用12小时制,把%H换成%I就行。

二、实现每日同一时间执行任务

核心思路是循环检查当前时间,计算距离目标时间的等待时长,然后休眠到目标时间再执行任务,完全不需要外部工具。这里要处理“当天已经过了目标时间”的情况,直接顺延到第二天:

from datetime import datetime, timedelta
import time

def daily_task(target_time_str):
    # 解析目标时间(格式如"09:00")
    target_hour, target_minute = map(int, target_time_str.split(":"))
    
    while True:
        now = datetime.now()
        # 构造今天的目标时间点
        target_today = now.replace(hour=target_hour, minute=target_minute, second=0, microsecond=0)
        
        # 如果当前时间已经过了今天的目标时间,就把目标时间设为明天的同一时间
        if now > target_today:
            target_today += timedelta(days=1)
        
        # 计算需要等待的秒数
        wait_seconds = (target_today - now).total_seconds()
        print(f"距离下次执行还有 {wait_seconds:.2f} 秒")
        
        # 休眠到目标时间
        time.sleep(wait_seconds)
        
        # 这里写你要执行的任务逻辑
        print(f"任务执行完成,当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}")

三、集成Telegram Bot实现每日群发消息

接下来把上面的定时逻辑和Telegram Bot结合,用python-telegram-bot库来发送消息,步骤如下:

1. 安装依赖库

pip install python-telegram-bot --upgrade

2. 完整代码示例

from datetime import datetime, timedelta
import time
from telegram import Bot
from telegram.error import TelegramError

# 替换成你的Bot Token(从@BotFather获取)
BOT_TOKEN = "你的Telegram机器人Token"
# 替换成你的群组ID(负数格式,比如-123456789)
GROUP_CHAT_ID = "你的目标群组ID"
# 设定每日发送时间(24小时制,比如"08:30")
TARGET_SEND_TIME = "08:30"

def send_group_message(bot, chat_id, content):
    try:
        bot.send_message(chat_id=chat_id, text=content)
        print("消息已成功发送到群组")
    except TelegramError as e:
        print(f"发送消息失败: {str(e)}")

def daily_telegram_sender():
    # 初始化Bot实例
    bot = Bot(token=BOT_TOKEN)
    target_hour, target_minute = map(int, TARGET_SEND_TIME.split(":"))
    
    while True:
        now = datetime.now()
        target_today = now.replace(hour=target_hour, minute=target_minute, second=0, microsecond=0)
        
        # 处理当天已过目标时间的情况
        if now > target_today:
            target_today += timedelta(days=1)
        
        wait_seconds = (target_today - now).total_seconds()
        print(f"距离下次发送消息还有 {wait_seconds:.2f} 秒")
        
        time.sleep(wait_seconds)
        
        # 构造要发送的消息内容
        message_content = f"📅 每日定时提醒\n当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n今天也要加油哦!"
        send_group_message(bot, GROUP_CHAT_ID, message_content)

if __name__ == "__main__":
    daily_telegram_sender()

关键参数说明

  • Bot Token:打开Telegram找@BotFather,发送/newbot创建机器人,按提示获取Token。
  • 群组ID:把机器人拉进目标群组,随便发一条消息,然后访问https://api.telegram.org/bot<你的Token>/getUpdates,在返回的JSON里找到chat对象的id(是负数)。

时区优化(可选)

如果你的服务器时区和目标时区不一致,比如需要北京时间,可以用pytz模块处理:

import pytz
# 设置为北京时间
beijing_tz = pytz.timezone("Asia/Shanghai")
now = datetime.now(beijing_tz)

这样计算的时间就会和北京时间同步,避免时区偏差。

四、额外优化建议

  • 日志记录:可以把执行日志写入文件,方便后续排查问题,比如用logging模块。
  • 异常重试:如果网络波动导致消息发送失败,可以在send_group_message里添加重试逻辑。
  • 后台运行:如果需要程序一直运行,可以用nohup命令(Linux)或者把它包装成Windows服务。

内容的提问来源于stack exchange,提问作者Ham man

火山引擎 最新活动