Python基于Twilio实现定时短信时datetime判断逻辑失效问题
踩坑点逐条梳理
- 最根本的逻辑错误:拿对象和字符串比相等
if判断里datetime.time(datetime.now())取出来的是datetime库的time类实例,代码直接把它和字符串格式的'08:00:00.000000'做等值比较。Python中不同类型的对象做==判断永远返回False,哪怕时间值完全对上,也不可能匹配成功,这就是if分支从来没触发的核心原因。 - 低级语法错误:if块的代码没缩进
原代码里if判断结束后,下面的client.messages.create那行根本没缩进,按照Python的语法规则,这行代码不属于if的执行逻辑,甚至程序一跑就会报IndentationError直接崩,根本到不了运行判断的步骤。 - 循环设计缺陷:裸跑死循环既占CPU又抓不到触发点
原代码的while True没有加任何休眠间隔,一来会把CPU占满,二来循环跑的太快,等真到8点整的那一瞬间,很可能因为循环的时序问题直接跳过去,根本抓不到那个能匹配的节点。 - 测试逻辑不对:改了测试时间也白搭
之前你把触发条件改成“当前时间过一分钟就发”做测试的时候,没有提前把目标触发时间固定下来,每次循环都动态取当前的实时时间,等一分钟过去,当前时间早就变了,根本找不到匹配的判断点,自然不会触发发送。
能正常跑的修正代码
from twilio.rest import Client from datetime import datetime import time # 替换成自己的Twilio账号凭证 client = Client("你的Account SID", "你的Auth Token") # 标记上次成功发送的日期,防止同一天重复触发 last_send_date = None while True: now = datetime.now() # 拆成时、分、秒分别判断,不用转字符串绕弯 if now.hour == 8 and now.minute == 0 and now.second == 0: # 当天没发过才执行发送,避免轮询间隔触发多次重复发送 if now.date() != last_send_date: client.messages.create( to="+你的接收手机号", from_="+你的Twilio专属发送号", body="Goodmorning" ) last_send_date = now.date() # 每10秒轮询一次,不占CPU,也不会错过触发时刻 time.sleep(10)
实用优化建议
- 别总想着把时间对象转成字符串再做等值匹配,直接拆分datetime的时、分、秒属性判断,既简单又不容易出类型错误。
- 长期挂着Python进程容易遇到意外中断,如果想更稳定,直接用系统自带的定时任务(Linux的cron、Windows任务计划)跑发送脚本就行,不用一直跑死循环占资源。
内容的提问来源于stack exchange,提问作者Jackson Urquhart
相关产品推荐
相关产品推荐

