refactor(common): 通知实现搬进 common.js,所有脚本一行 require 即可用
上一版把 notify 内联在 qqmusic 脚本里,只解决了单个脚本。这次搬到仓库根的
common.js,后续任何脚本 require('../common') 就能发通知。
common.js 新增导出:
notify(title, content, opts) webhook + pushplus 双通道,任一成功即 ok,永不抛错
notifyConfig(env) 读 env 并给默认值(可注入替身,方便测试)
httpPost(url, headers, body) 通用 POST,http/https 自适应
parseHookHeaders(raw) 一行一个 Key: Value
buildHookBody(t, c, tpl, ct) 拼 body,JSON 不合法就重建
Env 保持原样未动(jd 与 xiequ 在用)。
顺带删掉第 1 行的 require('node-fetch') —— 它是死代码:Env 内部所有 HTTP 走的是
require('got') + require('tough-cookie'),fetch 只以 $task.fetch(...) 的形式出现在
QuantumultX 分支(宿主 API,不是 node-fetch)。留着它反而会在容器缺 node-fetch 时
让整个文件 require 抛错,连带 jd / xiequ 一起挂。
qqmusic 脚本从 125 行内联实现缩成一行 require('../common'),删掉重复的
httpPost / parseHookHeaders / buildHookBody / notify 四份副本。
测试从 qqmusic/test_notify.js 挪到仓库根 test_common_notify.js,断言从 38 加到 69:
- parseHookHeaders 九种输入(新增重复 key 覆盖)
- buildHookBody 五种(新增自定义模板 + urlencoded + text/plain)
- notifyConfig 十项默认值与 trim
- notify 八种状态(200/204/201/401/403/400/429/连不上)
- 无配置、双通道互不牵连
- Env 兼容性(确认 node-fetch 已移除、老接口都在)
端到端已验证:common.js 的 notify 发出的 content 与原始 desp 逐字相同(10 行完整),
title 正确,header 带 token,HTTP 204 判为成功。
README(根 + qqmusic)新增 common.js 公共库章节,列出 notify 支持的八个环境变量
与「为什么不能放 sendNotify.js」的 deps 覆盖原因。
This commit is contained in:
@@ -233,8 +233,15 @@ docker exec -it qinglong sh -c '
|
||||
|
||||
两个 md5 相同 = 被覆盖了。
|
||||
|
||||
**结论:本脚本不再 `require('../sendNotify')`。** 通知逻辑内联在
|
||||
`scrip_qqmusic_checkin.js` 的 `notify()` 里(约 90 行,零依赖),行为完全由仓库决定。
|
||||
**结论:通知实现放在仓库根的 `common.js`,脚本 `require('../common')` 取用。**
|
||||
|
||||
```js
|
||||
const { notify } = require('../common')
|
||||
await notify('QQ音乐签到', desp) // → { ok, channels: [{name, ok, detail}] }
|
||||
```
|
||||
|
||||
`common.js` 不在 `deps` 里(`deps` 只有 `notify.py` 和 `sendNotify.js`),所以安全。
|
||||
后续任何脚本想发通知,同样一行 `require('../common')` 即可,不用再碰 `sendNotify.js`。
|
||||
|
||||
### 坑 1:`sendNotify` 的三个静默 `resolve()`
|
||||
|
||||
@@ -275,12 +282,12 @@ pushplus 官方给了三种解法([文档](https://pushplus.plus/doc/help/show
|
||||
### 自检
|
||||
|
||||
```bash
|
||||
# 纯函数 + 六种状态码(200/204/201/401/403/400/429)+ 无配置 + 双通道
|
||||
node qqmusic/test_notify.js
|
||||
# common.js 的 notify:69 条断言(纯函数 + 八种状态码 + Env 兼容性)
|
||||
node test_common_notify.js
|
||||
```
|
||||
|
||||
```
|
||||
RESULT: PASS (38 passed, 0 failed)
|
||||
RESULT: PASS (69 passed, 0 failed)
|
||||
```
|
||||
|
||||
### 指向平台的完整配置
|
||||
@@ -321,15 +328,16 @@ node --check scrip_qqmusic_checkin.js # 语法
|
||||
node scrip_qqmusic_checkin.js # 无 env 时优雅跳过
|
||||
SH_QQMUSIC_KEY='123#Q_H_L_x' node -e "console.log(require('./scrip_qqmusic_checkin').parseAccounts())"
|
||||
|
||||
node test_notify.js # 通知实现:38 条断言(含六种状态码)
|
||||
node test_sign_run.js # 签名对拍(需先 python test_sign_vector.py 生成期望)
|
||||
node ../test_common_notify.js # 通知实现(69 条断言,见仓库根 README)
|
||||
node ../_probe_meta.js # 青龙元数据注解
|
||||
```
|
||||
|
||||
`test_notify.js` 覆盖:
|
||||
通知相关的测试在仓库根 `test_common_notify.js`(因为实现搬到了 `common.js`),
|
||||
覆盖:
|
||||
|
||||
- `parseHookHeaders`:多行 / 空行 / 无冒号 / 值含冒号 / 字面量 `\n` 不切开
|
||||
- `buildHookBody`:内容含双引号、反斜杠、制表符时仍产出合法 JSON
|
||||
- `notify`:mock 服务测 **200 / 204 / 201 / 401 / 403 / 400 / 429** 七种状态码
|
||||
- 无配置、双通道部分失败
|
||||
- `parseHookHeaders`:多行 / 空行 / 无冒号 / 值含冒号 / 重复 key / 字面量 `\n` 不切开
|
||||
- `buildHookBody`:内容含双引号、反斜杠、制表符、多行时仍产出合法 JSON
|
||||
- `notify`:mock 服务测 **200 / 204 / 201 / 401 / 403 / 400 / 429 / 连不上** 八种
|
||||
- 无配置、双通道部分失败、`Env` 兼容性(jd / xiequ 在用)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user