Files
acfunlive-remake/doc/webapi.md
T
tamakyi eb250bb842 web UI:手动合并的视频文件也能点选,一次可选多个
之前只有弹幕框挂了「浏览…」,视频框只能手填,或者用那个原生多选下拉
(要按 Ctrl、点一下就把手填的内容整段覆盖、手机上根本没法用)。原因是
视频框是「一行一个、可能多个」的形态,而浏览弹窗当时只支持单选。

改成同一个弹窗支持多选:

- 「浏览…」多带一个多选开关,视频框用它打开;列表里点文件名即勾选、
  再点取消,条目左边有勾选框,底部显示「已选 N 项」并能一键清空。
  勾选状态由页面保管、换目录不清,所以可以进别的文件夹继续勾、跨盘攒。
- 选用是**追加**到框里:手填的行和之前选好的行都留着,重复的不加第二遍。
  双击某个文件=把这一个一起追加进去并关窗(和单选的「双击即选用」一致)。
- 填入时录播目录下的文件只写文件名(跟着保存目录走),别处的写绝对路径;
  单选的弹幕框也按同一规则,顺手让框里干净些。
- 多选框取第一行当起点,不再把整段多行文本当路径去解析。

顺带修一个连带问题:手动合并的视频/弹幕框不进配置,refresh 也不会回填它们,
之前选完却会打上「未保存」标记 —— 顶栏那句「有未保存的修改」永远亮着,
点保存也清不掉。现在只对设置表单里的框打标记。

verify_pick.py 扩到 48 项断言(勾选/取消/跨目录累积/清空/追加不覆盖/填文件名
还是绝对路径/手机端点选/配置全程没动)全部通过;verify_settings.py 与
verify_streamer_br.py 重跑无回归;go test ./...、gofmt、go vet 干净。
2026-09-25 16:43:21 +08:00

8.7 KiB
Raw Blame History

acfunlive web API

web API 默认本地端口为 51880

http://localhost:51880/listlive 列出正在直播的主播

http://localhost:51880/listrecord 列出正在下载的直播视频

http://localhost:51880/listdanmu 列出正在下载的直播弹幕

http://localhost:51880/liststreamer 列出设置了开播提醒或自动下载直播的主播

http://localhost:51880/startmirai 利用 Mirai 发送直播通知到指定 QQ 或 QQ 群

http://localhost:51880/addnotifyon/23682490 通知 uid 为 23682490 的主播的开播

http://localhost:51880/delnotifyon/23682490 取消通知 uid 为 23682490 的主播的开播

http://localhost:51880/addnotifyoff/23682490 通知 uid 为 23682490 的主播的下播

http://localhost:51880/delnotifyoff/23682490 取消通知 uid 为 23682490 的主播的下播

http://localhost:51880/addnotifyrecord/23682490 通知 uid 为 23682490 的主播的直播视频下载

http://localhost:51880/delnotifyrecord/23682490 取消通知 uid 为 23682490 的主播的直播视频下载

http://localhost:51880/addnotifydanmu/23682490 通知 uid 为 23682490 的主播的直播弹幕下载

http://localhost:51880/delnotifydanmu/23682490 取消通知 uid 为 23682490 的主播的直播弹幕下载

http://localhost:51880/addrecord/23682490 uid 为 23682490 的主播直播时自动下载其直播视频

http://localhost:51880/delrecord/23682490 取消自动下载 uid 为 23682490 的主播的直播视频

http://localhost:51880/adddanmu/23682490 uid 为 23682490 的主播直播时自动下载其直播弹幕

http://localhost:51880/deldanmu/23682490 取消自动下载 uid 为 23682490 的主播的直播弹幕

http://localhost:51880/addkeeponline/23682490 uid 为 23682490 的主播直播时在其直播间里挂机

http://localhost:51880/delkeeponline/23682490 取消设置在 uid 为 23682490 的主播直播时在其直播间里挂机

http://localhost:51880/delconfig/23682490 删除 uid 为 23682490 的主播的所有设置

http://localhost:51880/getdlurl/23682490 查看 uid 为 23682490 的主播是否在直播,并输出其直播源

http://localhost:51880/addqq/23682490/12345 将 uid 为 23682490 的主播的开播提醒发送到 QQ12345,需要 QQ 机器人已经添加该 QQ 为好友

http://localhost:51880/delqq/23682490/12345 取消将 uid 为 23682490 的主播的开播提醒发送到 QQ12345

http://localhost:51880/cancelqq/23682490 取消将 uid 为 23682490 的主播的开播提醒发送到任何 QQ

http://localhost:51880/addqqgroup/23682490/12345 将 uid 为 23682490 的主播的开播提醒发送到 QQ 群 12345,需要 QQ 机器人已经加入该 QQ 群,最好是管理员,会@全体成员

http://localhost:51880/delqqgroup/23682490/12345 取消将 uid 为 23682490 的主播的开播提醒发送到 QQ 群 12345

http://localhost:51880/cancelqqgroup/23682490 取消将 uid 为 23682490 的主播的开播提醒发送到任何 QQ 群

http://localhost:51880/startrecord/23682490 临时下载 uid 为 23682490 的主播的直播视频

http://localhost:51880/stoprecord/23682490 取消下载 uid 为 23682490 的主播的直播视频

http://localhost:51880/startdanmu/23682490 临时下载 uid 为 23682490 的主播的直播弹幕

http://localhost:51880/stopdanmu/23682490 取消下载 uid 为 23682490 的主播的直播弹幕

http://localhost:51880/startrecdan/23682490 临时下载 uid 为 23682490 的主播的直播视频和弹幕

http://localhost:51880/stoprecdan/23682490 取消下载 uid 为 23682490 的主播的直播视频和弹幕

http://localhost:51880/log 查看 log

http://localhost:51880/quit 退出 acfunlive 运行

http://localhost:51880/help 显示帮助信息

新版 web UI 的管理接口

web UI(-webui,端口看webPort)用的是另一套/api/接口,全部需要带管理口令:请求头X-Auth-Token: <口令>,或者在 URL 上带?token=<口令>(下载链接用后者,因为浏览器跳转带不了请求头)。

口令支持任意字符,包括中文——不过 HTTP 请求头只接受 ISO-8859-1,浏览器遇到非 ASCII 的口令会直接拒绝发请求(报String contains non ISO-8859-1 code point),所以页面发给服务端的X-Auth-Token是百分号编码过的口令(encodeURIComponent)。服务端两种写法都认:先拿原样比,再拿解码后的比,所以手写 curl 或者脚本按原样把中文口令放进请求头、Authorization: Bearer、?token= 里也都能通过。用脚本调这套接口时不用管编码,原样填就行。

跟手动合并有关的是下面两个: POST /api/merge/info 预览一次手动合并的计划,不落盘。

{
    "videos": ["2026-09-25 01-00-00 主播 标题.mp4", "D:/别处/随手放的视频.mp4"],
    "danmu": "2026-09-25 01-00-00 主播 标题.ass",
    "offset": 3                // 可选,不填按文件名里的录制时间推算
}

返回分段列表(名字、体积、时长、是否正在写入)、总时长、弹幕条数、弹幕时间范围、要用的弹幕文件和来源(jsonl 弹幕数据 / 同名的 jsonl 弹幕数据 / 由 xxx.ass 还原)、推算出的偏移和原因、最终输出文件名、以及提示(warnings)。参数不合法一律 400,并在响应体里给中文原因。

POST /api/merge 真正开始合并,请求体和上面一样,另外可以带outName指定输出文件名(不合法会被清理成安全的文件名,重名自动加后缀)。成功后立刻返回{"outName":"…"},合并在后台跑。已经有一个手动合并任务在跑时返回 409。

合并状态通过GET /api/status查看:mergeBusy(是否在跑)、mergeOutName(当前成片名)、mergeErr(失败原因)、mergeDoneAt(上次完成时间)。合并期间成片会出现在GET /api/files里且inUse为 true,此时POST /api/file/remove会返回 409 拒绝删除。

POST /api/notify/test 测试某个推送渠道能不能连通。用传进来的值直接测,留空的项自动用已保存的配置补齐,所以不用先保存设置。测试不受渠道开关和事件勾选影响。

// QQ 机器人(webhook)渠道,channel 不填就按这个
{ "channel": "qq", "url": "http://127.0.0.1:8080/acfunlive/notify", "token": "可选", "group": "可选" }
// MeoW 渠道
{ "channel": "meow", "nickname": "你的昵称", "msgType": "text", "imgUrl": "可选", "htmlHeight": 200 }

成功后返回{"ok":true,"detail":"webhook 返回 HTTP 200,用时 0.31 秒。…"},detail就是页面上显示的那句结论。失败时返回 502 并在响应体里给中文原因(如MeoW 返回 status 404(昵称未注册)),参数不合法返回 400。

MeoW 的status和封禁规则会反映在GET /api/status的meowBlocked字段里:昵称没填、格式不对、或已被 MeoW 判过「未注册」时,这里会给出中文原因,非空就说明 MeoW 渠道当前推不出去。注意 MeoW 一天内累计 3 次推给不存在的昵称会封 IP,所以被判过不存在的昵称会被程序记住并停止重试,改昵称或重启程序才恢复。

GET /api/browse 给页面上的浏览按钮列目录用。参数:path(要展开的目录,不填就用程序当前的工作目录)、kind=file(连文件一起列,挑文件时用)、hidden=1(连以点开头的隐藏项一起列)。页面上的浏览有单选(保存目录、ffmpeg 路径、弹幕文件)和多选(手动合并的视频文件)两种用法,接口每次只负责列一层,多选的勾选状态由页面自己保管,所以可以换着目录勾、跨文件夹攒;填回框里时,录播目录下的文件写文件名、别的文件夹里的写绝对路径。

{
    "path": "D:\\record",                                     // 当前展开的目录,已转成绝对路径
    "parent": "D:\\",                                         // 上级目录,已经到根时是空串
    "roots": [{"name": "C:", "path": "C:\\", "dir": true, "size": 0}],
    "entries": [{"name": "2026-09-25.mp4", "path": "D:\\record\\2026-09-25.mp4", "dir": false, "size": 123}],
    "truncated": false,                                       // 条目太多时只返回前 2000 项
    "error": ""                                               // 打不开时的中文原因
}

文件夹排在文件前面,同类按名字排(不区分大小写)。挑文件时文件夹照样会列出来,不然进不去子目录。error非空时仍是 HTTP 200,entries是空的,但parent会带上——页面据此退到上一级,不会把用户卡在一个打不开的路径里(比如把文件路径当目录展开时)。

这个接口能看到整台机器的目录,但权限和其它管理接口一样,都是拿到口令即全部权限,没有放宽。