Skip to content

Undefined v3.18.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 02:30
· 10 commits to main since this release
v3.18.0
f242d93

v3.18.0 JM 漫画自动提取

本版本新增禁漫自动提取管线:消息里出现 JM 车号或禁漫链接时,自动获取本子详情、把全部章节合成为一个带密码的 PDF,以「本子信息 / 解密密码 / PDF 文件」三节点合并转发发送(文件只放在转发里,群聊下同时进入群文件列表),并新增与 arxiv_paper 同构的 jm_book 工具供 AI 按需取详情或附件。功能默认关闭,密码随机生成且不写进历史。

变更内容

  • 新增 jm 自动处理管线(src/Undefined/skills/pipelines/jm/,order = 12)与 src/Undefined/jm/(车号解析、jmcpy 客户端设置、整本下载合成、合并转发发送),依赖新增并固定到 jmcpy>=0.1.3。
  • 触发规则:JM 前缀加 5–8 位车号(JM1114751 / jm 1114751 / jm:1114751 / jm-1114751,大小写不敏感),以及主机名含 18comic 或 jmcomic 的链接(/album/<id>、/photo/<id>、?id=<id>),QQ 分享卡片里的链接同样解析,车号与链接混排时按原文出现顺序取(默认只取第一个);分享卡片结构异常(data 不是对象、JSON 损坏)只跳过该段,不影响同一条消息里其它段落的检测。前缀必须落在词边界上(xxjm1234567、t.me/jm1234567、video_jm1234567.mp4 都不触发),数字后不跟数字(9 位以上不会被截成 8 位);裸数字不触发,避免群号、时间戳误报。
  • 下载与合成:按章节 order 顺序逐章下载([jm].max_chapters 可限制),decode=False 取服务端原始字节无损落盘,自己解扰后每页只编码一次 JPEG([jm].image_quality,色度 4:4:4)并直接作为 PDF 图像数据;页尺寸统一按 [jm].pdf_dpi 换算(页宽 = 像素宽 ÷ DPI × 72),页像素始终不缩放,画质上限由站点源图分辨率决定。不再复用 jmcpy.imaging.write_pdf:jmcpy 的下载 API 一章只能产出一个 PDF,而这里要把多个章节合进同一个文件;jmcpy>=0.1.3 修掉了追加页退回默认 72 DPI、同份 PDF 内页面尺寸不一致的问题,并把页内 JPEG 色度采样默认值改成 4:4:4。
  • 逐页容错:单页解码失败只跳过该页并计入「下载失败 N 页」,其余页照常出 PDF,全部页失败才算空结果;动图(.gif)不做分块还原,与 jmcpy 的 UNDECODED_SUFFIXES 语义一致。
  • 体积语义:[jm].max_file_size 先按各章节原始图片累计预判并停止下载,组装时再按编码后字节累计复核,超过即提前中止、PDF 不落盘;因此它只是近似内存上限(JPEG 重编码可能比源图更大)。超过上限或没有下到任何页面时只发信息与状态两个节点,不发密码与文件,且信息里不展示 PDF 大小。
  • 发送结构固定为三个节点:本子信息(车号、标题、作者、章节数、标签、观看/点赞、页数、大小、简介预览,末行是可直接复制的 JM<车号>,不再输出站点链接)、PDF 解密密码(每次随机生成 8 位,字母表去掉 0/O/1/l/I 等形近字符)、PDF 文件(本地合成后随转发上传)。密码只出现在转发节点中,写入历史的摘要只说「密码见转发节点」,后续 AI 轮次不会复述密码。
  • 文件只放在转发里,不额外发独立文件消息:群聊下 NapCat 会把它作为群文件上传(isGroupFile、busid=102,元素里带 fileId / fileMd5 / fileSha1),节点里的文件可以直接下载,同一个 PDF 因此也会出现在群文件列表里。
  • 投递语义:「投递结果未确认」(delivery_uncertain)与「文件传输错误」(file_transfer_error)不降级重发,直接上抛调用方——这两种情况下转发可能已经送达,换个 action 再发会造成真实重复投递;只有协议端明确拒绝才退化为「信息 + 密码两条普通消息 + 独立文件消息」(此时文件没有别的入口),该路径的密码消息写历史时只记「PDF 解密密码已单独发送」,上传也失败时再补一条不写历史的提示。
  • 失败与资源:车号不存在或接口不可用时发送一行 JM 提取失败:<原因> 并记录异常类型与堆栈;整本下载跑在模块专用线程池(同时最多 2 本)而不是事件循环默认执行器;任务目录在成功、超限、空结果与下载抛异常四条路径上都会清理;被取消时线程仍在写盘,改为等它跑完再删,不留下残留原图或未加密 PDF。
  • 新增 jm_book 工具(src/Undefined/skills/tools/jm_book/,与 arxiv_paper 同构):output_mode=send(默认,等价自动提取)、uid(只下载并注册未加密 PDF 附件 UID,不发送消息,供 file_analysis_agent 用 extract_pdf / describe_pdf_page 解析)、info(只返回标题/作者/章节/标签/观看点赞/简介与链接,不下载);callable.json 把它共享给 file_analysis_agent,后者提示词里加了「车号/链接 → 先 jm_book(output_mode="uid")」的规则。
  • 新增 [jm] 配置段:auto_extract_enabled(默认 false)、use_proxy、auto_extract_group_ids / auto_extract_private_ids(空时跟随全局 access)、auto_extract_max_items(默认 1,上限 5)、max_file_size、max_chapters、pdf_dpi、image_quality、download_concurrency、request_timeout、image_timeout、session_dir(jmcpy 配置目录,可复用已保存的登录态);[jm].use_proxy 支持环境变量 JM_USE_PROXY。

📝 Detailed Changes

🚀 Features

  • feat(jm): JM 漫画自动提取管线与 jm_book 工具 (#105) (f242d93)