Skip to content

feat: 二维码登录改用 Release 直链 + 通知/令牌/代码精简优化#21

Open
xfxx2022 wants to merge 18 commits into
develop202:mainfrom
xfxx2022:main
Open

feat: 二维码登录改用 Release 直链 + 通知/令牌/代码精简优化#21
xfxx2022 wants to merge 18 commits into
develop202:mainfrom
xfxx2022:main

Conversation

@xfxx2022

Copy link
Copy Markdown

kgcheckin 完整变更清单(合并前期修复 + 本次二维码登录修复)

本 PR 基于 xfxx2022/kgcheckin:maindevelop202/kgcheckin:main
相对上游 upstream/main 共 16 个提交,改动 15 个文件,+966 / -299 行。


一、二维码登录功能(核心修复链路)

1.1 展示方案演进(解决"看不到 / 扫不上")

阶段 方案 问题 结果
初版 ASCII 字符画(双宽 ██ / UTF-8 半块) 终端字体渲染、字符间距、屏幕缩放破坏像素对齐,手机扫不上 弃用
改进 Step Summary 内嵌 PNG <img> data URI Summary 页面空白/不显示,且运行日志原生不支持图片 弃用
改进 自包含 HTML 登录页(artifact 上传) GitHub artifact 强制打包成 .zip 压缩包,需解压才能看 弃用
最终 GitHub Release 直链 浏览器点开链接即显示图片本体,零解压 ✅ 用户实测扫码登录成功

1.2 关键 Bug 修复

  • gen 步骤不退出导致后续步骤不执行、二维码超时失效
    • 根因:genMode() 为 async 但入口未 await/.catch,且末尾无 process.exit(0),Node 进程因悬挂资源无法退出 → GitHub 认为 step 未完成 → 后续 wait / artifact 步骤全为空心圆不执行。
    • 修复:入口加 .then(() => process.exit(0)).catch(e => process.exit(1))close_api() 包裹 Promise.race([close_api, setTimeout(3000)]) 防止挂死。
  • EADDRINUSE 127.0.0.1:3000 导致 wait 步骤崩溃
    • 根因:close_api() 仅给 npm 发 kill(),但 npm 不转发信号给子进程(真正的 Express 服务),3000 端口未释放,wait 再启动冲突。
    • 修复:startService 改用 detached: true 独立进程组;close_api 改用 process.kill(-pid, 'SIGKILL') 强杀整个进程组;移除 stderr 中的 throw(避免 npm 警告误触发崩溃)。
  • 字符画渲染崩溃:修复 this 上下文丢失与参数顺序错误。
  • Summary 图片/空白问题:多轮修复 Summary 写入时机与 <img> 渲染。

1.3 体验优化

  • qrcodeLogin.js 拆分为 gen / wait 两种模式,跨 step 用 qrkeys.json 传递密钥。
  • workflow 拆分为「生成二维码」→「发布直链」→「等待扫码」→「清理」多个独立 step。
  • 登录后自动删除本次 Releasegh release delete qr-{run_id}),旧 Release 仅保留最近 3 个,避免持续堆积。
  • 删除 Summary 内冗余二维码描述与日志中多余的 htmlpreview 链接,页面更整洁。
  • 合并 qrcodeLogin.yml 等 workflow,统一二维码登录入口。

涉及文件qrcodeLogin.jsutils/utils.js.github/workflows/二维码登录.yml.github/workflows/签到.yml.github/workflows/手机号登录.yml.github/workflows/合并.yml 等。


二、运行结果通知功能(前期)

  • 新增 utils/notify.js 模块,支持 10 种通知渠道,全部使用 Node.js 内置模块实现,零外部依赖
    企业微信机器人、钉钉机器人、飞书机器人、云湖机器人、Server酱、PushPlus、Telegram、Bark(iOS)、Discord、邮箱 SMTP。
  • 通知内容包含:运行日期、账号数量、成功/失败统计、各账号听歌领取状态、VIP 领取次数、VIP 到期时间、错误信息。

三、令牌功能分析(前期)

  • 梳理项目两类令牌:
    • GitHub PATSecrets.PAT):通过 gh CLI 自动将酷狗登录信息写回 USERINFO Secret;每周日自动刷新酷狗 Token。
    • 酷狗登录 TokenSecrets.USERINFO):酷狗 API 身份认证,签到核心凭证。

四、代码精简与优化(前期)

  • 提取共享逻辑:新增 utils/userinfo.js,消除 phoneLogin.jsqrcodeLogin.js 中约 60 行重复代码。
  • 修复拼写错误youth_listen_song.jsencryptTyPeencryptType
  • 修复变量遮蔽qrcodeLogin.js 内层循环 i 遮蔽外层 i,改为 n/j
  • 清理冗余代码:移除 utils.js 注释代码、优化 notify.js 死代码与超时定时器。
  • 净代码量 +525 新增 / -132 删除(通知模块与文档占主要增量,业务代码实际净减少)。
  • 更新 README.md 说明二维码登录与令牌机制。

五、验证情况

  • 二维码登录:本地桩服务模拟验证 gen 干净退出(exit 0)、wait 正常轮询到登录成功;GitHub Actions 实测扫码登录成功
  • 端口释放:Windows / Linux 双环境验证 close_api 不崩溃且端口可释放。
  • 通知 / 令牌 / 精简:对应提交已通过日常 Actions 运行验证。

xfxx2022 and others added 18 commits July 11, 2026 13:16
- 新增 utils/notify.js: 支持企业微信/钉钉/飞书/云湖/Server酱/PushPlus/Telegram/Bark/Discord/邮箱SMTP 共10种通知渠道

- 新增 utils/userinfo.js: 提取 phoneLogin/qrcodeLogin 共享的用户信息管理逻辑

- 更新 main.js: 添加运行结果收集和通知发送

- 更新 main.yml: 添加通知渠道环境变量

- 修复 youth_listen_song.js 中 encryptTyPe 拼写错误

- 修复 qrcodeLogin.js 内层循环变量遮蔽问题

- 更新 README.md: 添加通知配置说明和令牌机制说明

- 精简 phoneLogin.js/qrcodeLogin.js/utils.js 冗余代码
- 优化qrcodeLogin: 使用qrcode包在终端直接渲染ASCII二维码,替代base64文本输出

- 合并5个workflows为3个: 签到/账号登录/仓库保活

- 账号登录workflow整合二维码登录/发送验证码/手机号登录,通过下拉选择

- 所有workflow中文化命名

- 更新README反映新的workflow结构
- 二维码改用 GITHUB_STEP_SUMMARY 渲染真实PNG图片,替代终端ASCII码显示

- 拆分账号登录.yml为独立的二维码登录.yml和手机号登录.yml

- 二维码登录: 独立workflow,二维码显示为图片

- 手机号登录: 独立workflow,含发送验证码和登录两个步骤

- 更新README反映新的workflow结构
根因: GitHub的Markdown渲染器会过滤data: URI,导致<img src=data:...>被移除

修复方案:

- Step Summary改用纯ASCII二维码(无ANSI码),在代码块中渲染

- 额外保存PNG文件,通过actions/upload-artifact上传为构件供下载

- 使用appendFileSync替代writeFileSync避免覆盖其他步骤的摘要

- 提供三层保障: ASCII渲染 + PNG下载 + URL文本
- const get = qr.modules.get 导致 this 丢失, 改为 modules.get(r,c) 直接调用

- get(c,r) 参数顺序写反, BitMatrix.get(row,col) 正确顺序为 (r,c)
根因: GITHUB_STEP_SUMMARY只在step完成后才被GitHub读取渲染, 但二维码登录step需等待扫码2分钟, 期间Summary一直空白

修复方案:

- ASCII二维码直接输出到step日志(纯Unicode无ANSI, 实时可见可扫码)

- 同时写入qr-summary.md文件

- workflow新增步骤: step结束后cat qr-summary.md >> GITHUB_STEP_SUMMARY

- 三层保障: 日志实时扫码 + Summary事后查看 + Artifacts下载PNG
- 移除日志中的 UTF-8 半块字符画输出(终端字符渲染不一致,手机无法扫描)
- Summary 摘要页嵌入真实 PNG 图片(<img> data URI),100% 可扫
- 生成后立即上传 artifact(qr/*.png),用户随时可下载高清图
- 日志仅输出清晰文字指引 + 链接兜底,引导用户去 Summary 页扫码
- workflow 去掉字符画 cat 步骤,改为生成成功后立即可下载图片
- 保留错误处理(::error:: 标注 + 失败提示步骤)和等待扫码轮询逻辑
核心变更:
- 新增 generateHtmlPage() 生成暗色主题 HTML 页面(内嵌 base64 大图二维码)
- gen 模式同时产出:login.html(聚合所有账号)+ qr-N.html(单独页面)+ qr-N.png
- workflow 在 gen 成功后立即上传「二维码HTML」artifact,用户立即可下载
- Summary 写入加固(加验证日志 + 错误 warn)
- 日志输出改为三档指引:①下载HTML扫码 ②Summary看图 ③链接兜底
根因:genMode() 是 async 函数但调用处未 await/.catch(),且末尾无
process.exit(0),导致 Node 进程在 close_api() 后因悬挂资源无法退出。
表现:gen 步骤长期显示 ●(运行中)→ 后续 wait/artifact 步骤全为
空心圆 ○ 不执行 → 二维码倒计时过期后 wait 才开始 → 扫码永远失败。

修复:
- genMode()/waitMode() 末尾加 .then(()=>process.exit(0)) 确保干净退出
- close_api() 加 Promise.race(3s 超时) 防止 API 服务关闭时挂死
- workflow 的 wait/upload 步骤条件改为 always() + outcome 判定,
  去掉 hashFiles() 守卫(避免因路径问题误跳过 artifact 上传)
核心变更:
1. 二维码展示改为 GitHub Release 直链(非 artifact 压缩包)
   - artifact 机制强制所有文件打包成 .zip,用户必须解压才能看,体验差
   - 新增「发布二维码图片直链」步骤:gh release create 上传 qr/*.png + login.html
   - 日志输出可点击直链:浏览器打开即显示图片,手机直接扫,零解压
   - 同时保留 HTML 网页链接(htmlpreview)作为备选
   - 仓库权限改为 contents: write;新增清理步骤(仅保留最近 5 个二维码 Release)
   - HTML artifact 改为仅在 Release 发布失败时的兜底

2. 修复 EADDRINUSE 导致 wait 步骤崩溃(本次运行 wait 直接报错退出)
   - startService 改用 detached: true 创建独立进程组
   - close_api 改用 process.kill(-pid, SIGKILL) 强杀整个进程组
     (npm 不会把 SIGTERM 转发给其子进程 Express,仅 api.kill() 无法释放 3000 端口)
   - 移除 stderr 中的 throw(避免 npm 警告误触发崩溃)
   - 附带 3s 超时保护防止挂死

3. 更新 qrcodeLogin.js 日志指引文案,指向直链步骤
1. 删除 buildQr() 中的 appendSummary 调用(Summary 不再输出二维码图片/
   标题/链接/有效期等描述,解决 Summary 页面内容过多的问题)
2. 简化日志指引文字,只保留一行直链提示
3. 删除 publish 步骤中的「打开完整网页」htmlpreview 链接
4. 新增「清理本次二维码 Release」步骤:wait 完成后立即删除
   qr-{run_id} Release,不再堆积
5. 旧 Release 清理策略从保留最近 5 个改为保留最近 3 个
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant