把散在各处的签到脚本收敛成青龙定时任务的做法

举报
yd_241537561 发表于 2026/10/12 07:35:51 2026/10/12
【摘要】 从一次性脚本到可长期运行的定时任务,需要解决四件事:凭据来源、日志可判断、失败可重试、结果能推送。以华为云成长中心每日任务为例整理落地细节。

个人自动化最容易卡在「脚本能跑,但不敢放着让它每天自己跑」。以华为云成长中心每日任务为例,记录从一次性脚本改造成稳定定时任务的具体做法。

一、凭据只放一处,脚本按优先级读

登录态读取顺序固定为:环境变量 > 本机调试端口 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 就去重登一次;其它错误看是哪一类接口,再决定要不要重试。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。