如何在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




