果到雷达是一款 Apple 直营店取货库存监控工具。选好地区、门店和具体型号后,它会定时检查库存;检测到有货时,可以播放提示音、推送 Bark,并按你的选择打开 Apple 购物袋或商品详情。
支持 macOS、Windows 和 Linux,使用 Rust、Tauri 2 和 React 编写。果到雷达的正式版本从 1.0.0 开始,本 README 对应 1.0.19 源码。应用名称为 果到雷达,仓库名为 apple-store-inventory-monitor。
基于 ENCHIGO/apple-pickup-watcher v0.3.2 继续开发,按 GPL-3.0-or-later 发布。来源与修改记录见 NOTICE。
本项目不是 Apple 官方软件,与 Apple Inc. 没有关系,也没有获得 Apple 授权。它只负责查询和提醒,不能预留库存,也不会替你下单。
快速开始 · 下载安装 · 使用方法 · 常见问题 · 从源码运行 · 反馈问题
截图中的 Bark 密钥已遮挡;库存仅代表拍摄时结果。截图来自更新前的本地版本,日志中的旧提醒记录不代表当前版本提供系统通知。当前提醒方式为提示音、Bark 和可选的页面跳转。
如果你只想使用软件,不需要安装 Rust、Node.js 或 pnpm。它们只供开发者从源码构建。
- 按下方安装说明下载并安装适合自己电脑的版本。
- 确认电脑已安装 Google Chrome 或 Microsoft Edge。Linux 也可以使用 PATH 中的 Chromium。Firefox、Safari、Brave 等浏览器目前不能用于库存查询。软件不会读取你平时使用的浏览器资料。
- 打开果到雷达。macOS 和 Windows 可能会拦截未经公证或没有开发者证书的应用,处理方法见安装。
- 如果想在 iPhone 上收到到货通知,先按 Bark 教程安装并配置 Bark;不需要手机推送可以跳过。
- 选择地区和品类,再勾选门店与型号,点击「添加监控」。
- 选择提示音、Bark 和「到货后打开」方式,再点一次「测试提醒与跳转」。
- 确认测试正常后点击「开始监控」。看到「未知」时先看活动日志,不要把它当成无货。
- 如果经常出现「请求被 Apple 拦截」,并且电脑上装有 Clash,可以按查询线路与 Clash 配置为查询单独设置出口。
Apple 可能限流或调整接口,库存也可能在提醒后立即变化。最终能否取货,以 Apple 官网下单时的结果为准。
运行时需要以下任意一种浏览器:
- Google Chrome
- Microsoft Edge
- Chromium(Linux,需要能从 PATH 直接启动)
应用会自动查找常见安装位置。macOS 请把 Chrome 或 Edge 安装在系统的「应用程序」目录(/Applications);放在其他目录可能无法识别。没有找到浏览器时,监控项会显示为「未知」,日志会说明原因。
目前只提供桌面版,不支持 iPhone、iPad 或 Android。Bark 只是把有货消息推送到 iPhone,真正的库存监控仍在电脑上运行。电脑休眠、关机或彻底退出应用后,监控也会停止。
打开 最新正式版本,在 Assets 中下载对应系统的安装包。每个版本的变化见 更新记录。
普通用户只需要下表中的安装包,不需要下载 .sig、latest.json、.app.tar.gz 或 GitHub 自动提供的 Source code 压缩包。
| 你的电脑 | 推荐下载 |
|---|---|
| Apple 芯片 Mac(M1、M2、M3、M4 等) | 文件名含 aarch64 的 .dmg |
| Intel 芯片 Mac | 文件名含 x64 的 .dmg |
| Windows x64(Intel / AMD) | *-setup.exe |
| Ubuntu 24.04 或更新的 64 位 Linux | *_amd64.deb 或 *_amd64.AppImage |
不知道 Mac 使用哪种芯片时,点击屏幕左上角苹果菜单,选择「关于本机」:显示 Apple M 系列就下载 aarch64,显示 Intel 就下载 x64。
- 打开
.dmg,把果到雷达.app拖进「应用程序」,不要直接在磁盘映像中长期运行。 - 应用包已经过完整的 ad-hoc 签名,但暂未使用 Developer ID 证书,也未经过 Apple 公证。如果系统提示无法验证开发者,可以在 Finder 中按住 Control 点击应用并选择「打开」,或到「系统设置 → 隐私与安全性」确认被拦截的是本应用,再选择「仍要打开」。
v1.0.2 的 macOS 包曾因应用签名不完整而被系统误报为“已损坏”,此问题已在 v1.0.3 修复。如果新版仍显示旧提示,请先删除旧应用和旧 DMG,确认重新下载的文件名包含 1.0.19。确认安装包来自本仓库 Release 后,仍可执行:
xattr -dr com.apple.quarantine "/Applications/果到雷达.app"然后重新打开应用。这条命令只移除该应用的下载隔离标记,不会关闭 macOS 的全局安全功能。不要对来源不明的应用执行这条命令。
推荐使用 *-setup.exe。未签名版本可能触发 SmartScreen。确认文件来自本仓库 Release 后,可点击「更多信息」,再选择「仍要运行」。Windows 自带 Microsoft Edge,一般不需要另装浏览器。
Release 提供 x64 的 .deb 和 .AppImage。安装包在 Ubuntu 24.04 上构建,需要 glibc 2.39 或更高版本;较老的发行版请从源码构建。
在终端进入安装包所在目录(例如 cd ~/Downloads),选择一种方式安装。以下命令中的文件名请替换为实际下载的文件名。
Debian / Ubuntu:
sudo apt install "./apple-store-inventory-monitor_1.0.19_amd64.deb"apt 会同时安装包声明的依赖。音频播放和托盘还需要 ALSA 与 AppIndicator 运行库。
AppImage:
chmod +x "./apple-store-inventory-monitor_1.0.19_amd64.AppImage"
"./apple-store-inventory-monitor_1.0.19_amd64.AppImage"AppImage 需要 FUSE 2。Ubuntu 24.04 可以用 sudo apt install libfuse2t64 安装;也可以不安装 FUSE,直接解包运行:
"./apple-store-inventory-monitor_1.0.19_amd64.AppImage" --appimage-extract-and-runLinux 还需要自行安装 Chrome、Edge 或 Chromium。使用 Chromium 时,请确认终端可以运行 chromium 或 chromium-browser。
- 支持 iPhone、iPad、Mac 和 Apple Watch。
- 内置中国大陆、中国香港、中国台湾、日本、新加坡、澳大利亚和马来西亚的 Apple Store 列表。
- 门店和型号都可以多选,添加时会自动生成全部组合。
- 同一门店的多个型号会合并查询;超过 Apple 单次稳定返回的 20 个零件号时自动分批,避免静默遗漏。
- iPhone 型号选择和监控列表按代际优先显示新款;型号名称保留可确认的容量、颜色和规格。
- 区分有货、无货、不支持取货、暂未开售、即将发售和暂不可购买,分别使用独立配色;查询失败保留为未确认状态。
- 监控列表同时展示门店取货日期和 Apple 预计送货日期;具体日期按送达速度着色,只有周数范围时保留 Apple 原文,不自行推算日期。
- 送货地区使用 Apple 官网提供的省、市、区三级选项;Apple Watch 可继续选择表带款式、颜色和腕围尺码,以完整表壳与表带组合查询送货信息。
- 同一型号和送货地址在不同门店之间共享送货结果:有效信息缓存 60 分钟,空结果缓存 5 分钟,到期后在监控查询中刷新;刷新失败会保留上次日期。修改送货地区后按新地址查询,退出应用后缓存不会保留。门店取货状态仍按设置的查询间隔更新。
- 支持提示音和 Bark 推送;可为不同型号指定不同的 Bark 地址,把到货消息分发给不同的人。
- 有货时可以选择不自动打开页面、打开对应地区的 Apple 购物袋,或打开对应型号的商品详情;也可以点击监控列表中的型号手动打开商品详情。
- 可通过 Clash 为库存查询单独指定出口,或在多个节点之间自动轮换,减少被 Apple 拦截;不影响电脑本身使用的节点。详见查询线路与 Clash 配置。
- 窗口关闭后可继续在系统托盘运行。
- 默认使用内置的门店列表和型号目录;点击刷新按钮可从 Apple 官网更新门店和当前品类的型号,更新结果保存在本机,重启后继续使用。网络失败时继续使用已有目录。
- 活动日志逐轮显示每项状态、门店编号、商品零件号及 Apple 返回的取货、购买和配送说明,并按状态汇总。
- 支持应用内检查更新。
下面按照第一次使用的顺序操作。Bark、提示音和自动打开页面都是可选项,至少配置一种自己需要的提醒方式即可。
- 先正常打开一次 Chrome 或 Edge,确认它能访问 Apple 官网;Linux 也可以使用 Chromium。
- 再打开果到雷达,等待界面显示地区、品类和门店选项。
- 如果需要手机通知,先在 iPhone 上配置 Bark;如果只需要电脑播放提示音,可以跳过 Bark。
果到雷达必须在电脑上保持运行。Bark 只负责把通知送到 iPhone,不能代替电脑查询库存。电脑睡眠、关机或彻底退出果到雷达后,监控都会停止。
- 选择地区和品类。
- 在门店下拉框中勾选一家或多家门店。
- 在型号下拉框中搜索并勾选一个或多个具体配置。容量、颜色、尺寸或连接类型不同,会被视为不同型号。
- 点击「添加监控」。
门店和型号会按组合添加。例如,选择 2 家门店和 3 个型号,会生成 6 条监控。已存在的组合会被跳过。
门店和型号默认使用应用内置的目录。找不到刚发布的型号或新开的门店时,点击「添加监控」旁边的刷新按钮,从 Apple 官网更新门店列表和当前品类的型号,活动日志会显示更新结果。刷新结果保存在本机,重启后继续使用;刷新不会替换已经保存的监控项。使用「指定节点」或「Clash 节点轮换」时,刷新请求也经由相同的 Clash 专用端口;如果当前节点无法访问该地区官网(例如家庭宽带直连访问 www.apple.com 被断开),会自动改用系统网络刷新,并在日志中说明。机型出现在列表中不代表它已经开放预购或门店取货;旧型号已下架或 Apple 暂时没有取货数据时,可能显示「暂无数据」。
切换地区会清空上方尚未添加的门店和型号选择,但不会删除已经在监控列表中的项目。
- 提示音:打开后,电脑检测到有货时会播放声音。请确保系统没有静音。
- 默认 Bark 推送:适合把所有商品的提醒发送到同一台 iPhone。
- 型号专属 Bark:适合把某个型号的提醒发送给其他人,或者发送到另一台 iPhone。
- 到货后打开:可以选择「不自动打开」「购物袋」「跳转至教育商店购物袋」或「商品详情」。这些选项只负责打开页面,不会自动加入购物袋、预留库存或下单。教育商店的购买资格及优惠商品以 Apple 页面为准。
持续有货时,每一轮都会再次执行已经开启的提醒。如果不想浏览器反复出现新页面,请把「到货后打开」设为「不自动打开」。
Bark 是一款把自定义通知推送到 iPhone 或 iPad 的独立应用。它不是必需组件:不使用 iPhone,或者只想听电脑提示音时,可以完全跳过这一节。
打开 App Store 中的 Bark,或者在 App Store 搜索完整名称 “Bark - 给你的手机发推送”。安装后打开 Bark,并允许它发送通知。Bark 的源代码和官方说明可在 Finb/Bark 查看。
打开 Bark 首页,找到并复制它显示的推送地址或测试 URL。果到雷达需要的是“服务器地址 + 设备 Key”,通常形如:
https://api.day.app/你的设备Key
如果 Bark 显示的是下面这种带测试文字的完整地址:
https://api.day.app/你的设备Key/这里改成你自己的推送内容
只把前半段 https://api.day.app/你的设备Key 填入果到雷达,不要把最后的测试文字一起粘贴。使用自建 Bark 服务器时规则相同:地址必须以 http:// 或 https:// 开头,并且路径中包含设备 Key。
设备 Key 相当于这台设备的推送凭证。不要把真实地址发到群聊、截图、公开 Issue 或代码仓库中。
- 回到电脑上的果到雷达。
- 在右侧「默认 Bark 推送」输入框粘贴地址。
- 点击输入框外的空白位置,让设置保存。
- 如果所有型号都推送到同一台手机,到这里就配置完成了。
想让某个型号推送给另一台手机时,先添加该型号的监控,再点击监控列表 Bark 一栏中的「默认」,在弹窗中填写另一条 Bark 地址并保存。按钮会变成「专属」。同一型号即使监控多家门店,也共用这一条专属地址;清空专属地址并保存,就会恢复使用默认 Bark。
点击「测试提醒与跳转」,然后检查:
- iPhone 是否收到标题为“提醒测试(不代表有货)”的通知。
- 果到雷达活动日志是否显示 Bark 已执行,还是给出了失败原因。
- 如果配置了型号专属 Bark,测试会使用监控列表中第一个型号的地址;因此测试专属地址前,应先把对应型号添加到列表。
测试按钮不会查询 Apple 库存,也不代表商品有货。只有手机实际收到通知,才能确认 Bark 链路已经可用。
「测试提醒与跳转」还会测试当前开启的提示音和「到货后打开」选项:
- 选择「购物袋」时,会打开当前地区的 Apple 购物袋。
- 选择「跳转至教育商店购物袋」时,会打开当前地区的 Apple 教育商店购物袋。
- 选择「商品详情」时,需要先添加监控目标;测试会打开列表中第一个型号的商品页。
- 选择「不自动打开」时,不会打开浏览器,Bark 通知中也不会附带页面链接。
如果只想测试某一项,可以暂时关闭其他提醒。测试完成后,再恢复自己真正需要的设置。
- 点击右上角「开始监控」。
- 等待第一轮完成,在监控列表和活动日志中查看每个项目的结果。
- 需要暂时停止查询时,点击「暂停监控」。
- 关闭主窗口后,应用会留在系统托盘继续运行;需要完全退出时,请从托盘菜单选择「退出」。
重新打开应用会恢复已保存的监控列表,但需要再次点击「开始监控」。
监控列表中的「最后检查」表示该条目最近一次完成查询的时间。活动日志会在每轮结束后显示类似内容:
第 2 轮 · 无货:上海-香港广场 [R390] iPhone Air…(取货=unavailable;购买=OK…)
第 2 轮 · 不支持取货:上海-五角场 [R581] Apple Watch…(取货=ineligible…)
第 2 轮 · 有货:上海-环球港 [R683] iPhone 17…(取货=available;Apple:今天…)
第 2 轮完成(4.4 秒,实际请求 1 次,批量响应覆盖 2 家门店):无货 1 项、不支持取货 1 项、有货 1 项。约 30 秒后查询。
第一条商品有货不会停止本轮查询。监控引擎会继续处理剩余门店和型号;持续有货时,每一轮都会再次执行已启用的提醒动作。
默认查询间隔为 30 秒,界面允许的下限是 5 秒。日常使用建议保留 30 秒或更长,避免频繁请求触发 Apple 风控。
间隔从本轮查询结束后开始计算。例如设置为 30 秒,正常取得库存结果时,会在本轮结束 30 秒后开始下一轮;整轮查询本身的耗时另计。
同一地区、相同型号组合的附近门店会优先复用首个响应;响应没有包含目标门店或型号时才补发请求。为避免瞬时请求突发,任意两次真实库存请求之间仍至少间隔 2 秒,但成功的正常轮次不会再因累计额度延后下一轮。
Apple 返回 403、541 或 429 时,处理方式取决于「查询线路」:跟随系统代理和指定节点模式下,当轮同地区不再重复请求,下一轮按设定间隔继续重试;Clash 节点轮换模式下,被拒的节点进入冷却并立即换下一个节点,所有节点都不可用时,下一轮等到最早恢复的节点。界面倒计时和日志会显示调度器实际采用的等待时间。
Apple 按出口 IP 统计请求次数,同一 IP 连续查询一定次数后会返回 HTTP 541,并在十几分钟内持续拒绝。实测中不同出口的额度差异很大:家庭宽带有时十几次请求就被拒,部分机场节点可以撑过数十次。如果你经常看到「请求被 Apple 拦截」,可以在右侧「查询线路」中为查询单独指定出口,或让程序在多个 Clash 节点之间自动轮换。
不使用 Clash 的用户保持默认的「跟随系统代理」即可,本节可以跳过。
| 出口方式 | 适合谁 | 行为 |
|---|---|---|
| 跟随系统代理(默认) | 不使用代理,或不想改动 Clash | 与旧版本一致。开着 Clash 系统代理或 TUN 时,出口由 Clash 规则决定 |
| 指定节点 | 想固定用某个节点,或固定用家庭宽带 | 经 Clash 专用端口固定使用一个节点,不自动切换。选 DIRECT 即使用本机网络,Clash 开着 TUN 也有效 |
| Clash 节点轮换 | 有机场订阅、经常被拦截 | 平时一直用当前节点;被 Apple 拒绝时冷却该节点并立即换下一个 |
Clash 节点轮换的具体规则:
- 节点被 Apple 拒绝(
541、403、429)后冷却 5 分钟;冷却结束后的第一次请求仍被拒,则依次延长到 10、20、30 分钟,成功一次即恢复。 - 切换前先对目标节点测速,测不通的节点跳过 60 秒,直接试下一个。测速地址为
https://www.gstatic.com/generate_204,不消耗 Apple 的请求额度;DIRECT 不参与测速。 - 连续 10 个不同节点都被 Apple 拒绝时,本轮停止切换,因为这通常说明拦截的不只是 IP。
- 所有节点都不可用时,下一轮等到最早恢复的节点,界面显示「冷却中」和倒计时。
- 可以在「当前节点」中手动指定节点,手动指定会解除该节点的冷却;之后被拒时仍会自动切换。
两种 Clash 模式都只切换果到雷达专用的策略组,只让查询浏览器使用专用端口,电脑上其他软件使用的节点不受影响。
需要使用 mihomo(Clash Meta)内核。Clash Verge Rev 默认就是 mihomo 内核。
第一步:开启外部控制器
- 打开 Clash Verge,进入「设置」→「Clash 设置」→「外部控制」。
- 打开「启用外部控制器」,监听地址填
127.0.0.1:9097。 - 设置一个「API 访问密钥」并记下来,稍后要填到果到雷达里。
- 点「保存」。
第二步:添加果到雷达专用的扩展脚本
- 进入「订阅」页面,在页面底部找到 「全局扩展脚本」(右上角标着
Script)。 - 右键点击它,选择「编辑文件」。
- 把编辑器里原有的内容全部替换成下面的脚本。
- 在
APW_SUBSCRIPTIONS中填写机场订阅地址。每行一个,左边是机场名(只用于给节点加前缀),右边是订阅地址;有几个机场就写几行。订阅地址可以在对应订阅卡片上右键复制,或到机场官网复制。 - 保存。如果「代理」页面没有刷新,在当前使用的订阅卡片上点一下刷新。
// Clash Verge「全局扩展脚本」:节点只供果到雷达的专用端口使用,不影响电脑本身的节点
const APW_PREFIX = "APW·";
const APW_GROUP = "果到雷达";
const APW_SUBSCRIPTIONS = {
机场1: "机场订阅地址",
};
function main(config, profileName) {
const providers = config["proxy-providers"] || {};
const used = [];
for (const [label, url] of Object.entries(APW_SUBSCRIPTIONS)) {
if (!/^https?:\/\//.test(url)) continue;
const key = `apw-${label}`;
providers[key] = {
type: "http",
url,
interval: 86400,
path: `./providers/${key}.yaml`,
override: { "additional-prefix": `${APW_PREFIX}${label}|` },
"health-check": { enable: false },
};
used.push(key);
}
config["proxy-providers"] = providers;
// 原有策略组若自动收录全部节点(include-all / include-all-providers),排除专用节点
const guard = `^${APW_PREFIX}`;
const groups = (config["proxy-groups"] || []).filter((g) => g.name !== APW_GROUP);
for (const group of groups) {
if (group["include-all"] || group["include-all-providers"]) {
const old = group["exclude-filter"];
if (old && old.includes(guard)) continue;
group["exclude-filter"] = old ? `(?:${old})|${guard}` : guard;
}
}
groups.push({ name: APW_GROUP, type: "select", proxies: ["DIRECT"], use: used });
config["proxy-groups"] = groups;
const listeners = (config.listeners || []).filter((l) => l.name !== "apple-store-monitor");
listeners.push({ name: "apple-store-monitor", type: "mixed", port: 7899, listen: "127.0.0.1", proxy: APW_GROUP });
config.listeners = listeners;
return config;
}脚本做了三件事:把订阅节点加上 APW·机场名| 前缀,放进新建的「果到雷达」策略组;让原有策略组排除这些节点,电脑本身的分流保持不变;开一个只转发到「果到雷达」组的本机端口 7899。
不要把这些配置写进「全局扩展覆写配置」(Merge)。新版 Clash Verge 的 Merge 不支持追加策略组,写成
proxy-groups还会替换原有的全部策略组,导致电脑分流异常。订阅地址相当于账号凭证,不要截图、分享或提交到公开仓库。
第三步:确认 Clash 已生效
在 Clash Verge 的「代理」页面检查:
- 出现了名为「果到雷达」的策略组,里面有 DIRECT 和带
APW·前缀的节点。 - 你平时使用的策略组(例如「节点选择」「自动选择」)中没有出现
APW·开头的节点。如果出现了,说明脚本没有生效,或者使用了旧版写法,请重新按第二步操作。
第四步:在果到雷达中填写
-
展开右侧「查询线路」,出口方式选择「Clash 节点轮换」或「指定节点」。
-
按下表填写:
项目 填写 控制接口 第一步的监听地址,例如 127.0.0.1:9097,可直接粘贴,程序会自动补上http://密钥 第一步设置的 API 访问密钥 专用端口 7899(与脚本中的port一致)策略组 果到雷达(与脚本中的APW_GROUP一致)节点关键词 可留空;只想用部分节点时填关键词,用竖线分隔,例如 香港|台湾|日本 -
点「检查线路」。正常情况下会显示内核版本、可用节点数量和「端口 7899 可连接」。这一步只访问本机的 Clash,不会请求 Apple。
-
在「当前节点」(指定节点模式下为「指定节点」)下拉框中查看各节点的延迟,需要时手动选择。
-
点「开始监控」。活动日志每轮结束时会显示「线路:Clash 节点 …」,被拒或切换节点时也会记录。
「查询线路」面板中的「配置教程」按钮包含与本节相同的分步说明,并可一键复制与当前端口、策略组对应的脚本。
- 查询间隔建议保持 30 秒或更长。 间隔越短,每个节点的额度消耗越快,切换越频繁。
- 不想优先使用家庭宽带时,把脚本中的
proxies: ["DIRECT"]改成proxies: []。脚本默认把 DIRECT 排在第一位,平时优先走本机网络,被拦截后再切换到机场节点。 - 优先使用延迟低的地区,例如在「节点关键词」中填
香港|台湾|日本|新加坡。 - 某个机场的节点全部测速超时时,说明该订阅当前不可用,可以从
APW_SUBSCRIPTIONS中删掉。 - 机场的多个节点可能共用同一个出口 IP,也可能与其他用户共用,因此节点数量多不代表不会被拦截。
- 控制接口密钥以明文保存在本机设置文件中。
只要客户端使用 mihomo 内核,并且能满足以下三点,就可以使用:
- 开启外部控制器(
external-controller),并设置密钥(secret)。 - 有一个
select类型的策略组,只供果到雷达使用。 - 有一个
listeners端口,proxy指向这个策略组。
直接编辑 mihomo 配置文件时,可参考:
external-controller: 127.0.0.1:9097
secret: "你的密钥"
proxy-providers:
apw-airport1:
type: http
url: "机场订阅地址"
interval: 86400
path: ./providers/apw-airport1.yaml
override:
additional-prefix: "APW·机场1|"
proxy-groups:
# 保留原有策略组,只在末尾追加这一个;原有使用 include-all 的组需加上 exclude-filter: "^APW·"
- name: 果到雷达
type: select
proxies: [DIRECT]
use: [apw-airport1]
listeners:
- name: apple-store-monitor
type: mixed
port: 7899
listen: 127.0.0.1
proxy: 果到雷达| 检查线路或日志提示 | 原因与处理 |
|---|---|
| 无法连接 Clash 控制接口 | 外部控制器没有开启,或地址、端口与设置不一致。按第一步检查 |
| Clash 控制接口拒绝访问,请检查密钥 | 密钥填错,或 Clash 中修改了密钥 |
| Clash 中没有名为「果到雷达」的策略组 | 扩展脚本没有生效:确认写在「全局扩展脚本」而不是 Merge,已保存,并刷新了订阅 |
| 「果到雷达」的类型不是 select | 策略组类型需要是 select,程序才能切换节点 |
| 端口 7899 无法连接 / 无法连接 Clash 专用端口 | 脚本中的 listeners 没有生效,或端口被占用;确认脚本已保存,必要时换一个端口,并同步修改果到雷达中的「专用端口」 |
| 可用节点为 0,或某个机场没有节点 | 订阅地址填错,或该订阅在国内无法直接下载;到 Clash 的日志中查看订阅加载错误 |
电脑平时用的策略组里出现了 APW· 节点 |
使用了旧版配置或 Merge 写法,请按第二步改用本节的脚本 |
应用启动后会静默检查 GitHub Releases。发现新版本时,界面会显示版本号和「下载并安装」按钮;更新不会在后台自动安装。更新时会显示累计下载量,以及验证、安装阶段;安装完成后需要重启应用,再点击「开始监控」。失败时会显示原因并提供重试或完整安装包入口。签名验证失败会停止安装,不会跳过验证;遇到签名密钥不匹配时请下载完整安装包替换旧版。
macOS 应用包使用完整的 ad-hoc 签名,但没有 Developer ID 证书且尚未公证;Windows 安装包也没有操作系统层面的开发者证书,因此仍可能出现 Gatekeeper 或 SmartScreen 提示。自动更新包另行使用本项目独立的 Tauri 更新密钥签名,用于阻止应用安装被篡改的更新包。
同一种状态使用相同颜色,不同业务状态使用独立配色;深色和浅色主题都保留文字标签,便于直接辨认。
| 状态 | 颜色 | 含义 | 是否到货提醒 |
|---|---|---|---|
| 待查询 | 淡灰、虚线边框 | 尚未完成首次查询 | 否 |
| 有货 | 绿色 | Apple 返回 available,所选门店可取货 |
是,每轮确认有货都会提醒 |
| 无货 | 粉红色 | Apple 返回 unavailable,所选门店当前不可取货 |
否 |
| 不支持取货 | 石板灰 | Apple 返回 ineligible,当前商品或购买组合不适用取货服务,不能据此认定门店库存为零 |
否 |
| 暂未开售 | 蓝色 | NOT_FOR_SALE 且 Apple 文案明确说明尚未发售 |
否 |
| 即将发售 | 紫色 | Apple 返回 COMING_SOON,不代表已经可以下单 |
否 |
| 暂不可购买 | 金黄色 | NOT_FOR_SALE,但没有明确的尚未发售文案 |
否 |
| 未确认结果 | 橙色 | 根据原因显示「暂无取货数据」「未返回型号」「请求被拦截」「请求被限流」「查询失败」等,不能当作无货 | 否 |
取货、购买和配送是独立信息:购买状态 OK 不代表门店有货;配送日期也不是门店可取货日期。SELL_IN_KIT_ONLY_RESTRICTION 是购买限制字段,仅凭它不能判断门店库存或认定全部购买组合都不支持取货,请到官网核对完整配置。
有货以明确的取货结果为准,不会被送货说明覆盖。概览中的「不可取货」合计包括无货、不支持取货及尚不可购买的项目;「未确认」表示本轮没有可信结论。请结合逐项标签和日志查看具体原因。
查询失败和无货是两回事。请求被拦截、超时、限流、响应解析失败,以及 Apple 没有返回对应门店或型号的数据,都不能确认库存。程序会保留具体原因;遇到「暂无取货数据」或「未返回型号」时,请刷新型号目录并核对官网是否仍销售该型号、是否已开放取货。
新包使用独立的应用标识 com.suversal.apple-store-inventory-monitor 和配置目录。
首次启动时会从改名前的 apple-pickup-watcher 目录读取并复制现有设置;旧文件不会
被修改或删除,旧包仍可读取原有设置。迁移后两套配置独立,新版中新增或修改的监控项不会同步回旧包。
| 系统 | 设置文件 |
|---|---|
| macOS | ~/Library/Application Support/apple-store-inventory-monitor/settings.v2.json |
| Windows | %APPDATA%\apple-store-inventory-monitor\settings.v2.json |
| Linux | ~/.config/apple-store-inventory-monitor/settings.v2.json;设置了有效的绝对路径 $XDG_CONFIG_HOME 时,改用该目录下的 apple-store-inventory-monitor/settings.v2.json |
设置文件包含监控目标、查询间隔、提醒选项和查询线路设置。Bark 地址和 Clash 控制接口密钥也会以明文保存在本机,请不要将该文件上传到公开 issue 或提交进 Git 仓库。
点击刷新按钮后从 Apple 官网更新的门店列表和型号目录保存在同一目录下的 catalog-cache/ 中,每个地区一个文件。删除这个目录不会影响监控项,应用会退回内置目录。
项目没有接入分析统计或崩溃上报。正常运行时会访问 Apple 官网;启用 Bark 时会访问用户填写的 Bark 服务;检查更新时会访问本仓库的 GitHub Releases。
先确认打开的是本仓库的 Releases,再展开对应版本的 Assets。只有源码标签或 Actions 构建记录,不代表安装包已经公开;草稿 Release 对普通访问者不可见。请等待正式发布,或按从源码运行自行构建。
541 表示这次请求没有取得可信的库存结果,不代表无货。使用 Clash 节点轮换时,程序会冷却被拒的节点并自动换下一个;所有节点都在冷却时,条目标为「冷却中」,冷却结束后自动探测,探测仍被拒绝则依次延长到 10、20、30 分钟。其他模式下,程序在下一轮按设定间隔重试。
如果连续多轮仍然失败:
- 不要连续快速启停或手动重启;同一 IP 持续请求只会延长封禁。可以调大查询间隔,或改用「Clash 节点轮换」分散到多个出口,配置方法见查询线路与 Clash 配置。
- 确认 Chrome 或 Edge 可以正常打开 Apple 官网。
- 如果多次自动探测仍失败,再对照 Apple 官网或尝试其他网络。
541本身不能证明当前网络被封锁,也不能保证换网络后一定恢复。
先核对门店、容量、颜色和零件号是否完全一致。Apple 的网页可能默认切换到附近门店,也可能显示另一种配置。若应用显示的是「未知」,应先处理日志中的错误,不能把未知当成无货。
库存查询依赖 Apple 商品页完成的浏览器校验。Tauri 自带的 WebView 和普通 HTTP 请求在当前流程下无法稳定取得库存 JSON,因此应用使用独立 Chromium 会话。
这表示果到雷达没有成功建立用于查询库存的临时浏览器会话,不等同于商品无货。请依次检查:
- Windows 是否安装了 Chrome 或 Edge;macOS 是否把 Chrome 或 Edge 放在系统的「应用程序」目录;Linux 是否能从终端运行 Chrome、Edge 或 Chromium。
- Firefox、Safari、Brave、360 浏览器等目前不能替代 Chrome、Edge 或 Chromium。
- 把受支持的浏览器升级到当前版本,手动打开一次并确认可以访问 Apple 官网。
- 完全退出果到雷达后重新打开。如果仍然立即失败,再检查安全软件是否阻止了浏览器的无界面进程。
提示音请检查应用内开关、系统音量和音频输出设备。Bark 请先确认 Bark 自己的测试 URL 能让手机收到通知,再检查果到雷达中填写的地址是否只包含服务器和设备 Key、iPhone 是否允许 Bark 通知,以及专注模式是否隐藏了普通通知。最后查看活动日志中的 Bark 失败原因。两条提醒渠道独立,提醒失败不会改变库存判断。
这是预期行为。关闭窗口会收进系统托盘,监控继续运行。需要彻底退出时,在托盘菜单中选择「退出」。
只锁屏通常不会停止应用,但电脑进入睡眠、关机或应用被彻底退出后不会继续查询。长时间监控时,请接通电源并按自己的需要调整系统睡眠设置。
下面只比较本项目与直接上游 ENCHIGO/apple-pickup-watcher v0.3.2 的差异。Rust、Tauri、三态库存、四个产品品类、系统托盘和应用内更新等能力已经由上游完成,不算作本项目新增。
| 项目 | 直接上游 v0.3.2 | 果到雷达 v1.0.19 |
|---|---|---|
| Apple 查询会话 | 普通 HTTP 客户端先访问商品页获取 Cookie,再查询库存 | 启动应用专属的持久 Chromium 会话,在 Apple 页面环境中完成校验和库存请求;同轮对被拦截地区停止重复请求,下轮按用户设置的间隔重试 |
| 批量添加监控 | 每次选择一家门店和一个型号 | 门店、型号都可以多选,一次生成全部组合;重复组合会自动跳过 |
| 持续有货提醒 | 只在状态从非有货变成有货时提醒一次 | 每轮确认有货都会重新执行提醒,适合库存短暂出现、第一次错过提醒等情况 |
| 运行过程反馈 | 主要记录状态变化,长时间无变化时不容易判断是否仍在查询 | 每轮显示覆盖的门店和监控项、逐项结果、耗时与预计等待时间;日志最多保留 300 行 |
| 操作反馈 | 有货时会执行提醒并尝试打开购物袋,但界面不显示具体执行结果 | 可选择打开购物袋或商品详情,记录已执行的提醒动作,并显示提示音、Bark 或页面打开失败的错误;实际送达情况仍需在设备上确认 |
这些调整用于改善库存查询、批量添加和长时间监控时的反馈。逐项修改记录见 NOTICE。
Apple 当前商品页会先完成浏览器环境校验,再请求库存接口。普通 HTTP 客户端即使带上常见请求头和购物袋 Cookie,也可能收到 HTTP 541。
果到雷达会在后台启动一个独立的 Chromium 会话(Chrome、Edge,或 Linux 上的 Chromium):
- 使用果到雷达自己的持久浏览器资料目录,不复用个人浏览器资料。 浏览器以无头模式运行,不显示窗口或 Dock 图标;UA、Client Hints、屏幕尺寸和语言按本机真实浏览器版本修正,去掉无头模式的标记。
- 打开当前地区的 Apple 正式购买页,等待页面校验完成。
- 在同一页面和同一会话中请求库存。
- 同一地区、相同型号组合的附近门店优先复用一个响应;数据不完整时才针对目标门店补查。
- 所有真实库存请求至少间隔 2 秒,避免并发形成瞬时突发。
- 如果会话被
403、541或429拒绝:Clash 节点轮换模式下冷却该节点并换下一个继续查询;其他模式下当轮同地区不再重复请求,下一轮复用同一会话,按用户设置的间隔重试。
应用专属资料不会读取用户日常使用的 Chrome/Edge 登录状态、Cookie 或浏览记录。应用正常退出时会停止专属进程,并保留它自己的会话资料;若上次异常退出,下次启动只会回收绑定到该专属目录的遗留 Chromium,不会终止普通浏览器。
- Rust 1.90 或更高版本
- Node.js 22.12+ 的 LTS 版本;Vite 7 也支持 Node.js 20.19+(20.x),不支持 22.0~22.11
- pnpm 9 或更高版本
- 对应平台的 Tauri 2 系统依赖
- Chrome、Edge 或 Linux 上的 Chromium,用于真实库存查询
macOS 需要 Xcode Command Line Tools:
xcode-select --installWindows 需要 Microsoft C++ Build Tools,并在安装器里选择「使用 C++ 的桌面开发」。还需要 WebView2 Runtime,Windows 11 通常已经自带。
Debian/Ubuntu 构建依赖:
sudo apt update
sudo apt install -y \
libwebkit2gtk-4.1-dev libgtk-3-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev \
libasound2-dev patchelf xdg-utils其他 Linux 发行版的包名不同,请对照 Tauri 2 前置依赖文档。
macOS / Linux:
git clone https://github.com/suversal/apple-store-inventory-monitor.git
cd apple-store-inventory-monitor
pnpm install
source "$HOME/.cargo/env"
pnpm tauri devWindows PowerShell(安装 Rust 后请重新打开终端):
git clone https://github.com/suversal/apple-store-inventory-monitor.git
cd apple-store-inventory-monitor
pnpm install
cargo --version
pnpm tauri dev只启动前端页面可以运行 pnpm dev,但浏览器页面无法调用 Tauri 命令,不能据此验证真实监控功能。
确认当前终端能运行 cargo --version 后,在仓库根目录执行。以下命令适用于 macOS、Linux 和 Windows PowerShell:
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace
pnpm build
pnpm test
离线测试不会请求 Apple。真实接口回归测试需要本机安装支持的 Chromium 浏览器,并会访问 Apple 官网:
cargo test -p apple-store-inventory-monitor "chromium_fetcher::tests::真实chromium会话连续检查四家门店两轮" -- --ignored --nocapture
这条测试会复用同一浏览器会话,连续检查上海四家门店两轮。它用于验证页面校验、会话复用、请求节流、响应解析,以及第一家门店有货后仍继续查询其他门店。
先运行 cargo --version,确认终端能找到 Rust。macOS / Linux 若找不到 Cargo,可先载入环境:
source "$HOME/.cargo/env"
pnpm tauri dev如果 ~/.cargo/bin/cargo 不存在,需要先安装 Rust。Windows 请安装 Rust 后重新打开 PowerShell,确认 %USERPROFILE%\.cargo\bin 已加入 PATH。
如果 Cargo 可以正常运行,应继续查看完整错误中的 manifest、依赖解析或工具链提示;failed to run cargo metadata 不一定是未安装 Rust。
Cargo 的 target 目录可能保留了旧项目的绝对路径。典型报错是当前正在构建 apple-store-inventory-monitor,却去另一个旧目录读取 Tauri 的 permissions 文件。
在仓库根目录执行:
cargo clean
pnpm tauri dev执行前先检查 CARGO_TARGET_DIR 和 .cargo/config.toml:cargo clean 会清理实际目标目录中的编译产物;若多个项目共用该目录,也会清掉它们的缓存。它不会删除源码或用户设置。
本地构建但不生成发布签名:
pnpm tauri build --no-sign产物位于 target/release/bundle/。自动更新包需要仓库维护者配置 TAURI_SIGNING_PRIVATE_KEY;私钥设置了密码时还要配置 TAURI_SIGNING_PRIVATE_KEY_PASSWORD。没有私钥时不能生成可被现有客户端验证的更新签名。
正式版本由 Release 工作流 构建,标签使用 v1.0.19 这样的格式。发版前应确认 package.json、工作区 Cargo.toml、src-tauri/tauri.conf.json 与标签的版本一致。macOS 专用配置在 src-tauri/tauri.macos.conf.json 中启用 ad-hoc 签名;发布流水线会同时验证自动更新归档和 DMG 内的应用签名。
推送 v* 标签后,GitHub Actions 会生成 macOS、Windows 和 Linux 安装包,并先创建草稿 Release;确认四个平台全部成功后再公开发布,避免用户下载到缺少部分平台或 latest.json 尚未完整生成的版本。手动运行 workflow_dispatch 只生成 Actions 构建产物,不会创建公开 Release。
crates/apw-core/src/
apple.rs HTTP 错误分类与库存响应解析
apple_catalog.rs 从 Apple 购买页解析型号目录
catalog.rs 在线目录、本地缓存与内嵌快照
config.rs 设置保存、迁移与损坏保护
model.rs 地区、商品、门店和三态库存模型
notify.rs Bark 与提示音
watcher.rs 监控调度、分组查询、事件与退避
src-tauri/
src/chromium_fetcher.rs 无头 Chromium 会话、查询线路与真实库存请求
src/clash.rs Clash / mihomo 控制接口:读取节点、测速、切换节点
src/route_pool.rs 出口线路池:按节点和站点记录冷却并选择节点
src/lib.rs Tauri 命令、托盘、更新和通知装配
src/
App.tsx 主界面
components/ 界面组件(NetworkSettings.tsx 为查询线路与 Clash 配置教程)
lib/store.ts 前端状态与事件日志
lib/types.ts Rust/TypeScript 边界类型
lib/monitorLog.ts 业务状态、配色语义与逐轮日志
lib/productOrder.ts 新款优先排序
lib/updateStatus.ts 更新进度与失败原因
库存是否可取货只由 Rust 核心判断。前端负责展示状态,不会根据日志文本或空响应自行推断「无货」。
2026-09-10 使用本次完整源码,通过同一个临时 Chromium 会话查询 iPhone 17 256GB 白色(MG6X4CH/A),对上海以下四家门店连续查询两轮:
- R390 香港广场
- R401 上海环贸 iapm
- R581 五角场
- R683 环球港
8 次查询均返回明确库存状态;官网目录刷新同时识别出 6 个 iPhone 机型页、取得 73 个 SKU。首次新建会话曾被 Apple 风控拦截,间隔后重建会话的复测通过,说明仍需保留失败提示与重试。真实库存随时变化,这项验证只代表当次结果,不保证持续可用或这些门店当前仍有货。
本仓库直接基于 ENCHIGO/apple-pickup-watcher
v0.3.2 继续开发,并保留了对应 Git 历史。主要后续改动包括多门店与多型号组合监控、逐项轮次日志、重复提醒、临时 Chromium 查询会话、独立应用标识,以及「果到雷达」这一对外名称。
ENCHIGO/apple-pickup-watcher 是 hteen/apple-store-helper
的 GPL-3.0 重写版本。因此,本项目既保留直接上游 ENCHIGO 的贡献记录,也继续遵守最初项目的 GPL-3.0 派生要求。版权、承继资源和逐项修改说明见 NOTICE。
本项目按 GNU General Public License v3.0 or later 发布。分发修改版本时,需要继续遵守 GPL-3.0 的源码和许可要求。
请在本仓库的 Issues 提交问题,并尽量附上:
- 操作系统与芯片架构,例如 macOS 26 / Apple M4;
- 应用版本;
- 地区、门店和商品品类;
- 活动日志中的完整错误文字;
- 问题能否稳定复现。
提交前请删掉 Bark 地址、设备 Key、个人路径及其他隐私信息。库存随时会变化,单独一张「有货」或「无货」截图通常不足以定位问题。


