tamakyi
|
470b7668ac
|
忽略 Linux 二进制 acfunlive-danmu-linux
Linux 二进制没有扩展名,落不到 .gitignore 里任何一条现有规则里:
两个 .exe 由 `*.exe` 兜着,`acfunlive` 那行是精确匹配文件名,
管不到 `acfunlive-danmu-linux`。补一条 `/acfunlive-danmu-linux`,
以后 `git add .`、`git add -u` 都不会再误带它。
仓库里没有同前缀的源码文件,这条规则不会误伤。
|
2026-09-25 14:34:28 +08:00 |
|
tamakyi
|
a2f27974b2
|
web UI 按用途分成六个分区,整体改版并跟随系统深浅色
需求是「界面比较杂乱,做一下分类,UI 也现代化一些」。原来所有设置挤在一张
「设置」卡片里,从保存目录一路排到管理口令,加上通知推送的两个渠道,一屏
拉不到底,找东西全靠翻。
1) 分成六个分区,顶部一条导航切换
- 监控:添加主播 + 主播列表 + 运行日志(默认打开的就是这里)
- 录制:保存目录、录播/弹幕和成片子文件夹、录播格式、默认码率上限、ffmpeg 路径
- 合并:自动合并的三个开关、成片输出目录和合成码率、手动合并
- 通知:推送哪些事件、QQ 机器人渠道、MeoW 渠道
- 文件:磁盘容量 + 文件列表
- 设置:外网访问、管理口令
- 分区只靠 class 切显示,所有元素始终在 DOM 里,所以原来按 id 取值的
那一大堆逻辑一行都不用改;「监控」是默认页,因为看录制状态是最高频的操作
2) 地址栏带上 #分区名
- 用 replaceState 写,不往历史里塞记录,但刷新、收藏、把链接发给别人
都能落到同一个分区;也顺便记住了上次看的是哪一页(localStorage 兜底)
3) 大改样式(都在同一个模板里,没有引入任何外部依赖)
- 颜色、圆角、阴影收进 CSS 变量,卡片改成柔和阴影 + 大圆角,输入框加了
hover 和 focus 光晕,按钮分主次两级
- 勾选框改成开关样式(隐藏原生 input + 兄弟节点画轨道,所以 el.checked
和 :focus 判断照旧能用);主播列表的「弹幕/录播」改成小圆片
- 把原来那个行内的小 #msg 文案换成右下角提示条:成功 2.6 秒、失败 6 秒
自动消失,最多同时留 4 条,报错信息不会再一闪而过
- 顶栏常驻状态摘要(录制中 N / 直播中 N / 空闲),「保存设置」也挪到顶栏,
一直可见——文本框可能在别的分区里,按钮跟着分区走会找不到
- 跟随系统深浅色(prefers-color-scheme),配套改了 color-scheme 元信息;
日志面板在两种模式下都是深色终端风格
- 手机上标题居中、右侧按钮收成两个字(「保存」),分区导航横向滚动;
顶栏用 1fr auto 1fr 的网格,两侧等宽才是真的居中
- 文件列表里的文件名原来被 max-width:200px 截成「2026-09-24 20-00-00 Xsp…」,
文件名本来就是用来认文件的,改成不截断、允许换行
4) 顺手修的两个真问题
- 口令里有中文时,页面彻底用不了:HTTP 请求头只接受 ISO-8859-1,浏览器
遇到非 ASCII 的 X-Auth-Token 会直接抛 TypeError
(Failed to read the 'headers' property…),请求根本发不出去,页面只显示
「无法连接到服务器」,用户既进不去也没法在页面上把口令改回来。
现在页面统一把口令 encodeURIComponent 之后再放进头里,服务端
authTokenCandidates() 把原样和解码后的都作为候选逐个定长比较
(不提前返回,避免响应时间泄露是哪一种对上了),所以中文口令能用,
curl / 脚本按文档原样发中文口令也照样能过
- 删「正在写入」的文件返回 500 而不是 409,见上一个提交
5) 文档
- README 的「使用方法」补分区表、保存规则(开关立即生效 / 文本框点保存)、
顶栏状态和深浅色说明;各处「设置区」改成对应的分区名
- doc/webapi.md 补口令编码那段,说明脚本侧按原样填即可
已验证:新增 webui_test.go 5 个用例(ASCII 口令、含 % 的口令、中文口令的
编码与原样两种写法、Bearer 与 ?token= 三个来源、以及错口令/空口令/口令未配
一律拒绝、候选顺序与非 Bearer 的 Authorization 不算数),全量 39 个用例通过。
真机用 Edge 无头浏览器跑了两轮共 40 项断言,覆盖:自动登录、六个分区逐一点开
(只显示该分区、页签高亮、hash 跟着变)、六个分区 + 深色 + 三个移动端截图、
开关点了立刻落盘并能点回来、顶栏保存写到配置文件、在别的分区保存不会把隐藏
表单的值清空、刷新后仍在原分区、MeoW 红字提示的显示与隐藏、合并中按钮禁用
并改文案、口令弹窗的失败与重试,桌面/深色/移动端三处控制台零报错。
中文口令另做了端到端验证:配置里放中文口令能直接进、换口令后接口继续可用、
重开页面用新口令能进、旧口令被拒;把客户端编码去掉后同一个测试立刻失败,
确认这个修复是必需的而不是想当然。Windows/Linux 双平台构建、go vet、
gofmt 全干净。51880 的上游原版全程未动。
|
2026-09-25 14:19:44 +08:00 |
|
tamakyi
|
be8ec5f953
|
通知推送拆成两个渠道:QQ 机器人和 MeoW,各自带开关和测试连通
用户要求两件事:① QQ bot 推送要能测连通、并加一个开关;② 照 MeoW 的接口
文档(https://www.chuckfang.com/MeoW/api_doc.html)加一个推送渠道,同样要有
测试和开关。确认过的三个决定:QQ bot 就是现有 webhook;事件勾选两个渠道
共用、开关按渠道分开;MeoW 只填一个昵称。
1) 通知推送改成「共享事件勾选 + 每渠道一个开关」
- notify.go: notifySetting 扩成两个渠道,新增 qqReady()/meowReady();
sendNotify 按渠道各自起后台 goroutine 分发,事件没勾选、或两个渠道都
没启用时什么都不做
- config.go: 新增 notifyEnabled(QQ 机器人渠道开关)、meowEnabled、
meowNickname、meowMsgType、meowHtmlHeight、meowImgUrl
- 关掉开关只是暂停推送,地址、昵称这些配置都留着,随时能再打开
2) 老配置的兼容(重要)
- notifyEnabled 是普通 bool,老 config.json 里没有这个字段会解成 false,
升级后会把已经配好的推送静默关掉
- 解法:loadConfig() 里先置 true 再 json.Unmarshal(Unmarshal 只覆盖文件里
出现的字段),默认值里也写 true;文件里显式写 false 的仍然会关掉
- 已加回归测试 TestNotifyEnabledBackwardCompat 覆盖三种写法
3) MeoW 渠道(新增 meow.go)
- 按文档走 POST {昵称},title/msg/url/imgUrl 放 json body,
msgType/htmlHeight 是 query 参数(文档明确说这两个不属于 JSON 参数)
- 文档自己前后矛盾:响应格式那节写 msg,示例写 message,两个字段都解析
- 空字段一律不放进 body:body 里的 title 优先级高于路径参数,
传空串会把 MeoW 的默认标题顶掉
- 业务状态码翻成中文(400 参数错、403 内容被拦、404 昵称未注册、
429 频控、500 服务器错误),失败信息直接显示在页面上
- msgType 为 html 时渲染成 HTML(首行加粗、链接可点、内容转义),
高度默认 200、范围 40-2000;事件正文复用 webhook 的那份 text
4) MeoW 的错误昵称会封 IP,所以加了保护(踩出来的)
- 实测用不存在的昵称打真实接口,返回的提示是「一天之内累计3次输错对方
昵称您的IP将被封禁」。而开播+开始录制+下播+合并完成一天轻松触发 4 次,
昵称配错就会把用户 IP 封了
- meow.go: 新增 meowBadNick 记录,pushMeow 收到 404 就记下这个昵称;
sendNotify 和测试接口命中记录时直接跳过/拒绝并说明原因,
改掉昵称或重启程序即恢复
- 只有 404 触发拦截:429 是频控、400 是参数问题,都应该继续尝试
- 已加测试 TestMeowBadNickGuard(404 要拦、429/400 不能拦、不影响别的昵称)
5) 测试连通
- /api/notify/test 合并成一个接口,用 channel 区分 qq / meow,
每个渠道的配置下面各有一个「测试连通」按钮
- 用页面上当前填的值直接测、不用先保存,留空的项自动用已保存的值补齐;
测试不受渠道开关和事件勾选影响(本来就是为了打开之前先确认配置)
- 成功返回 {ok, detail},detail 就是页面上的结论:QQ 渠道显示 webhook 的
HTTP 状态码和耗时,MeoW 渠道显示它返回的 status 和耗时;
webhook 返回 200 只代表地址口令没问题,能不能收到要看机器人那边,
这点也写在结果里
- /api/status 新增 meowBlocked,页面上红字显示「当前推不出去:…」
(昵称没填、格式不对、或已被判过未注册)
6) 页面
- 通知区分成「事件勾选 / 渠道一 QQ 机器人 / 渠道二 MeoW」三块,
每块用一条带标题的细线隔开,两个渠道各带开关和测试按钮
- 消息类型选 text 时自动收起 HTML 高度那一行
另外:README 的通知推送一节重写(两个渠道的对比表、MeoW 的频控与封禁提醒、
测试连通的说明),配置文件详解补上新字段;doc/webapi.md 补 /api/notify/test
和 meowBlocked。doc/momoko-acfunlive-notify.py 本来就处理 event="test",不用改。
已验证:新增 notify_test.go,15 个用例全部通过(URL 拼接与转义、昵称校验、
消息类型与高度归一、HTML 渲染与转义、接口成功/失败/空字段处理、6 种业务状态码
的文案、404 拦截保护、老配置兼容、测试接口各分支),其中 TestSendNotifyFanOut
是端到端分发测试:两个渠道都开→各收到 1 条、关掉任一个→只剩另一个、
两个都关→0 条、事件没勾→0 条。真机冒烟两轮:页面控件齐全、老配置默认开启、
QQ 渠道实测本地 webhook 收到完整推送(含 Authorization 和 X-Auth-Token 头与群号)、
空值回退到已保存配置、6 种非法输入全 400、开关能落盘且关开关不清地址、
MeoW 真实接口返回的 404 被正确翻成中文。全量 34 个测试通过,
Windows/Linux 双平台构建、go vet、gofmt 全干净。
|
2026-09-25 13:42:49 +08:00 |
|
tamakyi
|
ed4e47e305
|
init
|
2026-09-25 13:16:54 +08:00 |
|