Pyronewbic/casecomp

GitHub: Pyronewbic/casecomp

宝可梦卡牌多市场聚合搜索与 AI 预评级平台,整合四大电商平台实现一站式价格对比、品相分析和投资组合管理。

Stars: 2 | Forks: 0

# Casecomp logo Casecomp [![版本](https://img.shields.io/badge/version-1.3.0-d9b676)](CHANGELOG.md) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/5e40d669fb063628.svg)](https://github.com/Pyronewbic/casecomp/actions/workflows/ci.yml) [![Deploy](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8a0659d71c063629.svg)](https://github.com/Pyronewbic/casecomp/actions/workflows/deploy.yml) [![许可证](https://img.shields.io/badge/license-MIT-blue)](LICENSE) [![API](https://img.shields.io/badge/API-docs-d9b676)](https://api.casecomp.xyz/docs) [![SLSA 3](https://img.shields.io/badge/SLSA-Level%203-green)](https://slsa.dev) [![Sigstore](https://img.shields.io/badge/signed-sigstore-blue)](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 Pokemon 卡牌搜索演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4b58bd6896063630.gif) ### 功能特性 - **多来源搜索** - 一次查询即可搜索 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, 二手交易, 价格追踪, 卡牌投资, 卡牌评级, 图像识别, 多源比价, 套利, 宝可梦, 宝可梦卡牌, 特征检测, 网络测绘, 自定义脚本, 资产组合管理, 集换式卡牌