Switch eShop 全区史低折扣日报(含微信送达)
目的
一条链路走完:抓数据 → 折算人民币 → 出中文日报 → 发布为微信可打开的活页 → 推送到本人微信。
除了信息汇总与送达,本技能不执行任何购买、代购、下单、支付操作。
何时使用
- 用户要「Switch 打折 / 史低 / eShop 优惠 / 游戏折扣日报」
- 需要「全区服比价、找最便宜区」「按热度推荐打折游戏」
- 需要「把日报发到我微信 / 生成微信里能打开的链接」
- 需要配置每日定时推送(配合 automation)
前置:先读配置,不要硬编码
- 读工作区
.switch-eshop.json;不存在则复制assets/config.example.json初始化并写回。 - 关键字段:
wishlist_path、output_dir、livepage.proposal_id(空 = 首次运行需新建页面)、livepage.title、delivery.wechat_push。含义与默认值见references/config.md。 - 凡本文件未写明的路径与 ID,一律从配置读取,禁止猜测,也不要把某次运行的绝对路径写死进脚本。
- 活页与微信推送依赖
24haowan-space(方案空间)连接器;未连接时先请用户连接,不要跳过,也不要编造发送结果。
工作流(按序执行)
- 读配置 + 读心愿单:按
wishlist_path读取games(字段name_en/name_zh/aliases)。逐款核实是否在折、折扣%、最便宜区、是否史低、结束日期;未在折标「未在折」,查不到标「待核实」。详见references/wishlist.md。 - 抓热度 + 史低信号:用 WebFetch 抓
https://www.dekudeals.com/hottest,提取带Lowest price ever/Matches previous low标记的条目(标题、折扣%、现价、结束日)。
- ⚠️ Deku 对 curl/requests 返回 403,必须用 WebFetch;scripts/fetch_pages.py对该站仅备用。
- ⚠️ 该站按请求地 IP 切换展示货币(USD/EUR/SGD/SEK 都出现过),先确认页面上的货币符号再换算,不要预设美元。 - 抓全区史低榜:WebFetch
https://checkgreenpipe.com/all-time-low,取头部统计(ATL+MPL 总数、今日新史低、低于 $5 数量、国家数)与表格行(游戏、最便宜国、价、折扣、ATL/MPL、结束)。 - 核实重点心愿单最便宜区:WebFetch
https://checkgreenpipe.com/game/<slug>。
- slug:英文名去 ™/®、小写、空格与非字母数字转-。
- 高效做法:页面<script type="application/ld+json">内含各区offers(USD 报价,seller 括号里是国家码),可批量解析;是否在折扣看页面N/M搭配Regions on sale,0/M即当前不在折。
- Green Pipe 只收录约 800+ 款游戏。未收录的必须标「待核实」,不得用他区价格臆造成「全区最低」。 - 折算人民币:取当日汇率(如
https://open.er-api.com/v6/latest/CNY,各币种取倒数),在报告顶部统一声明所用汇率;外币价一律标「≈¥xx」。 - 生成日报:严格按
references/output-template.md,中文 Markdown,「中文(English 原名)」。 - 转移动端 HTML:
python scripts/md2html.py <日报.md> <输出.html> [标题],把产物作为发布包入口。 - 发布到活页:按
references/delivery.md:
-proposal_id为空 → 先create_proposal(标题用livepage.title)→ 把 id 写回配置;
-create_cli_token取临时令牌 →scripts/publish.mjs推送(不加--hold,过审即生效,同一链接自动更新为当天内容)。 - 推送微信:
push_to_wechat(proposal_id, to="self");若该页已开自动推送且已收到,可跳过此步,但总结里必须写明是否送达。 - 交付:
present_files展示本地日报与活页链接,附中文总结(今日概况、最值得买的 2–3 款、送达状态)。
关键约束
- 价格一律人民币:本就是 CNY 的(如 JUMP 心愿单价)原样用;Deku / Green Pipe 外币按顶部声明汇率换算并标「≈¥」。
- 史低口径:Deku 以美服/欧元区为基准,Green Pipe 以各分区为基准;同一游戏各区是否同创史低可能不同,须分别标「新史低 / 平史低 / X 区史低」。
- 不臆造:查不到写「待核实」,不要用往年价或他区价顶替。
- 跨区限制:跨区购买需对应区服账号或礼品卡;阿根廷、土耳其等区有支付限制,低价不等于可买。
- 对外动作需用户确认:
set_visibility(口令/公开)、publish_version切换、revoke_*、删除版本,均属对外或不可逆操作,必须先获明确同意。
失败与重试
- 抓取/写入失败:只重试失败步骤,最多 3 次、间隔约 5 分钟,复用已抓数据。
- 发布失败:令牌过期 → 重新
create_cli_token再试一次;审核未过 → 按返回的fix改文件重传,不得绕过。 - 推送失败:重试 3 次仍失败则在结果首行标「⚠️ 微信未送达」并写明卡在哪一步,不得静默结束。
- 任何情况下都保留本地 Markdown 与 HTML。
参考资源
references/config.md:配置字段、默认值、换人换机的注意事项。references/data-sources.md:数据源、字段、slug 规则、口径。references/output-template.md:日报模板(含 CNY 折算要求)。references/delivery.md:活页发布 + 微信推送的操作与故障处理。references/wishlist.md:心愿单结构与增减流程。scripts/md2html.py:Markdown → 移动端单文件 HTML。scripts/publish.mjs:活页上传封装(首次自动获取官方 CLI)。assets/example-digest.md、assets/config.example.json:样例与配置模板。UPDATENOTE.md:版本更新说明(社区上传用)。