Skip to content
chloemeadow0-codePublic

About

No description, website, or topics provided.

Resources

Stars

6 stars

Watchers

0 watching

Forks

Repository files navigation

站点积分台

一个自托管的站点账户看板:统一查看余额/积分、手动或定时签到、按间隔轮询,并保留最近运行记录。

同时提供一个 OpenAI 兼容网关。客户端只需配置本服务的 /v1 地址和 GATEWAY_API_KEY;客户端模型名只是统一别名,网关会按已启用轮询标签和卡片顺序选择站点,并自动替换成该站点选中的真实模型。当前站点请求失败后会继续尝试下一个,且不记录请求正文。

公开邀请页位于 /invites.html。后台可为每个站点单独填写邀请链接;公开页只返回和展示管理员设置的显示名称、标签与邀请链接,不公开余额、站点接口、凭据、Key 或模型配置。

本地运行

需要 Node.js 20 或更高版本。

PowerShell:

$env:ADMIN_PASSWORD="换成你的管理密码"
$env:APP_SECRET="换成至少32位随机字符串"
$env:GATEWAY_API_KEY="换成客户端访问网关时使用的总Key"
npm install
npm start

打开 http://localhost:8080。至少设置 ADMIN_PASSWORD 与随机的 APP_SECRET;修改 APP_SECRET 后,已保存凭据将无法解密。

接入站点

默认提供 New API / One API 多站点模板。新增站点不要求手填 PAT、Cookie 或用户 ID:保存后点击“浏览器登录”,完成原站登录,应用会自动回收登录响应中的身份、令牌和 Cookie,随后自动刷新余额。手动 PAT、Cookie、用户 ID 和刷新接口仍保留在折叠的兼容设置中。程序读取 /api/user/self 的额度并调用 /api/user/checkin 签到,可以重复添加任意数量的站点。

特殊站点可选择“自定义 JSON API”:填写余额接口与 JSON 字段路径、签到接口,以及 Bearer Token、Cookie 或自定义请求头凭据。例如余额响应为 { "data": { "points": 120 } },余额字段填 data.points。短期 Bearer 还可填写刷新接口和 new_api_refresh Cookie;请求遇到 401 时会自动刷新、保存轮换凭据并重试一次。 若站点余额使用 Bearer、模型价格接口却使用浏览器登录 Cookie,可单独填写“价格 Cookie”;它只用于价格接口,不会覆盖余额与签到凭据。

Bearer 自动刷新会识别 HTTP 401、403,以及常见的 Unauthorized、invalid access token、未登录等过期响应;刷新成功后保存轮换后的 Token 与 Cookie,并自动重试原请求一次。标准 New API 可只填写 Refresh Cookie,刷新接口留空时自动使用 /api/user/auth/refresh;每次 401 最多续期并重试一次,不会循环刷新。标准 New API 的 Refresh Cookie 最长有效期仍由站点决定,彻底失效后才需要重新登录一次。 同一站点的手动刷新、批量轮询、签到和定时任务会进入独立串行队列,避免并发请求重复使用一次性 refresh Cookie,或由旧任务覆盖轮换后的新 Cookie。

对刷新会话绑定登录 IP 的站点,可在“自定义 JSON API”中把续期方式改为“服务器浏览器”。保存后在站点卡片点击“浏览器登录”,进入受管理员会话保护的远程 Chromium,并在里面登录该站一次。浏览器资料保存在 /data/browser-profile;之后该站遇到 401 时,会在同一服务器浏览器内刷新 Bearer,还会从浏览器登录存储或网页实际请求中捕获最新 Access Token 并加密保存;整个恢复流程最多尝试两次,第二次仍未取得令牌就立即失败。只需为确实需要的站点启用,其他站点继续使用轻量的普通接口刷新。

即使站点配置了自动登录账号,恢复时也会先复用并刷新当前已经登录的页面,从登录后的接口请求或刷新响应中提取令牌;只有当前登录态确实无法产生令牌时,才会进入登录页重新填写账号密码。

点击卡片的“浏览器登录”时,应用会同时启动一个三分钟的轻量监听器。登录成功后,它会自动解析登录响应、HttpOnly Refresh Cookie 或旧版 Session Cookie 并加密保存,卡片显示“已自动保存登录态”,不需要再打开开发者工具复制 Cookie。后续 401 优先直接从云端调用刷新接口并保存轮换值,不再为了每次续期打开站点页面;只有 Refresh Cookie 彻底失效才退回浏览器登录。

服务器浏览器默认只保留 1 个页面、只执行 1 个浏览器任务,重复打开同一站点会复用已有页面,自动登录产生的临时页面会在结束后回收,避免批量签到、后台轮询和多次 401 重试同时挤占内存。可通过 BROWSER_MAX_TABS 调整保留页数,通过 BROWSER_RENDERER_PROCESS_LIMIT 调整 Chromium 渲染进程上限。

回收临时页面时会始终保留 Chromium 的最后一个页面,并把它导航回 about:blank 释放重页面占用的内存,避免关闭最后窗口导致浏览器退出、黑屏并被守护任务反复重启。手动“浏览器登录”页面默认保留 10 分钟后自动回到空白页,可通过 BROWSER_LOGIN_WINDOW_MS 调整。

自动浏览器签到无论成功、失败、401 或人机验证超时都会立即清空页面并回收脚本内存;下一站优先复用这一个空白标签页,避免切换站点时两个重页面短暂重叠导致小内存容器被驱逐。

Chromium 进程意外退出时,容器内的守护任务会在 5 秒后自动重新启动;浏览器操作会短暂等待重启完成,避免瞬时返回 ECONNREFUSED。这只能恢复浏览器子进程;如果整个容器因内存不足被平台驱逐,仍需由部署平台重新启动容器。

GitHub OAuth 两步登录可在 BROWSER_LOGIN_ACCOUNTS_JSON 的对应站点中设置 {"action":"Sign in","nextAction":"Continue with GitHub"}。单站环境变量对应为 BROWSER_LOGIN_ACTION=Sign in 和 BROWSER_LOGIN_NEXT_ACTION=Continue with GitHub。服务器浏览器中的 GitHub 账号仍需人工登录一次;之后站点退出时会自动依次点击这两个按钮并复用 GitHub 登录态。

已登录但签到接口要求 Cloudflare Turnstile token 的站点,使用独立环境变量 BROWSER_CHECKIN_ACCOUNTS_JSON。例如 {"站点名":{"action":"Check in","path":"/profile","turnstile":true}}:应用会在服务器浏览器打开指定页面;若按钮已经显示 Checked in 或“已签到”,直接记录为已签到,否则先点击 Check in,再等待页面正常完成 Turnstile 验证并读取原站点签到接口的 JSON 结果。若人机验证要求交互,仍需在“浏览器登录”中人工完成;应用不会绕过验证码。该变量与登录账号、GitHub 登录及用户协议配置互不影响。

每个站点可以独立保存模型 API 地址和 API Key。地址可直接填写到 /v1,应用优先从 /v1/models 拉取可用模型,并依次探测站点的 /api/pricing、/api/models/pricing 和 /api/models 价格数据;若 /v1/models 被上游拒绝,则自动从价格列表提取模型。网页回退或不含价格字段的 JSON 会被自动跳过。价格接口不可用时,模型仍会以“价格未知”显示并可正常选择、测试和用于网关。可在按次和按量计费间切换,再按 GPT、Gemini、Claude、DeepSeek、Qwen、图像、视频和其他分类浏览。只有最终手动选中的一个模型会绑定到该站并进入统一网关,测试模型和网关请求也会使用这组独立地址与 Key。

模型价格会采用当前账户的正数分组倍率;分组倍率为 0 时视为不能用于有效价格换算,并回退到默认或其他可用正数倍率,避免把整站模型错误显示成免费。只有模型自身返回的价格为 0 才会显示为 0。

降价提醒会扫描全部启用站点,并分别为按次价格和按量输入/输出价格建立基准。自动扫描只使用现有接口凭据在后台请求,遇到 401 会记录为失败,不会启动浏览器登录或切换可见页面;站点卡片上的手动刷新仍可触发浏览器续期。页面可按站点、计费方式、比较规则和模型名称筛选;首次扫描只建立基准,后续检测到更低价时才生成提醒。提醒加精后会固定追踪加精时的原站点和原模型,涨价、再次降价、消失或恢复都会更新并重新标为未读;原站点本次刷新失败时保留上次结果,避免误报。打开降价提醒页面时也会每分钟自动同步后台变化。

仅接入你拥有或明确获授权的账户。应用只允许生产环境访问 HTTPS 公网地址,并阻止内网地址,避免被用作内网代理。

Zeabur 部署

  1. 把项目推到 GitHub,在 Zeabur 新建项目并选择该仓库。根目录的 Dockerfile 会被自动识别。
  2. 在服务变量中设置:
    • ADMIN_PASSWORD:控制台登录密码
    • APP_SECRET:至少 32 位随机字符串
    • GATEWAY_API_KEY:客户端连接统一网关时使用的总 Key
    • POLL_INTERVAL_MINUTES=30
    • AUTO_CHECKIN_HOUR=8
    • TZ=Asia/Shanghai
  3. 给服务添加持久卷,挂载路径填写 /data。否则重新部署后账户、历史以及服务器浏览器登录状态都会丢失。
  4. 在 Networking / Domain 中为 Web 端口绑定 Zeabur 域名。

轮询由应用进程内的定时器完成,不依赖 Zeabur Cron。为避免重复签到,建议只运行一个副本。应用启动后的首次轮询会在一个间隔后发生,也可在界面立即手动刷新。

统一网关

在每个站点中填写上游 API Key,并从分类价格列表中选择一个模型后,客户端配置:

Base URL: https://你的域名.zeabur.app/v1
API Key: 你设置的 GATEWAY_API_KEY
Model: xiaoju-auto(也可填写任意非空名称)

支持 /v1/models、/v1/chat/completions、/v1/responses 和 /v1/embeddings。只有属于已启用轮询标签、已填写上游 API Key 且已选定真实模型的站点会参与;任一上游返回非成功状态或发生网络错误时都会继续尝试下一个站点。

上游即使返回 HTTP 200,网关也会先确认响应中确实包含文本、工具调用或向量结果;只有用量数字而没有模型内容的空响应会被记为失败并自动切换下一站。流式响应只预读到首个有效内容,最多预读 256 KiB,确认成功后继续原样转发。

当客户端使用 /v1/responses,而上游以 400、404、405、415、422、501 或 HTTP 200 空内容表明不兼容时,网关会在同一站自动转换到 /v1/chat/completions。它会转换文本输入、系统指令、函数工具、工具结果、输出上限和常见采样参数,再将 Chat 的文本或函数调用包装为 Responses JSON 或流式事件;兼容线路会在运行日志里显示为 /v1/responses → /v1/chat/completions。

当客户端本身使用 /v1/chat/completions,上游因不认识 stream_options、reasoning_effort、metadata 等扩展字段而返回 400 或 422 时,网关会在同一站仅重试一次精简参数版本,并保留消息、函数工具和输出上限。运行日志会将这种成功或失败标记为“Chat 参数精简”。

网关转发模型响应时不会复制并缓存完整响应,仅保留末尾最多 256 KiB 用于提取用量统计,避免长输出或多个并发请求额外占用大量内存。

每次上游尝试都会写入“最近运行”,类型显示为“网关”,并记录实际模型、HTTP 结果以及经过脱敏和长度限制的上游错误原因;不会保存请求正文或对话内容。错误响应只读取开头最多 16 KiB,避免异常网页占用过多内存。

登录后可通过左侧“调用统计”查看真实网关数据,包括今日、本月及累计请求、成功与失败、首站命中率、自动切换次数、平均与 P95 耗时、近 7/30 天趋势,以及站点、模型、失败原因和接口排行。系统先按成功调用的实际 Token 和模型倍率计算消耗的站内额度,再读取站点 /api/user/topup/info 的最低充值档并通过 /api/user/amount 查询当前人民币报价,把站内额度折算成真实人民币价值;不会再把站内 1 额度默认当成 1 美元或 1 元人民币。若魔改面板没有报价接口,则使用 /api/status 公开的 price 充值单价估算。最近一次成功充值记录只用于计算实际支付;没有充值记录时实际支付为 0,当前充值报价对应的额度价值计入累计节省。所有充值换算来源都不可用时,站点只显示站内额度,不折算人民币。上方可信金额只统计调用时已经保存价格快照的新记录;旧日志会按实际模型名匹配当前目录估算,并单独显示在“旧记录估算(仅参考)”中,不会混入可信累计节省。只有总 Token 而没有输入/输出拆分时按输入单价近似估算。费用来源明细按站点和模型列出单价、Token 与贡献金额,便于定位异常价格;没有价格或没有 Token 用量的请求不会参与金额估算。 统计页可按具体站点和真实模型筛选;站点与模型排行同时显示成功率、成功/失败次数及平均耗时。 网关会从普通 JSON 或流式响应的 usage 中记录输入、输出、缓存和总 Token;没有返回 usage 的请求仍统计次数和耗时,但不会虚构 Token 数。

左侧“运行日志”独立展示最多 500 条匹配记录,可按网关/轮询/签到、执行结果和站点筛选。

已知边界

  • 各站 API 格式不同;需要提供真实站点的接口样例,才能制作免填字段的专用适配器。
  • 某些站点 Cookie 会过期,需要重新更新。
  • 服务器浏览器无法保证绕过 Turnstile、机房 IP 限制或站点自身的风控;只应用于你有权登录的账户。
  • 当前是单管理员、单实例设计,适合个人使用。

About

No description, website, or topics provided.

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages