把散在各处的签到脚本收敛成青龙定时任务的做法
个人自动化最容易卡在「脚本能跑,但不敢放着让它每天自己跑」。以华为云成长中心每日任务为例,记录从一次性脚本改造成稳定定时任务的具体做法。
一、凭据只放一处,脚本按优先级读
登录态读取顺序固定为:环境变量 > 本机调试端口 Chrome > 落盘 Cookie 文件。浏览器里刚完成滑块时优先直取,平时用落盘文件,两者都不行才提示重新登录。同时把接口回包里 set-cookie 的新值写回文件,让会话能自我续期:
def persist(self, path):
jar = "; ".join("%s=%s" % (k, v) for k, v in self.cookies.items())
open(path, "w", encoding="utf-8").write(jar)关键点:不要用空占位凭据。凭据缺失时脚本直接以明确信息退出,比拿假凭据去请求导致封号或被风控好得多。
二、日志要能一眼判断成败
不要输出「执行完成」。要输出可核对的结果指标——签到前后积分、任务列表完成数、以及每一步接口的返回码:
积分: 570
每日任务: 2/8 已完成
✔ 每日使用智能问答 (+100)
○ 每日发布文章 (+60)
PUSH 流水号: 002fc88edfd847d18eb0196af62ea561推送成功也要留流水号,出问题时能区分「脚本没跑」和「跑了但推送失败」。
三、失败分类,只对可恢复的重试
要区分三类:NOT_LOGIN(重登,不重试)、网关 500(缺头,重试无意义)、超时/5xx(可重试)。因此重试只包在网络异常与 5xx 上,且带一次 csrf 重建:
def post_retry(self, url, payload):
for i in range(3):
r = self.post(url, payload)
if r.get("ok") or r.get("error_code") != "GATEWAY":
return r
self.csrf(force=True) # 令牌可能被轮转
time.sleep(2 ** i)
return r异步行为上报类任务(社区发帖、做实验)不要写成死等。官方口径最长 30 分钟到账,脚本里明确写「稍后回查」,并且把「本次是否已触发」和「是否已到账」拆成两个指标输出。
四、青龙里的落位
# 脚本放 /ql/data/scripts/华为云成长中心每日任务.py
# 定时:35 7 * * * 环境变量:hw_growth_ck / hw_ca_ck / PUSHPLUS_TOKEN
# 只依赖 requests,不依赖浏览器;有 Chrome 时会顺带补 Cookie选时间有个细节:避开整点,7:35 而不是 8:00。站点侧每日刷新一般在 0 点,早点跑能赶上第一波额度,同时避开别人整点的任务洪峰。
五、把不该定时的部分留在外面
每周任务、以及需要真实人工参与的动作(考试、提交公开作品)不适合放进定时,单独写手动脚本。区别在于是否产生对外可见的承诺,以及失败是否需要人来判断。定时任务里只放重复、低风险、可验证的行为。
这样收敛之后,一次实际执行的判定就很直接:青龙日志里有积分变化与推送流水号即成功;出现 NOT_LOGIN 就去重登一次;其它错误看是哪一类接口,再决定要不要重试。
- 点赞
- 收藏
- 关注作者
评论(0)