翻转宝可梦卡牌很简单。但问题是:Mercari、eBay 和 Vinted 上的交易可能几分钟内就被抢走,或者根本很难找到,而没有人能全天候盯着三个市场检查每一条列表。
所以,我让 Claude Code 帮我建了一个监控器。两天后,这就是在我办公室的 Mac mini 上 24/7 运行的东西:
工具。
每隔 5 分钟,它会扫描 Mercari、eBay 和 Vinted 上的新列表。每张新列表的照片都会通过 PokeGrade API 识别出具体卡片,并拉取其实时市场价值——包括原始卡和评级卡的市场价格。PokeGrade API 是我们网站背后的技术支撑,我们为开发者提供免费访问权限。 PokeGrade.ai/developers
如果一张评级卡的价格低于市场价 25% 或更多,Mercari 上的列表会自动点赞,其他平台上的则会推送通知到我的手机。两种策略并行运行:低价的评级卡,以及更奇特的一种——价格低于同款未评级卡售价的评级卡(拆壳套利;虽然罕见,但确实存在)。

终端。
一个实时仪表盘——深色交易台风格、滚动信息条、状态指示灯——显示每次评估、计入费用后的潜在利润统计、我正在监控的产品的已售价格图表(每 60 秒从 eBay 已售商品中采样一次),以及一个账本:粘贴来自五个市场的任意列表 URL,一个抓取器就会记录买入或卖出,并追踪我的累计盈亏。理论上,我可以将脚本连接到我的账户,让它每小时抓取一次;只是还没这么做。日元和欧元会自动换算。一个按钮就能将精准抓取到的发现直接移入账本。手机上也能操作。
没人告诉你的部分。 功能只花了一个下午。剩下的一天半是在与现实的肉搏战中度过的:市场平台的机器人检测会拒绝自动化浏览器,页面会根据你是否登录显示不同的代码,日本卡片隐藏在英文标题后面,macOS 会静默地杀死放在错误文件夹里的后台任务。每一项都需要花数小时诊断,然后一行代码修复。
这就是为什么我分享的是提示词而不是代码。提示词包含了所有内容——每个经过验证的选择器、每个陷阱、每个防护措施——这样你在构建时就能跳过这场肉搏战。
确保安全的规则。 它从不购买任何东西。它从不发送报价。极其"划算"的交易(5 倍以上比率)会被标记为可疑,而不是被庆祝,因为它们几乎总是可疑的列表,或者 AI 匹配错了卡片。每笔交易在资金流动之前都需要人工查看。请以同样的方式构建——自动化负责发现,你来做决定。
成本: 用于卡片识别的 PokeGrade API(免费套餐:每月 100 次评估可试用;付费套餐适用于大规模扫描)、免费的 eBay 开发者账户,以及一台保持开机的电脑。仅此而已。
提示词。
将以下内容全部复制到 Claude Code 中,填写三个占位符,然后分阶段构建(每个阶段都有独立用途)。
我想要一个个人卡片翻转工具包,放在我的电脑上,构建为一组由 launchd 管理的后台服务(或 Windows 等效服务),外加一个本地网页仪表盘。技术栈:Node.js + Playwright,无框架,无数据库——所有数据都放在一个项目文件夹中的 CSV/JSON 文件里。所有功能必须在重启后依然存活。我将分 5 个阶段向你发送指令。每个阶段完成后,请告知我你已准备好进入下一阶段。一些 API 密钥和第一阶段是首要的。
我的输入(请填写):
PokeGrade API 密钥:PGAI_KEY_HERE(来自
pokegrade.ai/developers — /value 端点从一张照片识别卡片,并返回原始卡 + 评级卡的市场价格;文档在
pokegrade.ai/developers/docs )
eBay 生产密钥集:EBAY_CLIENT_ID / EBAY_CLIENT_SECRET(免费在
developer.ebay.com 获取;申请账户删除豁免以激活)
我的交易阈值:当市场价值至少是标价的 1.25 倍时点赞/提醒;报价工作列表区间为 1.15-1.25 倍(在接受 80% 的报价并扣除约 12% 的销售费用后,净利率约为 26%)
第一阶段——Mercari 狙击手(自动点赞)
一个服务,大约每 10 分钟扫描一次 Mercari 搜索,通过 PokeGrade /value 对新列表的第一张照片进行定价,并对达到交易阈值的列表点赞。从配置数组中获取两种策略,一个浏览器进程:
原始拆壳:搜索"pokemon psa 8",比较 RAW(未评级)价值——找出值得拆壳的评级卡(原始卡价值 > 评级卡价格;罕见但真实存在)。 评级低价:搜索 psa 8/9/10,比较评级卡自身等级的市场价格。
**关键实现事实(均已验证,可为你节省数小时): **
Mercari 的机器人检测(PerimeterX)会硬性拒绝 Playwright 捆绑的 Chromium——按住验证挑战会无限循环。启动真实的已安装 Chrome:channel:'chrome',有头模式,持久化配置文件目录,--disable-blink-features=AutomationControlled,ignoreDefaultArgs:['--enable-automation']。永远不要自动化登录:检测未登录状态(访问 /mypage/ 会在约 15 秒后客户端重定向到 /login/?login_callback=... — 轮询 URL,而不是 DOM),并等待最多 30 分钟让人工登录一次;会话会持久保存在配置文件中。
登录与未登录页面使用不同的测试 ID。登录后的搜索:磁贴 a[data-testid="ProductThumbWrapper"],价格 ProductThumbItemPrice(未登录:ItemPrice — 两者都接受),磁贴点赞按钮 ItemLike(在磁贴锚点内部——从搜索页面点赞,无需打开列表),商品页面点赞按钮 LikeComp。ProductThumbItemDiscountedPrice 是划掉的原始价格——永远不要使用它;打折磁贴将两个价格连接在一个文本节点中("$99.75$105"),所以只解析第一个货币标记。
第一张列表照片无需访问页面:
https://u-mercari-images.mercdn.net/photos/ITEMID_1.jpg (直接 fetch)。
"新" = 未在状态文件中评估过的商品 ID,按最新优先排序,跳过已售出的磁贴。每次 PokeGrade 调用 = 1 个积分——为每个商品 ID 永久缓存结果,并在策略之间共享缓存。将已点赞的 ID 与已看到的 ID 分开跟踪(在评级和点赞之间发生崩溃绝不能导致双击,这会取消点赞)。临时性故障(API 5xx,缺少价格)保持未看到状态,并在下一个周期重试。
launchd 陷阱:Agent 无法读取 ~/Desktop(TCC)——任务会静默退出,错误代码 78。将项目放在主文件夹中,而不是桌面。使用 RunAtLoad + KeepAlive;在 plist 中使用绝对路径的 node 路径。
**第二阶段——eBay + Vinted 信息流(仅通知) **
相同的策略/阈值,但两者都没有收藏夹列表 API,因此交易会触发 macOS 通知(osascript display notification)+ CSV 行,而不是点赞/收藏。
eBay:使用官方 Browse API(客户端凭证 OAuth,item_summary/search,sort=newlyListed,filter buyingOptions FIXED_PRICE + itemLocationCountry US — 注意 priceCurrency 仅在同时有价格范围时有效)。将图片 URL 中的 s-l225 升级到 s-l1600 以便 OCR。每天约 5,000 次 API 调用,每 10 分钟 3 次搜索是可以的;PokeGrade 的消耗才是真正的预算(在 eBay 规模下,每天约 5,000 积分——限制每次搜索的评估数量,例如 15 个)。
Vinted:抓取目录(无 API,但也没有机器人检测墙)。磁贴:a[data-testid="product-item-id-ID--overlay-link"],其 title 属性包含"名称,品牌:X,成色:Y,
$price ";图片在 [data-testid="...--image"] img 处(将 URL 中的 /f###/ 段提升到 /f800/)。Vinted 页面大约有 1/3 的加载会导致无头 Chromium 崩溃,并且可能不抛出错误就挂起——每次抓取都用一个 90 秒的 watchdog Promise.race 包裹,并在失败时重新启动浏览器。每周期记录一条心跳线,这样静默的日志意味着"卡住了",而不是"安静"。
质量防护(全部来自真实误报的经验教训):
积分前:跳过标题中包含 lot/bundle 或提及 japanese/chinese/korean/german/french 等语言的条目。
识别后:如果 PokeGrade 识别出的卡片集是外国市场(JP/CS/CN/KR 标记)则拒绝——卖家会在标题中隐藏语言。
Celebrations 陷阱:PokeGrade 可能将 Celebrations 系列的"Classic Collection"再版误识别为老版原版(一张 30 美元的再版卡被匹配到 30,000 美元的市场价)。如果标题包含 celebrations/classic collection,但识别出的卡片集不是,则丢弃该市场价格。相同的再版风险:Base Set 2,XY Evolutions。
任何比率达到 5 倍或以上的条目都被标记为"可疑——需要审核",并从主要收益中排除(极高比率几乎总是市场价格匹配错误,而不是中大奖)。
第三阶段——仪表盘(本地主机网页应用)
一个无依赖的 Node HTTP 服务器(绑定 0.0.0.0,以便局域网内的手机可以访问),提供一个 HTML 文件,该文件每 30 秒轮询一次 /data 端点。深色优先的"交易终端"风格:等宽数字、每个服务的状态指示灯(日志文件 mtime = 健康度)、滚动信息条显示最近评估、计数动画。三个标签页:
1. 狙击手——统计区(扣除费用后的潜在利润,排除可疑项)、交易、报价、需要审核、已评估)、每小时扫描活动图表、累计收益图表、结果分布、策略记分板,以及一个可排序的发现表格,包含列表缩略图、星标/收藏开关(可筛选),和一个"已购买"按钮,可将发现直接复制到账本中。
2. 市场观察——已售价格追踪器(第四阶段)。
3. 账本——第五阶段。
通过一个同源 /thumb 代理服务器(白名单市场 CDN)提供外部图片——跨域/热链接图片在某些客户端会被阻止。可疑发现:警告徽章 + 从总计中排除。
第四阶段——已售价格市场追踪器
eBay 的已售数据不在公共 API 中。使用有头 Chromium(channel:'chromium')、浏览器 UA 伪造以及先访问首页预热(直接深链接会被机器人检测拦截)来抓取已售搜索(LH_Sold=1, LH_Complete=1, sort newest)。卡片:[data-listingid] 元素;真正的已售商品有"SOLD 日期"行(赞助广告没有)。每分钟,对每个配置的查询:取最近 10 个已售价格,将平均值/中位数/最小值/最大值追加到 CSV 文件中。仪表盘图表显示每个追踪器的平均线 + 最小-最大区间,带有 +/- 时间窗口缩放按钮。一个一次性回填脚本会遍历最多 10 个结果页面,按打印的已售日期分组,以重建大约一周的每日历史数据(幂等)。在连续 3 次提取为空后,暂停 10 分钟。
第五阶段——账本(买入/卖出盈亏)
账本标签页,包含一个买入输入框和一个卖出输入框:粘贴来自
japan.us.mercari.com (跨境店面),
ebay.com (包括
ebay.io 应用分享短链接),或
vinted.com 的任意列表 URL。一个确定性的获取脚本(无 AI)提取标题/价格/货币/图片:
主要方式:
schema.org Product JSON-LD(在 jp.mercari、ebay、vinted 上精确可用)。
japan.us .mercari 没有 JSON-LD——价格在 [data-testid="main-price"] 中(符号和数字在不同行),已经是美元。
ebay.io 短链接只能在真实浏览器中解析,并且通常落在一个错误外壳页面上——改为从解析后的 URL 中获取商品 ID,并调用 Browse API 的 get_item_by_legacy_id。
拒绝机器人验证页面("Just a moment...","Error Page")作为错误——永远不要将它们存储为条目。
通过
frankfurter.app (ECB,免费,缓存 12 小时)转换非美元货币。将条目存储在 ledger.json 中;累计总额 = 卖出减去买入,再加上一个扣除 12% 费用后的数字;行显示缩略图、市场标签、本地货币 + 美元价格,以及一个确认保护的删除按钮。记录的价格 = 列表价格(忽略报价)——这是一个有意的简化。
每个阶段的验收检查
运行一个真实周期并向我展示日志;在连接循环之前,验证一个真实列表的端到端流程通过 PokeGrade;任何 UI 更改后,在浅色和深色模式下截图仪表盘;永远不要在我的账本中留下测试条目,或在我的账户上留下测试点赞。
在运行之前给你一些善意提醒:抓取器在市场平台的服务条款中处于灰色地带——请保持温和的频率,并预计偶尔会遇到验证码。AI 卡片识别错误率足够高,以至于自动购买无异于烧钱。而且,你实际面临的费用可能与我的 12% 不同——请重新调整阈值。
如果你构建了一个,让我看看它找到了什么。





