vault backup: 2026-11-09 09:21:06
This commit is contained in:
1 parent
bccc3138a8
commit
3fdebae345
11 files changed
+106
-11
No files matched your search
Vendored
+6
-6
@@ -197,8 +197,13 @@
|
|||||||
"realclaudian:Open Claudian": false
|
"realclaudian:Open Claudian": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "d850f0921be66d23",
|
"active": "b10e6fd1a0b41e79",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
|
"小鱼/闲鱼消息通知/README.md",
|
||||||
|
"小鱼/闲鱼消息通知/stop-watch.bat",
|
||||||
|
"小鱼/闲鱼消息通知/start-watch-hidden.vbs",
|
||||||
|
"小鱼/闲鱼消息通知/start-watch.bat",
|
||||||
|
"小鱼/闲鱼消息通知/probe.bat",
|
||||||
"百家/提示词库_每日15条_7天.md",
|
"百家/提示词库_每日15条_7天.md",
|
||||||
"百家/提示词库_高质量版.md",
|
"百家/提示词库_高质量版.md",
|
||||||
"百家/提示词包_第一批.md",
|
"百家/提示词包_第一批.md",
|
||||||
@@ -230,16 +235,11 @@
|
|||||||
"生财/06_Android程序员AI副业项目筛选.md",
|
"生财/06_Android程序员AI副业项目筛选.md",
|
||||||
"娟/2026年医保社保缴费季度汇总.md",
|
"娟/2026年医保社保缴费季度汇总.md",
|
||||||
"妹妹/妹妹身高.md",
|
"妹妹/妹妹身高.md",
|
||||||
"日常/OpenClaw小朋友入门指南.md",
|
|
||||||
"AndroidManifest.xml",
|
"AndroidManifest.xml",
|
||||||
"思睿/vocab_audio_output/audio/Day17.wav",
|
"思睿/vocab_audio_output/audio/Day17.wav",
|
||||||
"思睿/vocab_audio_output/audio/Day18.wav",
|
"思睿/vocab_audio_output/audio/Day18.wav",
|
||||||
"思睿/vocab_audio_output/audio/Day22.wav",
|
"思睿/vocab_audio_output/audio/Day22.wav",
|
||||||
"妹妹/妹妹身高.md.tmp.19184.32689a71f9b9",
|
"妹妹/妹妹身高.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_img2.png",
|
||||||
"思睿/身高/第一医院/报告/20261019报告/extracted_images/血常规 20261019_p1_img1.png",
|
"思睿/身高/第一医院/报告/20261019报告/extracted_images/血常规 20261019_p1_img1.png",
|
||||||
"思睿/身高/第一医院/报告/20261019报告/extracted_images/胰岛素测定 20261019_p1_img2.png",
|
"思睿/身高/第一医院/报告/20261019报告/extracted_images/胰岛素测定 20261019_p1_img2.png",
|
||||||
|
|||||||
@@ -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`:配置
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"debugPort": 9222,
|
"debugPort": 9333,
|
||||||
"urlMatch": "goofish.com",
|
"urlMatch": "goofish.com",
|
||||||
"pollSeconds": 5,
|
"pollSeconds": 5,
|
||||||
"titleRegex": "\\((\\d+)\\)",
|
"titleRegex": "\\((\\d+)\\)",
|
||||||
@@ -19,3 +19,4 @@
|
|||||||
"quietHours": null,
|
"quietHours": null,
|
||||||
"notifyOnDecrease": false
|
"notifyOnDecrease": false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
param(
|
param(
|
||||||
[int]$Port = 9222,
|
[int]$Port = 9333,
|
||||||
[string]$StartUrl = "https://seller.goofish.com/"
|
[string]$StartUrl = "https://seller.goofish.com/"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,3 +46,4 @@ try {
|
|||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "NEXT: log in to Goofish in this window, open the MESSAGES page, keep the tab open."
|
Write-Host "NEXT: log in to Goofish in this window, open the MESSAGES page, keep the tab open."
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
@echo off
|
||||||
|
cd /d "%~dp0"
|
||||||
|
echo === Goofish probe ===
|
||||||
|
node probe.js
|
||||||
|
echo.
|
||||||
|
echo Result file: probe-result.json
|
||||||
|
pause
|
||||||
+1
-1
@@ -4,7 +4,7 @@ const fs = require('fs');
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { CDP, listPages, EXPR } = require('./cdp');
|
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 () => {
|
(async () => {
|
||||||
const outFile = process.argv[2] || path.join(__dirname, 'probe-result.json');
|
const outFile = process.argv[2] || path.join(__dirname, 'probe-result.json');
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
+1
-1
@@ -13,7 +13,7 @@ const CONFIG_PATH = path.join(DIR, 'config.json');
|
|||||||
const LOG_PATH = path.join(DIR, 'watch.log');
|
const LOG_PATH = path.join(DIR, 'watch.log');
|
||||||
const STATE_PATH = path.join(DIR, 'state.json');
|
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 ARGS = process.argv.slice(2);
|
||||||
const TEST = ARGS.includes('--test');
|
const TEST = ARGS.includes('--test');
|
||||||
const DUMP = ARGS.includes('--dump');
|
const DUMP = ARGS.includes('--dump');
|
||||||
|
|||||||
@@ -1 +1,3 @@
|
|||||||
[2026/11/9 09:17:49] 发送测试通知…
|
[2026/11/9 09:17:49] 发送测试通知…
|
||||||
|
[2026/11/9 09:21:05] 发送测试通知…
|
||||||
|
[2026/11/9 09:21:05] 测试通知已发出。若无弹窗,请检查 Windows 通知设置里是否允许 PowerShell/脚本宿主通知。
|
||||||
Reference in new issue
Block a user