开源、自部署的艺人公开行程追踪与追星旅行决策助手。
当前版本:
0.1.0发布候选。项目不售票、不代抢票,也不提供非公开艺人行程。
-
活动详情 → 空闲时间输入 → 信息确认 → 可行性结果的完整演示闭环
-
支持自然语言描述空闲时间和截图上传状态
-
可编辑识别结果并选择悠闲、标准或极限赶路偏好
-
结果时间线会公开每一项计算假设
-
独立可测试的时间可行性判断引擎,三种风险偏好会产生不同结果
-
艺人管理、多来源状态、真实 X 主页、RSSHub 测试与帖子链接导入
-
航班推荐支持本地免费估算、航班号确认、手动填写,以及可选的 Amadeus 免费测试连接器
-
无需 API Key 的航班搜索导入:打开搜索页后粘贴文字,或在浏览器本地 OCR 航班截图
-
桌面与手机响应式行程首页。
-
演唱会票根式活动卡片。
-
可行性摘要和旅行期限内附近场次。
-
“去 / 考虑 / 不去”交互状态。
-
首页只展示经来源确认的真实活动;没有真实活动时保持诚实空状态。
-
集中式品牌颜色、字体、字号、间距和按钮参数。
需要 Node.js 22.13 或更高版本。
pnpm install
pnpm dev打开终端显示的本地地址。
不配置任何密钥时,航班判断仍可使用本地估算或手动填写。若要启用 Amadeus Self-Service 测试环境:
- 在 Amadeus for Developers 创建免费测试应用。
- 复制
.env.example为.env.local。 - 填写
AMADEUS_CLIENT_ID与AMADEUS_CLIENT_SECRET,然后重新启动项目。
连接器固定请求 test.api.amadeus.com。测试环境有免费月度额度,但返回有限缓存数据,不应被标记为实时航班。密钥只在服务端使用。
在可行性判断的“从航班搜索导入”区域:
- 打开 Google Flights 或 Skyscanner。
- 复制一条候选航班的文字并粘贴,或上传航班截图。
- TicketClub 在浏览器本地识别航班号、起降时间、转机与价格。
- 核对识别出的蓝色航班票,再开始判断。
截图 OCR 使用开源 Tesseract.js。图像不会发送到 TicketClub 服务器;首次使用时浏览器需要下载 OCR 运行文件和英文识别数据。
pnpm build
pnpm lint
pnpm test- 艺人行程只应来自公开信息,所有自动提取结果在进入正式行程前都需要用户确认。
- 空闲时间、地点照片和精确地址默认保存在浏览器 localStorage。
- X 没有稳定的免费官方自动读取能力;项目支持公开 RSS、X 铃铛提醒和手动导入,不绕过访问控制。
- 航班搜索导入要求用户核对结果,TicketClub 不保证票价、余票或实时状态。
- 这是行程决策工具,不是票务、旅行保险、签证或入境建议服务。
安全问题请阅读 SECURITY.md,贡献代码前请阅读 CONTRIBUTING.md 与 CODE_OF_CONDUCT.md。
编辑 app/globals.css 顶部的 TICKETCLUB ADJUSTMENT PANEL:
:root {
--tc-blush-300: #e8cdd8;
--tc-text-page-title: clamp(2rem, 3vw, 2.9rem);
--tc-button-height: 3.125rem;
--tc-page-gutter: clamp(1rem, 3vw, 2.5rem);
}编辑 components/ui/Button.tsx;按钮视觉统一在 app/globals.css 的 .tc-button 中调整。
编辑 components/TicketCard.tsx;票根宽度、安全区和移动端布局在 app/globals.css 中调整。
app/ 页面入口、字体和全局设计 Token
components/ 可复用界面组件
components/ui/ 基础控件
lib/types.ts 领域类型
db/ 后续本地数据层
tests/ 服务端渲染与代码结构测试
PRODUCT.md 长期产品事实
DESIGN.md 视觉系统约束
网页内通知中心保存在本机;GitHub Actions 可以免费定时检查 RSS,并用你自己的 SMTP 发邮件。
仓库默认示范监测 KiiiKiii 的公开日程页与 Universal Music Japan 新闻页。网页监测只判断公开内容是否变化,不会把变化自动伪装成已确认活动;收到提醒后仍应打开来源核对。
- 编辑
config/ticketclub.json,加入一个或多个 RSS/Atom 地址:
{
"timezone": "Australia/Melbourne",
"sources": [
{
"id": "kiiikiii-x-rss",
"artist": "KiiiKiii",
"kind": "rss",
"url": "https://你的-rss-服务地址"
}
]
}- 在 GitHub 仓库的
Settings → Secrets and variables → Actions添加:SMTP_HOST、SMTP_PORT、SMTP_SECURE、SMTP_USER、SMTP_PASS、NOTIFY_EMAIL。Gmail 通常使用smtp.gmail.com、端口465、true,密码应使用 App Password,不要提交邮箱密码。 - 打开 Actions,手动运行一次
TicketClub daily check。第一次只建立基线;第二次起有新增、变更、取消或连续三次失败才发信。
若只想确认 SMTP 是否配置正确,手动运行时勾选 Send one SMTP test email。测试邮件不会读取或修改艺人行程。
如果 SMTP 未配置或被邮箱服务拒绝,工作流会降级为创建 GitHub Issue,确保提醒不会静默丢失。Issue 内容只包含公开来源的活动变化,不应写入个人地址或空闲时间。
带有 ticketclub-alert 标签和版本化 JSON 证据的公开 Issue 会在打开 TicketClub 时同步到本机待确认收件箱。Fork 本项目时,请把 NEXT_PUBLIC_GITHUB_REPOSITORY 改为自己的 owner/repository。同步内容仍是待确认情报,不会自动成为正式行程。
X 没有稳定的免费官方读取接口,因此本项目不声称直接绕过 X。可配置自建 RSSHub、其他合法 RSS 服务,或继续使用网页内“粘贴文字/截图后确认”的流程。GitHub Actions 不能读取浏览器 localStorage,所以邮件检查历史与网页通知中心目前明确分开保存。
检查脚本可单独运行:node scripts/check-sources.mjs。