搭建自动签到平台 QD

2022/04/15 更新 1 次 更新于 2026/08/08 Net 共 4383 字,约 13 分钟

QD 是一个使用 Python 语言编写的 HTTP 请求定时任务自动执行框架,可用于在 web 网站、app 上发起 http 请求。

项目地址:https://github.com/qd-today/qd

指南:https://qd-today.github.io/qd/zh_CN/guide/what-is-qd.html

1、部署

# 拉取/更新镜像
docker pull qdtoday/qd

# 创建容器
docker run -d -p 80:80 --name qd --restart=always qdtoday/qd

# 进入容器并安装 vim,容器内使用的是 Alpine 系统
docker exec -it qd /bin/bash && apk add --update vim

# 参考项目文档说明修改配置:DOMAIN、AES_KEY、COOKIE_SECRET
vim config.py

# 重启容器
docker restart qd

# 开放端口,云服务器则安全组配置开放
firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --reload

部署成功,点击右上角登录创建账号(首个注册账号为管理员)

2、更新

# 更新升级,先进入容器后台
docker exec -it qd /bin/bash

# 执行更新脚本
wget https://gitee.com/qd-today/qd/raw/master/update.sh -O /usr/src/app/update.sh && sh /usr/src/app/update.sh

# 重启容器,更新完成
docker restart qd

3、使用

登录后可订阅公共模板进行配置签到,同时在工具箱设置企业微信进行消息推送

image-20220608233923889

没有的网站模板可以自行创建,使用浏览器 F12 或 Fiddler 抓取签到请求,浏览器需先勾选 Preserve log 后,可保留请求为 har 格式导出

image-20220608234734359

或者使用 Fiddler 抓包后选择相应的请求进行导出

image-20220608235021084

将导出的 har 上传到 QD 里进行调试后即为作为新的模板用于签到(参考其它模板进行学习修改)

4、笔记

记录编写模板时用过的参数和正则

4.1、正则
# 提取数字
(\d+)

# 提取带小数点的值:135.61
"SellPrice":([\d.]+)

# 固定长度的字符串:CX12345
\D{2}\d{5}

# 13 位时间戳:1582750046827
"16位时间戳": (\d{13})

# 中间 9 位时间戳:750046827
"16位时间戳": \d{4}(\d{9})

# 时间戳 api 响应结果提取当天日期:2022-04-15
"北京时间": "(\d{4}-\d{2}-\d{2})

# 时间戳 api 指定 form 参数:form =%Y-%m-%d %H:%M:%S.%f,当天日期精确到毫秒
"北京时间": "(.*?)\d{3}"

# 换行时提取
EU-1.*[^"]+?(\d+)<

# 提取所有字符
([\s\S]*)		

# 图片 base64 编码
.+		
  
# 中文
[\u4e00-\u9fa5]+
  
# 获取 formhash
"formhash" value="(.+)"

# 只排除以 0 开头的数字
"qty":(?!0)(\d+)
4.2、参数及过滤器
# 10 位时间戳:1582750317
{{timestamp()}}		

# 13 位时间戳:1582750363122
{{multiply(timestamp('float'),1000)|int}}

# 13 位时间戳:1582750363122
{{multiply(timestamp('float'),1000)|truncate(13, True,'')}}

# 中间 9 位时间戳截取
{{multiply(timestamp('float'),1000)|replace(multiply(timestamp('float'),1000)|truncate(4,True,''),"")|int}}

# 当前日期:2022-06-08
{{date_time(1,0,0)}}

# 当前时间:14:44:28
{{date_time(0,1,0)}}

# 当前日期时间:2022-06-08 14:44:28,最后一位 0 为时间差
{{date_time(1,1,0)}}

# 耗时,times10 为 10 位时间戳
{{sub(timestamp('int'), times10)|int}}

# 32 位大写 md5
{{md5(password)upper}}

# name 没有值时使用 mark
{{name|default('mark')}}

# name 的长度
{{name|length}}		

# 将字符串中的 1 替换为 1:a23
{{"123"|replace("1","a")}}		

# num 参数 与 1 相等时,返回 good ,为 false 时返回 bad
{{ternary(num == "1","good","bad")}}

# 随机生成从 0 到 10 的 4 位小数
{{random(0,10,4)}}

# 随机生成从 1 到 35 内的整数
{{random(1,35,0)|int}}		

# 转为 float 类型再向上取整,common 为四舍五入(默认), ceil 向上取整, floor 向下取整
{{12.651|float|round(2, 'ceil')}}

# 随机选择列表内 1 条数据
{{uids|random}}

# 列表内数字最大值,最小值用 first
{{counts|map('int')|sort|last}}		

# 列表内数字之和
{{nums|map('int')|sum}}

# 返回值作为 for 循环中的 variables 表示 for 循环 3 次
{{random(0,1,3)|replace("0.","")}}		

# if 整数判断,可以使用 not、and、or 关键字
{% if int(num) > 20 %}
    # ...
{% endif %}

# if 判断条件带引号会进行字符串判断
{% if num > "9" %}
    # ...
{% endif %}

# if 判断值是否为空
{% if telX == "" %}
    # ...
{% endif %}

# 对多个数据进行求和运算,10、3 可以是变量
{{add(10,3)|int}}

# 对多个数据进行减法运算,10、3 可以是变量
{{sub(10,3)|int}}		

# 对多个数据进行乘法运算,10、3 可以是变量
{{multiply(10,3)|int}}		

# 对多个数据进行除法运算,四舍五入保留 2 位小数,10、3 可以是变量
{{divide(10,3)|float|round(2, 'common')}}		

# 除字符串中所有的 html 标签, 多个空格替换成一个空格
{{name|striptags}}

# Mark 替换成 quchao
{{name|replace("Mark","quchao")}}

# 去重后换行显示
{{names|unique|list|join('\n')}}

# 随机中文姓名
{{Faker(locale='zh_CN').name()}}

# 随机中文公司
{{Faker(locale='zh_CN').company()}}

# 随机中文公司简称
{{Faker(locale='zh_CN').company_prefix()}}

# 变量拼接,变量之间使用 + 或 ~
{{code + "***" + time13}}

# UUID v4 带杠格式
{{regex_replace(to_uuid(timestamp('float')), "(?<=^.{8}-.{4}-).", "4", 1)}}

# 32 位随机数
{{to_uuid(timestamp('float'))|replace("-","")}}
4.3、时间戳 API
# 10 位时间戳转为指定日期格式
ts={{times10|urlencode}}&form=%Y%m%d%H%M%S

# 指定日期转为 10 位时间戳
form=%Y-%m-%d %H:%M:%S&dt={{times10}}

# times 为 10 位时间戳,前 1 分钟时间,格式化为指定日期格式
ts={{sub(times10,multiply(1,60))|int|urlencode}}&form=%Y%m%d%H%M%S
4.4、循环
# 循环 6 次
{% for value in range(0, 6, 1) %}
     ...
{% endfor %}

# 循环 6 次,loop_index 从 1 开始计数
{% while int(loop_index) <= 6 %}
     ...
{% endwhile %}

# loop_index0 从 0 开始计数,根据 mintus 划分一天时间进行循环:mintus 为 480 (8 小时),循环 3 次
{% while int(loop_index0) < 24/(int(mintues)/60) %}
     ...
{% endwhile %}

# 拼接每次循环的数据,用 Unicode 转换 API,结果存为 info 变量,请求放在循环中间
content={{info}} {{loop_index}} 次循环
4.5、AES 加密
# AES 加密时,Unicode 转换请求后响应数据中 + 号会变成空格
{{aes_encrypt("d31d555d-a37d-4856-8a96-4d2e228eb66c:1771075377645", "emcs-app-request", "CBC", "abcdefjhijklmnop", "base64")}}

# 方式一:使用 URL 解码函数
{{aes_encrypt("d31d555d-a37d-4856-8a96-4d2e228eb66c:1771075377645", "emcs-app-request", "CBC", "abcdefjhijklmnop", "base64")|urlencode}}

# 方式二:或者将 + 号使用 replace 函数进行替换
{{aes_encrypt("d31d555d-a37d-4856-8a96-4d2e228eb66c:1771075377645", "emcs-app-request", "CBC", "abcdefjhijklmnop", "base64")|replace("+","%2b")}}
4.6、RSA 加密

api://util/rsa

# Request Payload
f=encode&key=-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANNmSJW87EE2Z3KDW5Kod8cL+7lUBgfKLm86CGfMQxvc8w+JnOE7GV72DVyg2kCMGho5g9AR64BmrGobbG4xMZECAwEAAQ==
-----END PUBLIC KEY-----
&data={{datainfo}}

Search

    Table of Contents