feat: 二维码登录改用 Release 直链 + 通知/令牌/代码精简优化#21
Open
xfxx2022 wants to merge 18 commits into
Open
Conversation
- 新增 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 个
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
kgcheckin 完整变更清单(合并前期修复 + 本次二维码登录修复)
一、二维码登录功能(核心修复链路)
1.1 展示方案演进(解决"看不到 / 扫不上")
██/ UTF-8 半块)<img>data URI1.2 关键 Bug 修复
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上下文丢失与参数顺序错误。<img>渲染。1.3 体验优化
qrcodeLogin.js拆分为gen/wait两种模式,跨 step 用qrkeys.json传递密钥。gh release delete qr-{run_id}),旧 Release 仅保留最近 3 个,避免持续堆积。qrcodeLogin.yml等 workflow,统一二维码登录入口。涉及文件:
qrcodeLogin.js、utils/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。
三、令牌功能分析(前期)
Secrets.PAT):通过ghCLI 自动将酷狗登录信息写回USERINFOSecret;每周日自动刷新酷狗 Token。Secrets.USERINFO):酷狗 API 身份认证,签到核心凭证。四、代码精简与优化(前期)
utils/userinfo.js,消除phoneLogin.js与qrcodeLogin.js中约 60 行重复代码。youth_listen_song.js中encryptTyPe→encryptType。qrcodeLogin.js内层循环i遮蔽外层i,改为n/j。utils.js注释代码、优化notify.js死代码与超时定时器。README.md说明二维码登录与令牌机制。五、验证情况
gen干净退出(exit 0)、wait正常轮询到登录成功;GitHub Actions 实测扫码登录成功。close_api不崩溃且端口可释放。