From 3fdebae345dd29cfc013cc151a2e2587bd9ee5ef Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 9 Nov 2026 09:21:06 +0800 Subject: [PATCH] vault backup: 2026-11-09 09:21:06 --- .obsidian/workspace.json | 12 ++--- 小鱼/闲鱼消息通知/README.md | 69 ++++++++++++++++++++++++ 小鱼/闲鱼消息通知/config.json | 3 +- 小鱼/闲鱼消息通知/launch-edge.ps1 | 5 +- 小鱼/闲鱼消息通知/probe.bat | 7 +++ 小鱼/闲鱼消息通知/probe.js | 2 +- 小鱼/闲鱼消息通知/start-watch-hidden.vbs | 5 ++ 小鱼/闲鱼消息通知/start-watch.bat | 6 +++ 小鱼/闲鱼消息通知/stop-watch.bat | 4 ++ 小鱼/闲鱼消息通知/watch.js | 2 +- 小鱼/闲鱼消息通知/watch.log | 2 + 11 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 小鱼/闲鱼消息通知/README.md create mode 100644 小鱼/闲鱼消息通知/probe.bat create mode 100644 小鱼/闲鱼消息通知/start-watch-hidden.vbs create mode 100644 小鱼/闲鱼消息通知/start-watch.bat create mode 100644 小鱼/闲鱼消息通知/stop-watch.bat diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index db4524a..34f37bc 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -197,8 +197,13 @@ "realclaudian:Open Claudian": false } }, - "active": "d850f0921be66d23", + "active": "b10e6fd1a0b41e79", "lastOpenFiles": [ + "小鱼/闲鱼消息通知/README.md", + "小鱼/闲鱼消息通知/stop-watch.bat", + "小鱼/闲鱼消息通知/start-watch-hidden.vbs", + "小鱼/闲鱼消息通知/start-watch.bat", + "小鱼/闲鱼消息通知/probe.bat", "百家/提示词库_每日15条_7天.md", "百家/提示词库_高质量版.md", "百家/提示词包_第一批.md", @@ -230,16 +235,11 @@ "生财/06_Android程序员AI副业项目筛选.md", "娟/2026年医保社保缴费季度汇总.md", "妹妹/妹妹身高.md", - "日常/OpenClaw小朋友入门指南.md", "AndroidManifest.xml", "思睿/vocab_audio_output/audio/Day17.wav", "思睿/vocab_audio_output/audio/Day18.wav", "思睿/vocab_audio_output/audio/Day22.wav", "妹妹/妹妹身高.md.tmp.19184.32689a71f9b9", - "思睿/身高/综合健康评估总结.md.tmp.19184.2086e2a61774", - "思睿/身高/第一医院/病例/2026-10-19.pdf", - "百家/单篇数据归因分析.xlsx", - "思睿/身高/综合健康评估总结.md.tmp.19184.eef11a9104a9", "思睿/身高/第一医院/报告/20261019报告/extracted_images/血常规 20261019_p1_img2.png", "思睿/身高/第一医院/报告/20261019报告/extracted_images/血常规 20261019_p1_img1.png", "思睿/身高/第一医院/报告/20261019报告/extracted_images/胰岛素测定 20261019_p1_img2.png", diff --git a/小鱼/闲鱼消息通知/README.md b/小鱼/闲鱼消息通知/README.md new file mode 100644 index 0000000..d0ce004 --- /dev/null +++ b/小鱼/闲鱼消息通知/README.md @@ -0,0 +1,69 @@ +# 闲鱼卖家消息通知(Edge + 调试端口轮询) + +在不改网页、不装扩展的前提下,用你**自己的登录态**盯着 seller.goofish.com 的未读红点,一旦有新消息就: +本地 Windows 弹窗 + 提示音,并(可选)转发到飞书 / 企业微信 / 钉钉 / Bark(iPhone)/ Server酱。 + +## 原理 + +`launch-edge.bat` 用**独立 profile** 启动 Edge 并打开调试端口(9333)。`watch.js` 通过 CDP 每 5 秒读一次页面 DOM 里的未读徽标,数值变大就通知。 +独立 profile 是必需的:Edge 136+ 在默认 profile 上会忽略调试端口。 + +## 三步上手 + +1. **双击 `launch-edge.bat`** → 在弹出的 Edge 窗口里扫码登录闲鱼,进入**消息页**,保持标签页开着。 + (窗口顶部会有一条"正在受自动化软件控制"的提示,正常。) +2. **双击 `probe.bat`** → 生成 `probe-result.json`,把结果发给助手校准未读元素的选择器。 +3. **双击 `start-watch.bat`** 测试;确认能弹窗后,改用 `start-watch-hidden.vbs` 后台常驻。 + +## 通知配置 + +- 只想要本地弹窗/声音:默认即可。 +- 想推到手机/群里:编辑 `config.json` 的 `webhooks` 数组,加一条即可,支持: + +| type | url 说明 | +|---|---| +| `feishu` | 飞书群 → 添加自定义机器人,复制 webhook 地址 | +| `wecom` | 企业微信群机器人地址 | +| `dingtalk` | 钉钉自定义机器人地址 | +| `bark` | `https://api.day.app/你的KEY`(iPhone 锁屏推送,推荐) | +| `serverchan` | `https://sctapi.ftqq.com/你的KEY.send` | +| `custom` | 任意 URL,可选 `method`/`headers`/`body`,body 里可用 `{{title}}` `{{text}}` | + +示例: + +```json +"webhooks": [ + { "type": "feishu", "url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxxx" }, + { "type": "bark", "url": "https://api.day.app/你的KEY" } +] +``` + +配好后先跑一次测试:`node watch.js --test` + +## 其他配置项 + +| 键 | 说明 | +|---|---| +| `pollSeconds` | 轮询间隔,默认 5 秒 | +| `badgeFilter.requireRed` | 只认红色徽标,减少误报 | +| `badgeFilter.includePathRegex` | 只监视路径匹配的元素,例如 `"im-nav|message"` | +| `notifyOnDecrease` | 已读后消息数变少时也提醒(默认关) | +| `quietHours` | `{"from":"23:00","to":"08:00"}`,静默时段不打扰 | +| `heartbeatMinutes` | 每隔 N 分钟写一条心跳日志,确认还活着 | + +## 注意事项 + +- **这个 Edge 窗口的登录态独立**,和你日常用的 Edge 互不影响;闲鱼的登录过期后需要重新扫码。 +- 别把 `edge-profile` 目录删了,删了就得重新登录。 +- 页面大改版时红点结构会变,届时重跑 `probe.bat` 重新校准。 +- 关机自启:把 `start-watch-hidden.vbs` 的快捷方式丢进 `shell:startup`。 +- 日志:`watch.log`,超过 2MB 自动转成 `watch.log.old`。 + +## 文件 + +- `launch-edge.ps1` / `launch-edge.bat`:启动带调试端口的 Edge +- `probe.js` / `probe.bat`:摸清页面未读元素结构 +- `watch.js`:监听主程序 +- `cdp.js`:极简 CDP 客户端(零依赖,用 Node 22 内置 WebSocket) +- `notify.js` + `toast.ps1`:Toast 弹窗、提示音、webhook 转发 +- `config.json`:配置 diff --git a/小鱼/闲鱼消息通知/config.json b/小鱼/闲鱼消息通知/config.json index dd88192..6a7d800 100644 --- a/小鱼/闲鱼消息通知/config.json +++ b/小鱼/闲鱼消息通知/config.json @@ -1,5 +1,5 @@ { - "debugPort": 9222, + "debugPort": 9333, "urlMatch": "goofish.com", "pollSeconds": 5, "titleRegex": "\\((\\d+)\\)", @@ -19,3 +19,4 @@ "quietHours": null, "notifyOnDecrease": false } + diff --git a/小鱼/闲鱼消息通知/launch-edge.ps1 b/小鱼/闲鱼消息通知/launch-edge.ps1 index 96eaea3..90270d5 100644 --- a/小鱼/闲鱼消息通知/launch-edge.ps1 +++ b/小鱼/闲鱼消息通知/launch-edge.ps1 @@ -1,5 +1,5 @@ -param( - [int]$Port = 9222, +param( + [int]$Port = 9333, [string]$StartUrl = "https://seller.goofish.com/" ) @@ -46,3 +46,4 @@ try { Write-Host "" Write-Host "NEXT: log in to Goofish in this window, open the MESSAGES page, keep the tab open." + diff --git a/小鱼/闲鱼消息通知/probe.bat b/小鱼/闲鱼消息通知/probe.bat new file mode 100644 index 0000000..5ea5c42 --- /dev/null +++ b/小鱼/闲鱼消息通知/probe.bat @@ -0,0 +1,7 @@ +@echo off +cd /d "%~dp0" +echo === Goofish probe === +node probe.js +echo. +echo Result file: probe-result.json +pause diff --git a/小鱼/闲鱼消息通知/probe.js b/小鱼/闲鱼消息通知/probe.js index f1cf943..fae8ad3 100644 --- a/小鱼/闲鱼消息通知/probe.js +++ b/小鱼/闲鱼消息通知/probe.js @@ -4,7 +4,7 @@ const fs = require('fs'); const path = require('path'); const { CDP, listPages, EXPR } = require('./cdp'); -const cfg = JSON.parse(fs.readFileSync(path.join(__dirname, 'config.json'), 'utf8')); +const cfg = JSON.parse(fs.readFileSync(path.join(__dirname, 'config.json'), 'utf8').replace(/^\uFEFF/, '')); (async () => { const outFile = process.argv[2] || path.join(__dirname, 'probe-result.json'); diff --git a/小鱼/闲鱼消息通知/start-watch-hidden.vbs b/小鱼/闲鱼消息通知/start-watch-hidden.vbs new file mode 100644 index 0000000..94c992f --- /dev/null +++ b/小鱼/闲鱼消息通知/start-watch-hidden.vbs @@ -0,0 +1,5 @@ +Set shell = CreateObject("WScript.Shell") +Set fso = CreateObject("Scripting.FileSystemObject") +base = fso.GetParentFolderName(WScript.ScriptFullName) +shell.CurrentDirectory = base +shell.Run "node watch.js", 0, False diff --git a/小鱼/闲鱼消息通知/start-watch.bat b/小鱼/闲鱼消息通知/start-watch.bat new file mode 100644 index 0000000..06af4c0 --- /dev/null +++ b/小鱼/闲鱼消息通知/start-watch.bat @@ -0,0 +1,6 @@ +@echo off +cd /d "%~dp0" +title Goofish Watcher +echo === Goofish watcher (visible mode, Ctrl+C to stop) === +node watch.js --dump +pause diff --git a/小鱼/闲鱼消息通知/stop-watch.bat b/小鱼/闲鱼消息通知/stop-watch.bat new file mode 100644 index 0000000..e749df2 --- /dev/null +++ b/小鱼/闲鱼消息通知/stop-watch.bat @@ -0,0 +1,4 @@ +@echo off +powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \"Name='node.exe'\" | Where-Object { $_.CommandLine -like '*watch.js*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force; Write-Host ('stopped ' + $_.ProcessId) }" +echo done. +pause diff --git a/小鱼/闲鱼消息通知/watch.js b/小鱼/闲鱼消息通知/watch.js index f142fd9..f2268e4 100644 --- a/小鱼/闲鱼消息通知/watch.js +++ b/小鱼/闲鱼消息通知/watch.js @@ -13,7 +13,7 @@ const CONFIG_PATH = path.join(DIR, 'config.json'); const LOG_PATH = path.join(DIR, 'watch.log'); const STATE_PATH = path.join(DIR, 'state.json'); -const cfg = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8')); +const cfg = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8').replace(/^\uFEFF/, '')); const ARGS = process.argv.slice(2); const TEST = ARGS.includes('--test'); const DUMP = ARGS.includes('--dump'); diff --git a/小鱼/闲鱼消息通知/watch.log b/小鱼/闲鱼消息通知/watch.log index 879b1d2..4026a66 100644 --- a/小鱼/闲鱼消息通知/watch.log +++ b/小鱼/闲鱼消息通知/watch.log @@ -1 +1,3 @@ [2026/11/9 09:17:49] 发送测试通知… +[2026/11/9 09:21:05] 发送测试通知… +[2026/11/9 09:21:05] 测试通知已发出。若无弹窗,请检查 Windows 通知设置里是否允许 PowerShell/脚本宿主通知。