1. 介绍
QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。
主要通过抓包获取到HAR来制作任务模板,从而实现异步响应和发起HTTP请求
2. 需要环境
2.1 硬件需求
CPU:至少1核
内存:推荐 ≥ 1G
硬盘:推荐 ≥ 2G
2.2 软件需求
需要Linux系统,Docker、Docker-Compose,环境安装见《必备的Docker和Dockercompose环境安装》,本安装环境均基于Debian11。
3.部署
3.1 Docker-Compose方式安装
# 切换到root权限
sudo -i
# 创建数据文件夹
mkdir /etc/docker/qd && cd /etc/docker/qd
```bash
# 编辑docker-compose文件
vim docker-compose.yaml
```bash
version: "3"
services:
qd:
image: qdtoday/qd:latest
# image: qdtoday/qd:lite-latest # 精简版
# image: qdtoday/qd:dev # 开发版
container_name: qd
restart:unless-stopped
depends_on:
- redis
ports:
- "8923:80" # 修改端口,作为访问端口
volumes:
- "./config:/usr/src/app/config" # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 config 目录,用于存放数据,如果不存在的话,会自动创建
environment:
# - QD_DEBUG=False # 是否启用debug模式
# - BIND=0.0.0.0 # 监听地址
# - PORT=80 # 监听端口
# - MULTI_PROCESS=False # 是否启用多进程模式,Windows平台无效
# - AUTO_RELOAD=False # 是否启用自动热加载,多线程模式启动时该模式无效
# - GZIP=True
# - ACCESS_LOG=True
# - DISPLAY_IMPORT_WARNING=True
# - USER0ISADMIN=True # 第一个注册用户为管理员
# - STATIC_URL_PREFIX=/static/ # 静态文件URL前缀
- DOMAIN= # 指定访问域名,(建议修改), 否则通过邮件重置密码及邮箱推送等功能无效
# - COOKIE_DAY=5 # Cookie在客户端中保留的天数
# - COOKIE_SECURE_MODE=False
- COOKIE_SECRET=binux # cookie加密密钥
- PBKDF2_ITERATIONS=400
- AES_KEY=binux # AES加密密钥
# - DB_TYPE=sqlite3 # 需要使用MySQL时设置为'mysql'
# - JAWSDB_MARIA_URL=mysql://user:pass@localhost:3306/dbname?auth_plugin= # 需要使用MySQL时,设置为 (mysql://用户名:密码@hostname:port/数据库名?auth_plugin=)
# - QD_SQL_LOGGING_NAME=QD.sql # SQLAlchmey 日志名称, 默认为 'QD.sql'
# - QD_SQL_LOGGING_LEVEL=WARNING # SQLAlchmey 日志级别, 默认为 'Warning'
# - QD_SQL_POOL_LOGGING_NAME=QD.sql.pool # SQLAlchmey 连接池日志名称,默认为 'QD.sql.pool'
# - QD_SQL_POOL_LOGGING_LEVEL=WARNING # SQLAlchmey 连接池日志级别, 默认为'Warning'
# - QD_SQL_POOL_SIZE=5 # SQLAlchmey 连接池大小, 默认为 10
# - QD_SQL_MAX_OVERFLOW=10 # SQLAlchmey 连接池最大溢出, 默认为 50
# - QD_SQL_POOL_PRE_PING=True # 是否在连接池获取连接前,先ping一下, 默认为 True
# - QD_SQL_POOL_RECYCLE=3600 # SQLAlchmey 连接池回收时间, 默认为 3600
# - QD_SQL_POOL_TIMEOUT=30 # SQLAlchmey 连接池超时时间, 默认为 60
# - QD_SQL_POOL_USE_LIFO=True # SQLAlchmey 是否使用 LIFO 算法, 默认为 True
- REDISCLOUD_URL=redis://redis:6379 # 需要使用Redis或RedisCloud时,设置为 http://rediscloud:密码@hostname:port
# - REDIS_DB_INDEX=1
# - QD_EVIL=1000 # 用户在1小时内失败分数阈值(次数*分数)
# - EVIL_PASS_LAN_IP=True # 是否关闭本机私有IP地址用户及localhost_API请求的evil限制
# - WORKER_METHOD=Queue # 任务定时执行方式,默认为 Queue, Batch为旧版本执行方式,性能弱
# - QUEUE_NUM=50
# - CHECK_TASK_LOOP=500
# - TASK_MAX_RETRY_COUNT=8
# - NEW_TASK_DELAY=1 # 新建任务后准备时间, 单位为秒, 默认为1秒
# - TASK_WHILE_LOOP_TIMEOUT=900 # 任务运行中单个 While 循环最大运行时间,单位为秒, 默认为 15 分钟
# - TASK_REQUEST_LIMIT=1500 # 任务运行中单个任务最大请求次数,默认为 1500 次
# - DOWNLOAD_SIZE_LIMIT=5242880
# - REQUEST_TIMEOUT=30.0
# - CONNECT_TIMEOUT=30.0
# - DELAY_MAX_TIMEOUT=29.9
# - UNSAFE_EVAL_TIMEOUT=3.0
# - USE_PYCURL=True # 是否启用Pycurl模组
# - ALLOW_RETRY=True # 在Pycurl环境下部分请求可能导致Request错误时,自动修改冲突设置并重发请求
# - DNS_SERVER= # 通过Curl使用指定DNS进行解析(仅支持Pycurl环境),如 8.8.8.8
# - CURL_ENCODING=True # 是否允许使用Curl进行Encoding操作
# - CURL_CONTENT_LENGTH=True # 是否允许Curl使用Headers中自定义Content-Length请求
# - NOT_RETRY_CODE=301|302|303|304|305|307|400|401|403|404|405|407|408|409|410|412|415|413|414|500|501|502|503|504|599
# - EMPTY_RETRY=True
# - TRACEBACK_PRINT=False
# - PUSH_PIC_URL=https://gitee.com/qd-today/qd/raw/master/web/static/img/push_pic.png
# - PUSH_BATCH_SW=True # 是否允许开启定期推送 QD 任务日志, 默认为True
# - PUSH_BATCH_DELTA=60
# - WS_PING_INTERVAL=5 # WebSocket ping间隔, 单位为秒, 默认为 5s
# - WS_PING_TIMEOUT=30 # WebSocket ping超时时间, 单位为秒, 默认为 30s
# - WS_MAX_MESSAGE_SIZE=10485760 # WebSocket 单次接收最大消息大小, 默认为 10MB
# - WS_MAX_QUEUE_SIZE=100 # WebSocket 最大消息队列大小, 默认为 100
# - WS_MAX_CONNECTIONS_SUBSCRIBE=30 # WebSocket 公共模板更新页面最大连接数, 默认为 30
- SUBSCRIBE_ACCELERATE_URL=jsdelivr_fastly #订阅加速方式地址 jsdelivr_fastly/ghproxy/fastgit,默认为: jsdelivr_cdn
# - PROXIES= # 全局代理域名列表
# - PROXY_DIRECT_MODE=regexp # 全局代理黑名单模式,默认不启用"url"为网址,"regexp"正则表达式
# - PROXY_DIRECT=(?xi)\A([a-z][a-z0-9+\-.]*://)?(0(.0){3}|127(.0){2}.1|localhost|\[::([\d]+)?\])(:[0-9]+)? # 全局代理黑名单匹配规则
# - EXTRA_ONNX_NAME= # config目录下自定义ONNX文件名
# - EXTRA_CHARSETS_NAME= # config目录下自定义ONNX对应自定义charsets.json文件名
# - MAIL_SMTP= # 邮箱SMTP服务器
# - MAIL_PORT=465 # 邮箱SMTP服务器端口
# - MAIL_SSL=True
# - MAIL_USER= # 邮箱用户名
# - MAIL_PASSWORD= # 邮箱密码
# - MAIL_FROM=${MAIL_USER} # 发送时使用的邮箱,默认与MAIL_USER相同
# - MAIL_DOMAIN_HTTPS=False # 发送的邮件链接启用HTTPS,非框架前端使用HTTPS,如果前端需要HTTPS, 请使用反向代理.
# - MAILGUN_KEY=
# - MAILGUN_DOMAIN=${DOMAIN}
# - GA_KEY=
redis:
image: redis:alpine
container_name: redis
command: ["--loglevel warning"]
# command: redis-server /usr/local/etc/redis/redis.conf
volumes:
# - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:rw
- ./redis/data:/data:rw
复制上述配置文件内容,shift+ins
粘贴文本后,输入 :wq
退出保存
#启动安装服务
docker-compose up -d
3.2 Docker安装
# 切换到root权限
sudo -i
# 创建数据文件夹
mkdir /etc/docker/qd && cd /etc/docker/qd
```bash
docker run -d --name qd -p 8923:80 -v /etc/docker/qd/config:/usr/src/app/config qdtoday/qd
容器内部无法连通外部网络时尝试该命令
# 使用 Host 网络模式创建容器, 端口号: 8923
docker run -d --name qd --env PORT=8923 --net=host -v /etc/docker/qd/config:/usr/src/app/config qdtoday/qd
注意: 使用该命令创建容器后, 请将模板里 http://localhost/ 形式的 api 请求, 手动改成 api:// 或 http://localhost:8923/ 后, 才能正常完成相关API请求。
请勿同时运行新旧版 QD 框架, 或将不同运行中的 QD 容器数据库映射为同一文件。
这里还是推荐采用Docker-Compose方式安装。
4.使用说明
4.1 获取HAR
HAR(HTTP 归档) 是多种 HTTP 会话工具用来导出所记录数据的 一种文件格式。 这种格式基本上是 JSON 对象,并具有一组特定的字段。
HAR 文件包含敏感数据。录制过程中所下载网页中的内容。录制过程中的所有信息: cookie、个人详细信息、密码、信用卡号码等。
注意:并非所有 HAR 格式的字段都是必填字段, 很多时候,部分信息不会保存到文件中。
谷歌HAR分析工具 https://toolbox.googleapps.com/apps/har_analyzer/?lang=zh_CN
第三方HAR分析工具 http://www.softwareishard.com/har/viewer/
4.2 抓包
4.2.1. Chrome 或 Edge
- 按 F12 、 Ctrl + Shift + I ,或从 Chrome 菜单中选择 更多工具 > 开发者工具 。
- 从屏幕底部或右侧打开的面板中,选择 网络 选项卡。确保 网络 选项卡左上角的 录制 按钮显示为 红色。选中 保留日志 旁边的框。
- 单击 清除 按钮以清除 网络 选项卡中的所有现有日志。现在尝试重现您计划发起的 HTTP 请求。
重现任务后,右键单击网络请求网格上的任意位置。选择 另存为带内容的 HAR。
4.2.2 Windows - Fiddler
1.打开 Fiddler,打开 Tools 菜单,选择 Options。
2.选择 HTTPS 选项卡 ,勾选 Capture HTTPS Connects 。
3.选择 连接 选项卡,选中 解密 HTTPS 流量 。
4.现在尝试重现您计划发起的 HTTP 请求。
5.导出为 HAR 格式 - 请选择 HTTPArchive 作为导出方式。
4.3 公共模板
- 点击 我的模板 右侧的 社区模板 按钮。
- 更新存储库以获取最新的 HAR 文件列表。
- 选择你要使用的HAR文件,点击 Subscribe 按钮订阅模板。
- 根据需要修改模板。
- 然后跳到 3.编辑模板 继续编辑。
5. 上传HAR文件
点击 我的模板 右侧的 + 按钮 → 上传刚刚保存的 HAR 文件 → 点击 上传 继续。
6. 编辑模板
将用户名、密码、cookie、header 等根据用户变化的部分替换成类似 {{ username }} 的模板。(模板支持 jinja2 语法)
在请求编辑中使用测试面板测试模板是否正确返回,使用正确和错误的用户名进行测试。
填写 成功/失败断言,这有助于检测模板任务是否运行失败。
当请求中需要上一次请求的一些数据时,使用变量抽取,通过正则化抽取数据,保存在环境变量中。使用组选择器 ab(\w+)cd 选择其中的一部分。
使用 log 提取任务日志。
当所有请求编辑完成后,使用下载按钮旁边的 测试 来测试整体。
正在编辑的模板会自动保存在浏览器缓存中,不用担心丢失。
单击 保存 按钮保存模板。
单击 下载 按钮下载模板。
创建定时任务
点击 我的任务 右侧的 + 按钮 → 选择刚刚创建的模板 → 填写任务变量,任务间隔、任务组和任务执行时间 → 单击 测试 按钮测试任务 → 单击保存按钮保存任务。
批量修改
在左上角我的任务下方有一排设置栏可以批量修改多个任务的启用、禁用、定时、删除。
评论区