Pyronewbic/casecomp
GitHub: Pyronewbic/casecomp
宝可梦卡牌多市场聚合搜索与 AI 预评级平台,整合四大电商平台实现一站式价格对比、品相分析和投资组合管理。
Stars: 2 | Forks: 0
#
Casecomp
[](CHANGELOG.md)
[](https://github.com/Pyronewbic/casecomp/actions/workflows/ci.yml)
[](https://github.com/Pyronewbic/casecomp/actions/workflows/deploy.yml)
[](LICENSE)
[](https://api.casecomp.xyz/docs)
[](https://slsa.dev)
[](https://www.sigstore.dev/)
**[casecomp.xyz](https://casecomp.xyz)** | **[API 文档](https://api.casecomp.xyz/docs)** | **[管理端](https://api.casecomp.xyz/admin)** | **[更新日志](CHANGELOG.md)**
一次查询即可搜索四个市场的所有 Pokemon 卡牌。获取实时价格、AI 品相评估和 PSA 评级信号,无需分别手动查看 eBay、magi.camp、Yahoo Auctions 和 SNKRDUNK。

### 功能特性
- **多来源搜索** - 一次查询即可搜索 eBay、magi.camp、Yahoo Auctions JP、SNKRDUNK
- **跨来源套利** - 对比各来源最低价,突出显示价差
- **品相检测** - 自动检测各来源的卡牌品相 (EN: NM/LP/MP, JP: 状态A/美品)
- **AI 预评级** - 8 项子指标的正反面分析,支持卡牌检测、倾斜校正、等级分布及可分享报告
- **评级历史** - 追踪您已评级的卡牌,查看结果,并以社交卡牌形式分享
- **价格历史** - 随时间推移的已售可比追踪,附带折线图和统计数据
- **PSA 评级信号** - 人口数据、难度、宝石 10% 比例、建议提交等级
- **评级卡对比** - 跨来源比较 PSA 10 / BGS 9.5 / TAG 10 价格
- **投资组合** - 追踪卡牌、ROI、价值变化及评级机会
- **管理端** - 在 `/admin` 进行 API 密钥管理、统计 KPI 及错误日志查看
- **系列浏览器** - 浏览 238 个系列及其标志,支持稀有度过滤和收藏追踪(已有/缺失)
- **REST API** - 带速率限制、单密钥缓存的身份验证端点,提供 OpenAPI 规范
- **Claude Code 技能** - `/casecomp` 实现纯英文卡牌搜索
- **Chrome 扩展** - Pokemon Center、Walmart、Costco、Target 抢购的自动排队加入
## 快速开始
```
yarn install
yarn playwright-install
cp .env.example .env # add keys (see Environment below)
yarn api # API on localhost:3000
```
## 脚本命令
| 命令 | 说明 |
|---------|------|
| `yarn api` | 在 :3000 端口启动 API |
| `yarn start` | CLI 搜索 (`node index.js`) |
| `yarn test` | 完整测试套件:语法、单元测试、密钥、API |
| `yarn test:unit` | 仅单元测试(无需服务器) |
| `yarn test:api` | 针对 localhost 的 API 测试 |
| `yarn test:live` | 针对 api.casecomp.xyz 的 API 测试 |
| `yarn deploy` | 构建 + 部署到 Cloud Run |
| `yarn scan` | 事件与发布扫描器 |
## 系统架构
请参阅 [docs/internals.md](docs/internals.md) 以了解项目布局、缓存、安全流水线、多区域部署和 AI 评级流水线。
## 前端
[casecomp.xyz](https://casecomp.xyz) — 搜索、系列浏览器、投资组合、AI 评级。使用 TanStack Start 构建,部署在 Cloud Run + Cloudflare 上。
无需登录即可体验三张示例卡牌 (`?demo=true`):
- Pikachu ex SAR PSA 10 (多来源评级卡:eBay + magi + Yahoo)
- Mega Greninja ex SAR (SNKRDUNK + AI 评级)
- Umbreon ex SAR 217/187 (eBay + magi + Yahoo + AI 评级)
## REST API
除健康检查和示例数据外,所有端点都需要 `CC_LIVE_` API 密钥。
```
# Auth: header 或 query param
-H "Authorization: Bearer CC_LIVE_xxxxx"
# 或
?key=CC_LIVE_xxxxx
```
完整参考文档:[api.casecomp.xyz/docs](https://api.casecomp.xyz/docs)
```
# ── Public (无 key) ──────────────────────────────────────────
curl "https://api.casecomp.xyz/api/sets" # browse 238 sets
curl "https://api.casecomp.xyz/api/sets/sv06" # cards in a set
curl "https://api.casecomp.xyz/api/autocomplete?q=umbreon" # card search (29K cards)
curl "https://api.casecomp.xyz/api/health" # service status
# ── Sample data (无 key, ?demo=true) ─────────────────────────
curl "https://api.casecomp.xyz/api/search?q=Umbreon+ex+SAR+217/187&demo=true"
curl "https://api.casecomp.xyz/api/card/view/sv8a/217-187?demo=true"
curl "https://api.casecomp.xyz/api/arbitrage?q=Pikachu+ex+SAR+234/193+PSA+10&demo=true"
curl "https://api.casecomp.xyz/api/price-history?q=Umbreon+ex+SAR+217/187&days=90&demo=true"
curl "https://api.casecomp.xyz/api/portfolio?demo=true"
curl "https://api.casecomp.xyz/api/portfolio/set/sv8a?demo=true"
# ── Authenticated (CC_LIVE_ key) ─────────────────────────────
curl -H "Authorization: Bearer $CASECOMP_KEY" \
"https://api.casecomp.xyz/api/search?q=Pikachu+ex+SAR&source=magi&format=slab&slab_provider=PSA&slab_grade=10"
curl -H "Authorization: Bearer $CASECOMP_KEY" \
"https://api.casecomp.xyz/v1/drops"
curl -X POST -H "Authorization: Bearer $CASECOMP_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"you@email.com","query":"Umbreon ex SAR 217/187","type":"arbitrage","spreadThreshold":10}' \
"https://api.casecomp.xyz/api/alerts"
```
### 速率限制
| 端点 | 限制 |
|----------|-------|
| 已认证(`CC_LIVE_` 密钥) | 60 请求/分钟 |
| 示例数据 (`?demo=true`) | 360 请求/分钟 |
| 健康检查、文档、静态资源 | 无限制 |
### 公开端点(无需密钥)
`GET /api/health` | `GET /api/demo` | `GET /api/sitemap` | `GET /api/autocomplete` | `GET /api/sets` | `GET /api/sets/:setCode` | `GET /docs` | `GET /docs/spec.json` | `?demo=true`(示例数据)适用于 search/sold/arbitrage/price-history
## 安全性
- **容器签名** - 通过 GitHub OIDC 进行 Sigstore cosign 无密钥签名,并记录到 Rekor 透明度日志
- **摘要部署** - 使用不可变的镜像 SHA,而非可变的 `:latest` 标签
- **SBOM** - 每次部署生成 Syft SPDX JSON,并作为构建产物上传
- **漏洞扫描** - Grype 扫描 SBOM 查找 CVE,并将 SARIF 上传至 GitHub Security 选项卡
- **SAST** - 在每个 PR 及每周计划中执行 CodeQL 静态分析
- **Binary Authorization** - 两个 Cloud Run 服务均启用 GCP 策略(审计模式)
- **可复现构建** - 使用 Kaniko `--reproducible` 标志,固定版本
- **多区域** - Cloud Run 部署于 asia-south1 + us-central1,全局负载均衡自动根据地理位置路由至最近节点
- **自定义基础镜像** - Wolfi + apko Node 24 镜像,手动重建,设计上零 CVE
- **供应链** - SLSA 来源证明、Dependabot、lockfile-lint、Socket.dev、pre-commit 密钥拦截
## Claude Code 技能
**`/casecomp`** - 使用纯英文搜索卡牌。Claude 解析意图并使用正确的标志运行 CLI。
```
/casecomp Umbreon ex 217/187 PSA 10 japanese
/casecomp compare Pikachu VMAX alt art and Espeon VMAX alt art
/casecomp should I grade Mega Greninja ex SAR?
/casecomp Charizard ex on magi, condition A, 10 results
```
## CLI
```
node index.js "Charizard ex" # raw eBay search
node index.js --format slab --slab-provider PSA "Pikachu VMAX" # PSA 10 slabs
node index.js --source magi --lang jp "Umbreon ex 217/187" # magi.camp JP
node index.js --grade "Mega Greninja ex SAR" # AI pre-grading
node index.js --grade-decision "Umbreon ex 217/187" # PSA break-even table
```
### 标志
| 标志 | 示例 | 说明 |
|------|---------|------|
| `--format` | `slab` / `raw` | 评级卡或原卡(默认:`raw`) |
| `--slab-provider` | `PSA`, `BGS`, `CGC`, `TAG` | 评级公司 |
| `--slab-grade` | `10`, `9.5` | 评级数字 |
| `--lang` | `eng`, `jp`, `eng,jp` | 卡牌语言过滤 |
| `--source` | `magi`, `yahoo`, `snkrdunk` | 商品来源 |
| `--countries` | `US,IN` | 收货国家 |
| `--results` | `10` | 在售商品数量 |
| `--sold` | `10` | 已售商品数量 |
| `--grade` | | AI 预评级 |
| `--grade-decision` | | PSA 盈亏平衡表 |
| `--condition` | `A`, `nm`, `lp`, `mp` | 品相过滤 (SNKRDUNK A/B/C/D, eBay NM/LP, magi 状态A/美品) |
| `--refresh` | | 清除缓存 |
| `--parallel` | | 并发卡牌搜索 |
## 环境变量
```
EBAY_CLIENT_ID= # required - developer.ebay.com
EBAY_CLIENT_SECRET= # required
ANTHROPIC_API_KEY= # AI grading + magi translation
PSA_AUTH_TOKEN= # PSA pop reports
CASECOMP_API_KEY= # API auth (CC_LIVE_ prefix)
CASECOMP_SANDBOX_KEY= # public sandbox key (CC_LIVE_SANDBOX_ prefix, 5/min)
```
在生产环境中,密钥存储在 GCP Secret Manager 中,由 Cloud Run 引用。
## 缓存
所有缓存均使用 Firestore(在 Cloud Run 实例间共享,跨部署保留)。所有者密钥采用 stale-while-revalidate 策略;第三方密钥采用独立的单密钥缓存。
| 集合 | TTL | 内容 |
|-----------|-----|---------|
| `cache-grades` | 30 天 | 基于图像哈希的 AI 评级结果 |
| `cache-psa-pop` | 24 小时 | PSA 人口数据 |
| `cache-psa-spec` | 永久 | PSA 规范 ID 查询 |
| `cache-translations` | 永久 | 英文到日文的卡牌名称翻译 |
| `cache-ebay-active` | 6 小时 | eBay 在售商品结果 |
| `cache-ebay-sold` | 24 小时 | eBay 已售商品结果 |
| `price-history` | 永久 | 随时间变化的已售商品价格 |
| `api-keys` | 永久 | 开发者 API 密钥(已哈希) |
| `error-logs` | 永久 | 包含请求 ID 的 API 错误 |
## 基础设施
GCP(由 Terraform 管理):Cloud Run `casecomp-api`(API)+ `casecomp-site`(带有 Cloud CDN 的前端 SSR)、Firestore、HTTPS 负载均衡、Secret Manager、Cloud Monitoring、Cloud Scheduler。Cloudflare 为 `casecomp.xyz` 处理 SSL + 边缘缓存(约 85ms TTFB)。GCP 为 `api.casecomp.xyz` 管理 SSL。同一负载均衡 IP 根据主机进行路由。Cloud Scheduler 每 6 小时运行一次 `track-prices` 和 `check-alerts`。详见 `terraform/`。
## Chrome 扩展
Pokemon Center、Walmart、Costco、Target 抢购自动排队加入。Discord、X、Reddit 的新闻监控。
在 `chrome://extensions` 中以解压方式加载 `extension/` 目录。
## 测试
三层架构共 329 个测试。CI 必需检查项:unit + codeql。冒烟测试为非阻塞项。
| 套件 | 数量 | 命令 | 覆盖范围 |
|-------|------:|---------|--------|
| **Unit** | 151 | `yarn test:unit` | 过滤器、评级、查询构建器、卡牌身份识别、品相检测、图像预处理、电子邮件警报、投资组合 ROI、CSV 导出、自动补全、JWT 认证、价格趋势 |
| **API** | 104 | `yarn test:api` | 搜索、已售商品、PSA、评级、认证、管理密钥、套利、价格历史、警报、分享页面、投资组合 CRUD、卡牌查看、upload-url、分析、收藏追踪 |
| **Smoke** | 74 | `yarn test:smoke` | API 根页面、详情面板、选项卡、PSA 统计数据、套利、移动端视口、投资组合、自动补全、搜索过滤器 |
## 参与贡献
欢迎贡献。Fork 本仓库,创建一个分支,并向 `dev` 分支发起 Pull Request。提交前请运行 `yarn test` - 必须通过所有测试。
如需提交 Bug 报告或功能请求,请开启一个 [issue](https://github.com/Pyronewbic/casecomp/issues)。
## 使用条款
仅供个人非商业用途。不得用于倒卖、抢购团伙或批量采购。完整条款见 [LICENSE](LICENSE)。
## 免责声明
AI 评级是基于照片的估算,并非官方的 PSA/CGC 评级。仅作为筛查参考。
标签:AI评级, eBay, MITM代理, PSA评级, PTCG, Sigstore, SLSA 3, 二手交易, 价格追踪, 卡牌投资, 卡牌评级, 图像识别, 多源比价, 套利, 宝可梦, 宝可梦卡牌, 特征检测, 网络测绘, 自定义脚本, 资产组合管理, 集换式卡牌