DIY NAS系列33 — 青龙定时任务管理平台

题外话:话说在文章发布之前,已经为木子挽回了近百元经济损失。

青龙简介

青龙是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。主要功能如下:

  • 支持多种脚本语言(python3、javaScript、shell、typescript)
  • 支持在线管理脚本、环境变量、配置文件
  • 支持在线查看任务日志
  • 支持秒级任务设置
  • 支持系统级通知
  • 支持暗黑模式
  • 支持手机端操作

正因为它可以跑定时任务,所以很多大神基于此平台创建了各种脚本。可以使用青龙的订阅功能,来订阅 Github 上个各类脚本仓库,并设置定时自动执行脚本,以实现各种电商平台的自动签到、助力、参加活动等等,并获取相应的收益(白话文:自动薅羊毛)。

在 GitHub 上青龙拥有 16.4K Star,仓库地址:GitHub – whyour/qinglong: 支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台(Timed task management platform supporting Python3, JavaScript, Shell, Typescript)

安装青龙

青龙安装方式有多种,包括:Docker、Podman、Linux 等,因为木子在 NAS 中部署,所以采用 Docker 部署方式。Docker 镜像有两个版本:latest 镜像是基于 alpine 构建,debian 镜像是基于 debian-slim 构建。如果需要使用 alpine 不支持的依赖,建议使用 debian 镜像。其它部署方式可以参考官方教程:介绍 – Qinglong

说明: 基于前期构建的 traefik 网关,详见: DIY NAS系列12 — Traefik 出口网关配置
在 docker-compose.yaml 文件中,会对重要的配置进行说明,因个人网络环境等不同,需要根据自身实际情况调整配置。

❯ cat > docker-compose.yml << \EOF
services:
  qinglong:
    image: whyour/qinglong:latest
    container_name: qinglong
    hostname: qinglong
    restart: unless-stopped
    ports:
      - 5700:5700
    volumes:
      - /Demo/DockerData/Qinglong/data:/ql/data
    environment:
        TZ: Asia/Shanghai
    networks:
      - traefik_net
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik_net
      - traefik.http.routers.qinglong.rule=Host(`ql.rockylinux.cn`)
      - traefik.http.routers.qinglong.entrypoints=websecure
      - traefik.http.routers.qinglong.tls=true
      - traefik.http.routers.qinglong.service=qinglong
      - traefik.http.routers.qinglong.middlewares=SecHeaders@file,AllowIPList@file
      - traefik.http.services.qinglong.loadbalancer.server.port=5700
networks:
  traefik_net:
    external: true
EOF

# 启用服务 
❯ docker compose up -d 

# 确保服务启动成功
❯ docker compose ps
NAME       IMAGE                    COMMAND                   SERVICE    CREATED             STATUS                       PORTS
qinglong   whyour/qinglong:latest   "./docker/docker-ent…"   qinglong   About an hour ago   Up About an hour (healthy)   0.0.0.0:5700->5700/tcp, :::5700->5700/tcp

初始化配置

初始化配置主要包括:通知设置、登录账户密码设置等。点击“开始安装”。

设置通知方式,支持企业微信、钉钉、飞书、邮箱、Webhook 等,这里以邮箱设置为例,具体邮件服务支持列表参考:nodemailer/lib/well-known/services.json at master · nodemailer/nodemailer · GitHub,木子配置的为腾讯企业邮箱。

emailService: exmail.qq.com
emailUser: [email protected]
emailPass: Password

设置登录 Web 账号密码,点击“提交”。

点击“去登录”。

输入刚刚设置的账号密码,登录即可。

至此初始化配置完成,进入管理界面。

系统设置

因为大部分的脚本和依赖都需要从 Github 拉取,如果您没有代理可能会被墙。为了避免这个问题,可以设置代理或软件包的镜像源,以便加速安装依赖和拉取脚本的速度。设置代理和镜像源二选一即可。

镜像源配置建议:

  • Node 软件包镜像源:https://registry.npmmirror.com
  • Python 软件包镜像源:https://pypi.tuna.tsinghua.edu.cn/simple/
  • Linux 软件包镜像源:https://mirrors.ustc.edu.cn/

配置保存过程中报错:System {"type":"systemConfig"} not found,参考 修改依赖设置提示System {"type":"systemConfig"} not found ,点击“系统设置” — “其它设置” — “重新启动”,再进行配置即可。

环境变量

环境变量是在脚本执行过程中提供的基本参数值。例如:对于一个用于自动签到某网站的脚本,需要知道您在该网站上的账号对应的 cookie 或 token,以确保脚本能够正常运行。大部分情况下,操作步骤是类似的。
以京东为例,最重要的是设置 JD_COOKIE 环境变量。该变量的值包括您的京东用户名和 Cookie 中的一个键值,大部分与京东相关的脚本都需要这个变量。因此,您需要使用抓包工具或浏览器的开发者工具(按 F12 键)获取这些数据,并按照脚本要求的格式进行配置。
具体地,以 JD_COOKIE 为例,其值的格式应为 pt_key=xxx;pt_pin=yyy;,其中 xxxyyy 是您需要获取的信息。如果您不熟悉如何使用浏览器的开发者工具查看对应的 cookie 信息,可以尝试使用一个名为 EditThisCookies 的浏览器插件,只需在 Chrome 浏览器应用商店中搜索安装即可。然后登录京东移动端,使用该插件查看并复制 pt_pinpt_key 的值即可。

然后设置环境变量,点击“环境变量”–“创建变量”,确保名称、值如前面要求格式,点击“确定”即可。

注意
不同的脚本对变量的要求不一样,建议使用之前先查看脚本使用说明。此外登录的 Cookie 和 Token 可以会过期,所以需要定期检测一下对应 Cookie 和 Token 是否有效。

订阅管理

订阅的好处在于,您可以订阅您想订阅的任何 Github 仓库,并且可以设置仓库定时更新时间,省去了人工管理的过程。同时这些基于青龙面板创建的项目,一般都会对接青龙面板 API ,在仓库更新的同时,自动添加定时任务至“定时任务”列表。

京东建议使用这个仓库:https://github.com/shufflewzc/faker3.git
其它平台的订阅,可以从 Github 仓库搜索:Repository search results · GitHub

设置每天更新一次。

代理可以设置全局代理(参考系统设置),也可以基于任务设置代理。确认没有问题后,点击“确定”。

详细参数配置说明:

  • 名称:随便填写
  • 类型:根据实际情况选择,一般 GitHub 上您可以看到的仓库都是公开的
  • 链接:就是您想要订阅的脚本 Github 仓库地址
  • 分支:GitHub 仓库的分支,默认为 main,一般默认即可
  • 唯一值:灰色不可变
  • 定时类型:可以使用 cron 表达式,也可以设置间隔时间
  • 白名单:就是想从仓库中拉取的脚本文件名
  • 黑名单:就是想在拉取时排除的文件名
  • 依赖文件:表示该订阅依赖哪些文件(有设置会自动添加至依赖管理,木子未测试)
  • 文件后缀:就是想从仓库中拉取的脚本文件名的后缀
  • 执行前:在拉取脚本开始前想要执行的脚本或命令
  • 执行后:在拉取脚本结束后想要执行的脚本或命令
  • 代理:代理上网
  • 自动添加任务和自动删除任务:就是每次执行更新的时候是否自动添加新的任务和删除旧的无效任务

点击“运行”,查看日志可以看到添加成功,说明定时任务添加成功。

这时候可以看到定时任务列表如下:

依赖设置

添加完定时任务后,并不是说就高枕无忧了,查看执行过的任务日志,发现报错如下:

## 开始执行... 2024-12-07 12:05:00

🔔东东农场日常任务, 开始!

====加载sendNotify,频道:https://t.me/scriptalking====

node:internal/modules/cjs/loader:1148
  throw err;
  ^

Error: Cannot find module 'axios'
Require stack:
- /ql/data/scripts/shufflewzc_faker3/utils/Rebels_jdCommon.js
- /ql/data/scripts/shufflewzc_faker3/sendNotify.js
- /ql/data/scripts/shufflewzc_faker3/jd_fruit_task.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
    at Module._load (node:internal/modules/cjs/loader:986:27)
    at Module.require (node:internal/modules/cjs/loader:1233:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/ql/data/scripts/shufflewzc_faker3/utils/Rebels_jdCommon.js:6:32175)
    at Module._compile (node:internal/modules/cjs/loader:1358:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Module.require (node:internal/modules/cjs/loader:1233:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/ql/data/scripts/shufflewzc_faker3/utils/Rebels_jdCommon.js',
    '/ql/data/scripts/shufflewzc_faker3/sendNotify.js',
    '/ql/data/scripts/shufflewzc_faker3/jd_fruit_task.js'
  ]
}

Node.js v20.15.1

## 执行结束... 2024-12-07 12:05:01  耗时 1 秒

可以看到 node 依赖模块 axios 缺少,点击“依赖管理” — “创建依赖”,设置名称为上面不能找到的模块名 axios,点击“确定”。

确保状态为“已安装”即可,faker3 项目需要安装很多依赖,包括:jsdomaxioscrypto-js 等。

计划任务很多,怎么知道哪个是否缺少依赖,无法成功运行了?
查看计划任务运行时间,基于“最后运行时长”排序,时长为 1 秒的,大概率依赖有问题,这时候可以点击查看日志,看看缺少哪些依赖模块。
难道只能这样傻傻的安装依赖?
木子感觉不应该,于是在 faker3 的 GitHub 仓库认真细看了一下,果然有解决方法,作者已经写了一个依赖安装的 Shell 脚本,手动执行一次安装即可,如果后续有更新,也只需要进入青龙容器再执行一次即可(因为每天都会定时拉取 faker3 最新 GitHub 仓库,所以在执行的时候并不需要拉取 faker3 GitHub 仓库)。

依赖文件:faker3/jd_indeps.sh

# 进入青龙容器
❯ docker exec -it qinglong bash

# 设置可执行权限
root@qinglong:/ql $ chmod +x /ql/data/repo/shufflewzc_faker3/jd_indeps.sh
# 安装依赖
root@qinglong:/ql $ /ql/data/repo/shufflewzc_faker3/jd_indeps.sh

总结

青龙是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。上面提到的京东脚本只是某大神基于它的开发规范编写的脚本。但它更多的是可以适用于企业业务需求场景,比如:爬虫定时任务、批量计划任务管理等。

参考文献

[1] 青龙官方部署文档

Avatar photo

关于 木子

Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇