去年底(距今也没有多久),发现我为上上家公司写的 Git 构建脚本还在用,于是我花业余时间写了一个新的脚本,用来构建仅依赖 libc 或者静态编译 Git 的项目,现在分享出来:https://github.com/baulk/git-minimal,旨在提供最新版无依赖的 git 二进制。

Release 可下载 deb/rpm/apk(alpine) 安装包,还有 tar.xz 压缩包(压缩包里有启动器,修正了路径和 SSL 证书,证书下载自 cURL 站点),压缩包(安装包)中还有开启了 HTTP/3 的 cURL 最新版本。

风味

包名 libc 可运行的系统
git-minimal glibc Linux ,x86_64 ,glibc >= 2.39
git-minimal-static glibc (静态链接) Linux ,x86_64
git-minimal-musl musl (静态链接) Linux ,x86_64/aarch64

由于 musl 的内存分配器比较差,git-minimal 在链接阶段链接了 mimalloc 。

0. 不说废话,只分享干货。

1. 前情提要 https://www.v2ex.com/t/1149991

2. 第一家店是 2025.8.3 开业。
第二家店是 2025.12.28 开业。均定位中高端自助洗车。

3. 第一家店目前月流水在 2w 多,第二家店半个月目前 1w 多,单店月利润在 1w 多,单店投资 20 左右,回本时间预 计在 1 年左右。

4. 目前还在全职上班中,当然工作不忙,不加班,每个店雇兼职保洁月成本 1k 。

5. 目前店里还需要自己做的就是:接电话、定期补充药剂、维护设备。

6. 未来计划:再复制几家店,雇全职管理所有店。

7. 行业优势:风险小,新能源车火爆导致洗车服务供不应求,回本周期还算比较短,投资相对不高,人力成本低可以做副业,门槛低。

8. 行业劣势:严重依赖场地,面向的顾客群体五花八门,琐碎事情多,有人真的会半夜打电话,收入不算暴利,需要跟各色人打交道,门槛低但想做好不容易。

9. 加盟还是自己搞品牌:加盟最快但是要擦亮眼睛,割韭菜的太多太多,我目前加盟的品牌算是比较良心,没有加盟费只有小程序订阅费,不抽点,用户付款直接到自己账户,不干预后期经营,当然缺点就是没啥服务(服务的人力成本太高了);自己搞品牌,可以省点钱,但是设备稳定性和小程序需要自己慢慢踩坑,小程序做个简单的不难,好用也不容易。

10. 行业核心在于好的场地,场地决定了生死,拿场地很多时候需要关系或者票子疏通。怎么简单判断一个场地的地段能不能干,去找附近的同行,蹲门口计数或者通过小程序统计一天的车流量。

11. 如何估算成本和收益:我这里提供一些经验值供大家参考。1 个工位白天洗车拉满的情况下撑死也就是洗 20 来辆车,过节可能还会多一些,但是也多不哪里去,1 个车平均在 30-60 分钟,客单价在 20 左右。我 1 店周内在 30 左右,周末在 50 辆左右,1 个月目前 1k 多辆。成本 1 辆车按照 0.1 吨水,1 度电来估算,药剂耗材几乎可以忽略不计。

12. 花那么多钱自己洗车为什么不去京东途虎养车 9.9 洗车呢:首先要明确一个事,外面的三四十普洗都是不够成本的。为什么还会有低价洗车?无非两种,一是低价引流然后推销高端项目,二是办卡才能享受。这就导致外面那些要么排队要么跑路。还有两个原因,低价洗车或者 4s 店免费洗车都比较糙,不仅洗不干净还容易把车漆洗化,另外一个原因就是自己洗车比较解压能提供情绪价值。

13. 感悟:真正从打工贩卖时间来赚钱到利用生产资料来换钱,完全是两码事,上班认识的人大部分都是上班的,等你开始做生意了,认识的老板会越来越多,等你生意做的好了就自然会有老板愿意来投资你,你拥有了输入钱就可以输出更多钱的能力,这个时候你的人脉会越来越广,这个能力确实很多时候比写一段牛逼的代码对老板更有用。从上班的角度来看,程序员依然是众多行业的顶流,不用操太多心,工资高,环境好,周围人的素质相对高很多。做生意以后才能体会到,老板的时间就是金钱这句话。

14. 我可以为大家提供的价值:我也是跌跌撞撞干了半年才算对这个行业比较熟悉了,踩了很多坑,现在大部分场地我看一眼就知道能不能干,大家可以发场地照片我帮忙判断能否做,给大家一点经验(选场地+运营)。无偿的,但是希望大家真的想干了再来问我,最近忙着找场地扩店,我的精力也是有限的,建议先自己网上多看看再来跟我交流,不要问一些太小白的问题,时间就是金钱啊。啥?你连我的微信都找不到?那还是先干好本职工作吧。

为什么做这个?

备考的日子里,我总是很难准确知道自己每天到底学了多少时间。

手动计时太麻烦,番茄钟又总是忘记开。坐在电脑前一整天,感觉学了很久,但实际有效学习时间可能只有几个小时。

于是我想:能不能让电脑自动帮我记录学习时间?

就像运动手环自动记录步数一样 —— 打开网课页面就自动开始计时,关掉就停止。不需要任何操作,专注学习就好。

快学点儿吧 就这样诞生了

功能亮点

功能说明
桌面程序基于 Tauri 的轻量应用,安静地待在系统托盘
浏览器扩展Chrome 扩展自动检测学习页面,无需手动操作
手机 APPFlutter 开发的 Android 应用,随时随地查看学习数据
云同步多设备数据无缝同步,电脑手机数据互通
数据统计直观的图表展示学习轨迹,日 / 周 / 月维度分析
目标管理设定每日目标,倒计时考试日期
智能通知学习里程碑提醒(可关闭,不打扰你)
开机启动随系统自动运行,打开电脑就开始守护

工作原理

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   Chrome 浏览器  │────▶│     桌面程序     │────▶│    手机 APP     │
│    (扩展程序)    │     │   (时间记录器)   │     │   (查看统计)    │
└─────────────────┘     └─────────────────┘     └─────────────────┘
  1. Chrome 扩展 监控你的浏览器标签页
  2. 当你访问的 URL 匹配某个课程时,通知桌面程序
  3. 桌面程序 开始计时,数据存储在本地 SQLite 数据库
  4. 可选同步 到云端,在手机上查看统计数据

演示图:

桌面程序

移动 APP:


📌 转载信息
原作者:
Ar3s
转载时间:
2026/1/12 10:39:05

Spotx
Windows 端的,安装特别简单
直接复制进 powershell 回车按提示完成安装即可

iex “& { $(iwr -useb ‘https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1’) } -new_theme”

iex “& { $(iwr -useb ‘https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1’) } -new_theme”

╔════════════════════════════════╗
║ 欢迎使用 SpotX 的 Windows 版本 ║
╚════════════════════════════════╝

您的 Spotify 1.2.79.427 版本已过时,建议更新到 1.2.80.349
是否需要更新? [Y/N]: Y

是否要卸载当前版本 1.2.79.427 或者覆盖安装?Y [卸载] / N [覆盖安装]: N

下载并安装 Spotify 1.2.80.349
请稍等…

#################################################################################################################### 100.0%

您想关闭主页上的播客、剧集与有声读物吗? [Y/N]: Y

您想要阻止 Spotify 更新吗? [Y/N]: Y

修补 Spotify…

安装完成

然后打开 Spotify 开始享受吧


📌 转载信息
原作者:
S_M9
转载时间:
2026/1/12 10:38:14

今日为保稳定,遂开通,但感觉额度略少。以及倍率略高,遂以个人方法测试。
PS:仅使用个人语料库测试,算法各有不同,可保证复现

日期范围:2026-01-11

数据来源:/root/.codex/sessions/2026/01/11/rollout-*.jsonl

计算脚本:codex 倍率计算.py:1

重要说明

1. 本报告使用的是 Codex 本机 rollout 会话文件中 token_count 事件的累计 token 统计;不依赖任何主观估计。

2.“缓存折扣系数 α=0.1” 无法从日志中自动推断(日志只记录 cached_input_tokens 数量,不记录计费规则 / 账单),因此本报告把它作为 “外部配置输入” 参与计算。

3. 同一天如果继续使用 Codex,会新增 / 更新更多 rollout,导致 “当日汇总值” 变化;本报告反映的是运行脚本时刻在该目录内可解析到的结果。

  1. 计费配置(输入参数)
  • 输入单价 Pin = $0.8750 / 1M tokens

  • 输出单价 Pout = $7.0000 / 1M tokens

  • 输出 / 输入价格比 r = Pout / Pin = 8

  • 缓存折扣系数 α = 0.1(即缓存输入 token 按输入价的 10% 计费)

  • 有效工作量口径:W = U + O(新增输入 + 输出)

———

  1. 日志字段与符号定义(从 rollout 直接读取)

从每个 rollout-*.jsonl 的 event_msg.type=token_count 的 info.total_token_usage 取:

  • I = input_tokens(总输入 token)

  • C = cached_input_tokens(命中缓存的输入 token)

  • U = I - C(未命中 / 新增输入 token)

  • O = output_tokens(输出 token)

———

  1. 指标定义(“基准词 + 真实倍率”)

为把 “输出更贵、缓存更便宜” 的成本结构统一到一个尺度,采用 “等价输入 token” 折算:

  • 等价基准词(Equivalent Baseline Tokens)

    E = U + α*C + r*O

  • 有效工作词(Work Tokens)

    W = U + O

  • 真实倍率(Real Multiplier)

    M = E / W

并给出对应成本与 “有效单价”:

  • 输入成本 Cin = (U + α*C) / 1e6 * Pin

  • 输出成本 Cout = O / 1e6 * Pout

  • 总成本 Ctotal = Cin + Cout

  • 有效单价(每 1M 有效工作词)P_eff = Pin * M

———

  1. 取数范围与纳入情况(可复现)
  • 当天目录内存在多个 rollout-*.jsonl;脚本实际读取到 5 个包含可用 token_count 的 rollout 并纳入汇总。

  • 复现命令(本报告实际使用):

    python3 codex 倍率计算.py --date 2026-01-11 --pin 0.875 --pout 7 --alpha 0.1 --sessions-root /root/.codex/sessions --denom U+O --breakdown --classify

———

  1. 当日汇总结果(5 个 rollout 合计)

Token 汇总

  • I = 16,882,855

  • C = 16,058,496

  • U = 824,359

  • O = 145,980

  • 缓存命中率 C/I = 95.117182%

倍率汇总(α=0.1,W=U+O)

  • E = 3,598,048.6

  • W = 970,339

  • 真实倍率 M = 3.708033×

  • 有效单价 P_eff = $3.244528 / 1M 有效工作词

成本拆分(美元,按 α=0.1)

  • Cin = $2.1264325

  • Cout = $1.0218600

  • Ctotal = $3.1482925

  • 基准成本(把 W 全部按输入价计费):baseline_cost = $0.8490466

  • 成本倍率(与 M 一致):Ctotal /baseline_cost = 3.708033×

———

  1. 分会话(rollout)结果与 “模拟用户行为” 分类(基于日志回放)

说明:这里的 “模拟用户行为” 并非人工控制实验,而是对已有会话做回放式归类(依据:提示相似度 + 工具调用密度)。为对外展示,本报告不展示原始提示词全文,仅展示分类、token 与倍率。

  • rollout-2026-01-11T09-49-54-019baabe-e078-7fe2-9d1b-3a11c91e51ac.jsonl

    • 分类:cold_start

    • I/C/U/O = 34,663 / 33,664 / 999 / 88

    • 命中率:97.117964%

    • 真实倍率 M:4.663661×

  • rollout-2026-01-11T09-53-11-019baac1-e04c-72c3-a7df-d5c5d0eb98b2.jsonl

    • 分类:cold_start

    • I/C/U/O = 11,521 / 10,752 / 769 / 97

    • 命中率:93.325232%

    • 真实倍率 M:3.025635×

  • rollout-2026-01-11T09-55-03-019baac3-963c-7353-9849-2614a76f03b6.jsonl

    • 分类:tools_dense(工具调用密集)

    • 工具调用统计(来自 rollout):exec_command=156, update_plan=24, apply_patch=20, write_stdin=8

    • I/C/U/O = 11,633,072 / 11,147,008 / 486,064 / 73,377

    • 命中率:95.821706%

    • 真实倍率 M:3.910655×

  • rollout-2026-01-11T10-34-55-019baae8-149c-7e82-ac18-2de8db88bc1b.jsonl

    • 分类:tools_dense

    • 命中率:93.960516%

    • 真实倍率 M:3.433297×

  • rollout-2026-01-11T11-21-02-019bab12-4eef-7d83-96b4-6de8dc37feb6.jsonl

    • 分类:tools_dense

    • 工具调用统计:exec_command=44, write_stdin=8

    • I/C/U/O = 911,345 / 834,048 / 77,297 / 22,605

    • 命中率:91.518360%

    • 真实倍率 M:3.418768×

———


📌 转载信息
转载时间:
2026/1/12 10:38:09

opencode 是什么就不需要我多说了,是一个非常好用的聚合的 TUI coding agent,原生支持 LSP 和 ASP,很适合佬友们有一堆渠道站的用法。

但是在搭配 codex 的时候,经常会出现下面这些问题

  1. Items not found
all 10 attempts failed: HTTP 404: 
{
    "error": {
        "code": null,
        "message": "{\n \"error\": {\n \"message\": \"Item with id 'rs_jgs9diuh934hu9shag09phq9raf0' not found. Items are not persisted when `store` is set to false. Try again with `store` set to true, or remove this item from your input.\",\n \"type\": \"invalid_request_error\",\n \"param\": \"input\",\n \"code\": null\n  }\n}(traceid: 824gj32q80-94gj-08)",
        "param": null,
        "type": "invalid_request_error"
    }
}

核心问题就是这个 items 字段。codex 全部使用的是有状态的 response api,所以 opencode 默认不会携带上下文给 api,而是只提供一个 item_id ,提供了一种更优雅的方案。
但是 L 站的转发,显然是没办法支持这个的,所以我们需要添加一个关键参数:

"store": false 

这样就会在每次都传递完整的上下文给中转站了。

  1. 不命中缓存
    为了节约宝贵的 token,现在各大中转站也都支持 prompt cache 了,但是也需要在配置文件中启用一下配置:
 "setCacheKey": true 

综上,给各位佬友们一个综合一些的 opencode.jsonc 的完整配置,mcp 就各位佬友自己随便定制啦

{
  "$schema": "https://opencode.ai/config.json",
  "model": "foxcode/google/gemma-3n-e4b",
  "provider": {
    "example": {
      "npm": "@ai-sdk/openai",
      "name": "example",
      "options": {
        "baseURL": "https://new.example.com/codex/v1",
        "setCacheKey": true
      },
      "models": {
        "gpt-5-2-high": {
          "id": "gpt-5.2",
          "name": "GPT 5.2 High",
          "options": {
            "reasoningEffort": "high",
            "textVerbosity": "low",
            "reasoningSummary": "auto",
            "store": false
          }
        },
        "gpt-5-2-medium": {
          "id": "gpt-5.2",
          "name": "GPT 5.2 Medium",
          "options": {
            "reasoningEffort": "medium",
            "textVerbosity": "low",
            "reasoningSummary": "auto",
            "store": false
          }
        },
        "gpt-5-2-xhigh": {
          "id": "gpt-5.2",
          "name": "GPT 5.2 XHigh",
          "options": {
            "reasoningEffort": "xhigh",
            "textVerbosity": "low",
            "reasoningSummary": "auto",
            "store": false
          }
        }
      }
    }
  },
  "mcp": {
    "auggie-mcp": {
      "type": "local",
      "command": [
        "auggie",
        "--mcp"
      ],
      "enabled": true
    },
    "chrome-devtools-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "chrome-devtools-mcp@latest"
      ],
      "enabled": false
    },
    "deepwiki": {
      "type": "remote",
      "url": "https://mcp.deepwiki.com/mcp",
      "enabled": true
    },
    "sequential-thinking": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@modelcontextprotocol/server-sequential-thinking"
      ],
      "enabled": true
    }
  }
}

📌 转载信息
转载时间:
2026/1/12 10:37:54

给商店版来点好评吧,真的有用诶,审核确实变快了

同站点 Cookie 多账号支持:同站点多个 Cookie 账号也能和平共处

  • 支持同一站点下 多个 Cookie 认证账号共存,互不串号、功能也能正常用
  • Anyrouter 的 cookie 多账号已通过测试

模型情况更透明:各种可用性一测就知道

  • 模型列表新增 接口可用性检测(Beta)
    • 一次性测试常见能力:文本生成 / 工具调用 / 结构化输出(JSON)/ 联网搜索等
    • 每个检测项都有清晰结论:通过 / 失败 / 不支持,并能看到耗时,方便定位是接口问题还是模型问题
  • 模型列表新增 CLI 工具兼容性检测(Beta)
    • 直接模拟 Claude Code / Codex CLI / Gemini CLI 的调用
    • 提前判断 “在这些 CLI 里大概率能不能跑通”,少走很多弯路

兑换更省操作:批量兑换,失败重试

  • 兑换助手支持 批量兑换 功能,一次性解析并兑换多个兑换码,极大提升效率
  • 支持 单码重试:可以单个重试,失败的码不用整批重来

原生签到和外部签到站各走各路:再也不互斥

  • 拆分 “站点签到” 和 “自定义 / 外部签到” 的逻辑,互不干扰
  • 可以在原生签到的基础上,同时使用外部签到站 / 福利站,再也不用书签拉满(虽然其实原来就可以,但之前会互斥嘛

其他更顺手的优化

  • 侧边栏模式下会避免出现 “重复打开侧边栏” 的入口,减少误操作和干扰
  • CLIProxyAPI 导出时可以一起设置 代理 URL、以及 模型 name → alias 的映射列表,导出后更接近 “能直接用” 的状态

此为 3.0 - 3.2 的更新日志,更多内容请见: 更新日志 | All API Hub - 中转站管理器

完整插件介绍


📌 转载信息
原作者:
qi_xing_jk
转载时间:
2026/1/12 10:36:20

这两天死了么很火,作为小白的我也想试试,但是收费了,花钱不存在的。
纯小白,代码 ai 写的,我不会。简简单单的实现了功能,里面还可以加很多功能,注册用户,多用户通知,我就不为难 ai 了,交给你们这群程序员了~嘿嘿~

原理就是签到证明自己活着。

实现:每天都要充电,iPhone 用户插电运行快捷指令,访问固定域名,记录下来,然后到期没有再运行这个快捷指令就证明死了。发 bark 给接收人。

需要用到 Cloudflare 的 worker 和 kv,新建 kv 名称写 CLOCKIN_KV,里面的值是账号密码,照着抄就行。


worker 绑定要写对变量,如图:


worker 中设置运行时间,我设置的是一天两次 0 9,21 * * * 用的白嫖的域名。


iPhone 快捷指令就是一个简单的请求,我的用户名是 mengnimen 密码是 123456,到时候根据你自己在 kv 里设置的值自己改。

https://你的域名/clockin?user=mengnimen&pwd=123456

快捷新建一个 获取 URL 内容 即可。


在自动化中添加一个充电运行的,记得把立即运行打开

以后就是每次充电运行,记录你还活着,一天不记录,就会发通知给 bark 接收人

纯小白,代码 ai 写的,我不会。代码中需要添加 bark 地址,多长时间认为活着也可以改,自己看注释就行了。简简单单的实现了功能,里面还可以加很多功能,注册用户,多用户通知,我就不为难 ai 了,交给你们这群程序员了~嘿嘿

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const path = url.pathname;

    try {
      if (path === "/" || path === "/health") return json({ ok: true });

      if (path === "/clockin") return await handleClockin(url, env);
      if (path === "/check") return await handleCheck(url, env);

      return json({ ok: false, error: "Not Found" }, 404);
    } catch (e) {
      return json({ ok: false, error: e?.message || String(e) }, 500);
    }
  },

  async scheduled(event, env, ctx) {
    ctx.waitUntil(runTimeoutCheck(env));
  },
};

const CONFIG = {
  ALERT_AFTER_DAYS: 1,
  MIN_ALERT_INTERVAL_HOURS: 6,
  DEFAULT_NOTIFY: { type: "bark", url: "" }, // 这里填默认 bark 或钉钉
  TITLE: "死了",
  NOTIFY_ON_CLOCKIN: false,
};

async function handleClockin(url, env) {
  const user = (url.searchParams.get("user") || "").trim();
  const pwd = (url.searchParams.get("pwd") || "").trim();
  if (!user || !pwd) return json({ ok: false, error: "Missing user or pwd" }, 400);

  const ok = await verifyUserPlain(user, pwd, env);
  if (!ok) return json({ ok: false, error: "Auth failed" }, 401);

  const now = Date.now();
  await env.CLOCKIN_KV.put(kLastTime(user), String(now));

  if (CONFIG.NOTIFY_ON_CLOCKIN) {
    await sendNotify(env, user, { title: "还活着", body: `已记录:${formatTime(now)}` });
  }

  return json({ ok: true, user, last_time: now, last_time_text: formatTime(now) });
}

async function handleCheck(url, env) {
  const user = (url.searchParams.get("user") || "").trim();
  const pwd = (url.searchParams.get("pwd") || "").trim();
  if (!user || !pwd) return json({ ok: false, error: "Missing user or pwd" }, 400);

  const ok = await verifyUserPlain(user, pwd, env);
  if (!ok) return json({ ok: false, error: "Auth failed" }, 401);

  const now = Date.now();
  const lastStr = await env.CLOCKIN_KV.get(kLastTime(user));
  const lastMs = lastStr ? Number(lastStr) : null;

  const thresholdMs = CONFIG.ALERT_AFTER_DAYS * 24 * 60 * 60 * 1000;
  return json({
    ok: true,
    user,
    now,
    now_text: formatTime(now),
    last_time: lastMs,
    last_time_text: lastMs ? formatTime(lastMs) : null,
    since_hours: lastMs ? round2((now - lastMs) / 3600000) : null,
    threshold_days: CONFIG.ALERT_AFTER_DAYS,
    is_timeout: lastMs ? (now - lastMs > thresholdMs) : true,
  });
}

async function runTimeoutCheck(env) {
  const now = Date.now();
  const thresholdMs = CONFIG.ALERT_AFTER_DAYS * 24 * 60 * 60 * 1000;
  const minIntervalMs = CONFIG.MIN_ALERT_INTERVAL_HOURS * 60 * 60 * 1000;

  let cursor = undefined;
  let checked = 0;
  let alerted = 0;

  while (true) {
    const listRes = await env.CLOCKIN_KV.list({ prefix: "user_pwd:", cursor });
    cursor = listRes.cursor;

    for (const k of listRes.keys) {
      const user = k.name.slice("user_pwd:".length);
      checked++;

      const lastStr = await env.CLOCKIN_KV.get(kLastTime(user));
      const lastMs = lastStr ? Number(lastStr) : 0;

      const timeout = !lastMs || (now - lastMs > thresholdMs);
      if (!timeout) continue;

      const lastAlertStr = await env.CLOCKIN_KV.get(kLastAlert(user));
      const lastAlertMs = lastAlertStr ? Number(lastAlertStr) : 0;
      if (lastAlertMs && (now - lastAlertMs < minIntervalMs)) continue;

      const hours = lastMs ? round2((now - lastMs) / 3600000) : null;
      const body = lastMs
        ? `你已超过 ${hours} 小时未进行“活着打卡”。\n上次记录:${formatTime(lastMs)}`
        : `未找到打卡记录,请连接充电器触发一次打卡。\n当前时间:${formatTime(now)}`;

      const ok = await sendNotify(env, user, { title: CONFIG.TITLE, body });
      if (ok) {
        alerted++;
        await env.CLOCKIN_KV.put(kLastAlert(user), String(now));
      }
    }

    if (listRes.list_complete) break;
  }

  await env.CLOCKIN_KV.put("meta:last_run", String(now));
  await env.CLOCKIN_KV.put("meta:last_run_summary", JSON.stringify({ now, checked, alerted }));
  return { checked, alerted, now };
}

/** 明文校验:KV 中 user_pwd:<user> 直接存明文 */
async function verifyUserPlain(user, pwd, env) {
  const stored = await env.CLOCKIN_KV.get(kUserPwd(user));
  if (!stored) return false;
  return stored === pwd;
}

async function sendNotify(env, user, msg) {
  let notify = null;
  const perUserStr = await env.CLOCKIN_KV.get(kNotify(user));
  if (perUserStr) {
    try { notify = JSON.parse(perUserStr); } catch {}
  }
  const type = notify?.type || CONFIG.DEFAULT_NOTIFY.type;
  const url = notify?.url || CONFIG.DEFAULT_NOTIFY.url;
  if (!url) return false;

  if (type === "dingtalk") return await sendDingTalk(url, msg);
  return await sendBark(url, msg);
}

async function sendBark(baseUrl, msg) {
  const title = encodeURIComponent(msg.title || "提醒");
  const body = encodeURIComponent(msg.body || "");
  const u = `${baseUrl.replace(/\/$/, "")}/${title}/${body}`;
  const r = await fetch(u, { method: "GET" });
  return r.ok;
}

async function sendDingTalk(webhookUrl, msg) {
  const payload = { msgtype: "text", text: { content: `${msg.title || "提醒"}\n\n${msg.body || ""}` } };
  const r = await fetch(webhookUrl, {
    method: "POST",
    headers: { "content-type": "application/json;charset=utf-8" },
    body: JSON.stringify(payload),
  });
  return r.ok;
}

const kUserPwd = (user) => `user_pwd:${user}`;
const kLastTime = (user) => `last_time:${user}`;
const kLastAlert = (user) => `last_alert:${user}`;
const kNotify = (user) => `notify:${user}`;

function json(obj, status = 200) {
  return new Response(JSON.stringify(obj, null, 2), {
    status,
    headers: { "content-type": "application/json; charset=utf-8" },
  });
}
function formatTime(ms) { return new Date(ms).toISOString(); }
function round2(n) { return Math.round(n * 100) / 100; }

📌 转载信息
转载时间:
2026/1/12 10:36:11

最近大家应该听说过一款叫 “死了么” 的 App。听说此 App 最近估值 1000 万了,相关新闻 “死了么” APP 下载量暴涨 100 倍!创始人:开发成本 1000 多元,计划以 100 万出让 10% 的股份

这么高估值的产品,需要 8 元才能使用,为了让人人都能用得起,我在此开源我花了 0.1 元(电费)与 72 秒开发的产品 ——Alive(活着呢)

如果您没有 1 分钟时间部署,也可以使用我部署好版本:活着呢

希望大家都能好好活着


📌 转载信息
原作者:
Amery2010
转载时间:
2026/1/12 10:35:49

18 号上午在深圳打印了银行卡流水、个税记录、支付宝理财证明、信用卡账单各种纸质材料。中午过口岸,在香港坐地铁去酒店的路上顺手开了众安卡,到酒店放置好行李立马去附近的中国银行。到现场得知已经没有号,只能明天来,经理提示说可以线上预约。当天晚上在酒店用手机流量申请中国银行账号,但是没有立马通过。由于没有找到线上预约的地方,于是早上八点出门去银行,到八点半到银行已经排很长的队了。九点准时开门,进去我以为跟大陆一样需要取号,到处找取号机。然后前面的一位小姐姐直接找经理要了号,我也学着过去要一个号,经理问我是要干嘛,我说开一张银行卡,于是给我一个号。后面就是等叫号,是用粤语叫号,我还怕我听不懂哈哈,实际会有工作人员用普通话提醒。在排队的时候会给你一个二维码,扫描二维码注册账号。办理的时候我把一堆文件拿出来给他,他只拿了信用卡账单、过关小票、港澳通行证。然后开始问我开卡的目的,我就说是投资港股,他问我有没有投资经验,我说在支付宝买了几万块的基金,他让我把支付宝打开给他看,他翻了交易记录和个人资料。后面又让我现场打开手机银行给他看工资流水,个税 app 看交税记录,都在 app 里重点看了个人资料。最后问我有没有更详细的地址证明材料,因为我的信用卡账单地址写的不清楚,我没有,当场以为办不下来了,后面他又说让我把账单 PDF 发给他邮箱,只能按账单地址填我的信息。后面就是输入密码开通理财的功能,最后就办下来了给我一个信封,我去 ATM 机激活就可以了。总体还是挺顺利的!最后感叹一下香港工作真的好轻松啊,工作人员办理完一个客户就会消失一段时间可能是休息去了,30 分钟后才回来,好惬意。


📌 转载信息
转载时间:
2026/1/12 10:35:30

排名不分先后,都是我用过的, 本文不做任何推荐

CC Switch 好像有个 bug, 余额查询的配置好像是不隔离的。

NewAPI 系列

以下几家中转站都是基于 NewAPI 搭建,所以查询余额较为简单

  • IKunCode
  • privnode
  • Duckcoding

配置步骤:

以 ikuncode 站为例,privnode/Duckcoding 步骤都一样

  1. 登录对应的网站,打开控制台 / 个人设置

  2. 点击安全设置,生成系统访问令牌

  3. 回到 CC-Switch, 配置用量查询,预设模板选择 NewAPI, 填入访问令牌和用户 ID

RightCode (订阅余额)

配置步骤:

  1. 预设模板选择 通用模板,填入请求地址 https://right.codes/subscriptions/list

  2. 登录网站 F12 控制台获取 bearer token(任意一个请求), 填入提取器代码(整个替换)

({
request: {
url: "https://right.codes/subscriptions/list",
method: "GET",
headers: {
Authorization: `f12控制台获取 bearer token`,
},
},
extractor: function (response) {
const now = new Date(); // 获取当前时间,用于比较 const results = response.subscriptions.reduce(
(acc, subscription, index) => {
// 解析过期时间 const expiredAt = new Date(subscription.expired_at);

// 判断是否过期:当前时间 > 过期时间,则跳过 if (now > expiredAt) {
return acc; // 跳过该项,直接返回已累积的数组
}

// 根据 reset_today 判断重置状态 const resetStatus = subscription.reset_today ? "已重置" : "未重置";
const extraInfo = `今天${resetStatus}`;

// 将符合条件的项添加到累积数组
acc.push({
id: subscription.id || `subscription_${index + 1}`,
remaining: subscription.remaining_quota,
planName: subscription.name,
unit: "USD",
// 新增的 extra 字段 extra: extraInfo,
});

return acc; // 返回更新后的累积数组
},
[],
); // 初始值为空数组 return results;
},
});

群里有个人开发了 vscode 插件可以更好的显示

cubence (余额)

配置步骤:

  1. 预设模板选择 通用模板,填入请求地址 https://cubence.com/api/v1/auth/me,并从网页端 F12 获取 cookie, 提取器代码填入以下代码:
({
  request: {
    url: "https://cubence.com/api/v1/auth/me",
    method: "GET",
    headers: {
      "Cookie": "token=<yourtoken>",
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0"
    }
  },
  extractor: function(response) {
    return {
      remaining: response.user.normal_balance / 1000000,
      unit: "USD"
    };
  }
})

Yescode

步骤:

  1. 预设模板选择 通用模板,填入请求地址 https://co.yes.vg/api/v1/user/balance,并从网页端 F12 获取 cookie, 提取器代码填入以下代码:
({
  request: {
    url: "https://co.yes.vg/api/v1/user/balance",
    method: "GET",
    headers: {
      Cookie:
        "your_cookie",
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0",
    },
  },
  extractor: function (response) {
    return {
      remaining: response.balance,
      unit: "USD",
    };
  },
});

📌 转载信息
原作者:
unsafe
转载时间:
2026/1/12 10:35:17

前因

本人即将开启作为全栈工程师的个人职业生涯,但是鉴于之前 AI 开发的经历,开头一时爽快后,后面的代码缺乏各种文档和行之有效的项目迭代管理,导致 AI 开发的项目后面直接变成了屎山。于是本人就和 Claude 一顿头脑风暴,讨论 AI 时代的开发者如何进行迭代,能不能参考以前的敏捷开发的经验等等,忽略过程,最后我们输出这份 solo-agile-template

后果

这份模板采用前后端分离的方式,辅以 3m 原则和敏捷开发的思想,再搭配上各类低耦合的文档,让个人开发者拿到这个模板后只需要进行简单的本地化修改后就可以开始真正愉快的 coding 了。

我在这里抛砖引玉,欢迎佬友们一起来构建这个 template。


📌 转载信息
转载时间:
2026/1/12 10:35:05

测试一下港仔的 KDDI/au 5G Mobile VPS 产品,少数的日本蜂窩網絡 Mobile 家宽,ip 质量优秀,常规流媒体和本土流媒体基本全都解锁,机器性能强劲,i912900H 的 CPU 性能不错,IO 也不错。IPV4 三网不可直连,推荐中转,IPV6 部分地区可直连,带宽应该是 200Mbps,不过都买了这么贵的家宽了,应该不差这点中转费用了

这个机器为双 ip 策略

入口:idc V4入口或者KDDI家宽V6入 //可以自带IPV4入口,直接对接你的线路机器
出口:KDDI家宽V4出或者家宽V6出

测试配置为

2C2G 8GB 
CPE 5G蜂窩網絡Mobile 5G
IPv4 *1 & IPv6 /64 SLAAC
1T流量「工单免费重置」
98/

网络质量

IPV6 入

bestvm V4 入

测了一下日本本土互联,下载速度非常一般,这台前置貌似是限速了

BageVMBoil.5G PCE

23 packets transmitted, 23 received, 0% packet loss, time 22531ms
rtt min/avg/max/mdev = 0.321/0.405/0.507/0.046 ms

[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  3.02 MBytes  25.3 Mbits/sec                  
[  5]   1.00-2.00   sec  4.07 MBytes  34.1 Mbits/sec                  
[  5]   2.00-3.00   sec  4.07 MBytes  34.2 Mbits/sec                  
[  5]   3.00-4.00   sec  2.11 MBytes  17.7 Mbits/sec                  
[  5]   4.00-5.00   sec  2.64 MBytes  22.2 Mbits/sec                  
[  5]   5.00-6.00   sec  4.36 MBytes  36.6 Mbits/sec                  
[  5]   6.00-7.00   sec  5.04 MBytes  42.2 Mbits/sec                  
[  5]   7.00-8.00   sec  11.9 MBytes   100 Mbits/sec                  
[  5]   8.00-9.00   sec  12.3 MBytes   103 Mbits/sec                  
[  5]   9.00-10.00  sec  1.54 MBytes  12.9 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.03  sec  51.3 MBytes  42.9 Mbits/sec  6051             sender
[  5]   0.00-10.00  sec  51.1 MBytes  42.8 Mbits/sec                  receiver

[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  7.88 MBytes  66.1 Mbits/sec                  
[  5]   1.00-2.00   sec  9.15 MBytes  76.8 Mbits/sec                  
[  5]   2.00-3.00   sec  15.2 MBytes   127 Mbits/sec                  
[  5]   3.00-4.00   sec  11.3 MBytes  95.0 Mbits/sec                  
[  5]   4.00-5.00   sec  3.80 MBytes  31.9 Mbits/sec                  
[  5]   5.00-6.00   sec  2.58 MBytes  21.7 Mbits/sec                  
[  5]   6.00-7.00   sec  2.29 MBytes  19.2 Mbits/sec                  
[  5]   7.00-8.00   sec  15.2 MBytes   127 Mbits/sec                  
[  5]   8.00-9.00   sec  22.0 MBytes   185 Mbits/sec                  
[  5]   9.00-10.00  sec  8.12 MBytes  68.2 Mbits/sec                  
[  5]  10.00-11.00  sec  2.39 MBytes  20.1 Mbits/sec                  
[  5]  11.00-12.00  sec  2.94 MBytes  24.6 Mbits/sec                  
[  5]  12.00-13.00  sec  2.32 MBytes  19.4 Mbits/sec                  
[  5]  13.00-14.00  sec   786 KBytes  6.44 Mbits/sec                  
[  5]  14.00-15.00  sec   708 KBytes  5.80 Mbits/sec                  
[  5]  15.00-16.00  sec   499 KBytes  4.09 Mbits/sec                  
[  5]  16.00-17.00  sec   551 KBytes  4.52 Mbits/sec                  
[  5]  17.00-18.00  sec   955 KBytes  7.82 Mbits/sec                  
[  5]  18.00-19.00  sec  1.65 MBytes  13.8 Mbits/sec                  
[  5]  19.00-20.00  sec   878 KBytes  7.19 Mbits/sec                  
[  5]  20.00-21.00  sec   672 KBytes  5.51 Mbits/sec                  
[  5]  21.00-22.00  sec   414 KBytes  3.39 Mbits/sec                  
[  5]  22.00-23.00  sec   487 KBytes  3.99 Mbits/sec                  
[  5]  23.00-24.00  sec  1.46 MBytes  12.3 Mbits/sec                  
[  5]  24.00-25.00  sec  5.53 MBytes  46.4 Mbits/sec                  
[  5]  25.00-26.00  sec  1.12 MBytes  9.42 Mbits/sec                  
[  5]  26.00-27.00  sec  1.08 MBytes  9.07 Mbits/sec                  
[  5]  27.00-28.00  sec   554 KBytes  4.54 Mbits/sec                  
[  5]  28.00-29.00  sec   373 KBytes  3.06 Mbits/sec                  
[  5]  29.00-30.00  sec   313 KBytes  2.57 Mbits/sec                  
[  5]  30.00-31.00  sec  5.22 MBytes  43.8 Mbits/sec                  
[  5]  31.00-32.00  sec  1.83 MBytes  15.4 Mbits/sec                  
[  5]  32.00-33.00  sec  15.4 MBytes   130 Mbits/sec                  
[  5]  33.00-34.00  sec  7.77 MBytes  65.2 Mbits/sec                  
[  5]  34.00-35.00  sec  7.04 MBytes  59.0 Mbits/sec                  
[  5]  35.00-36.00  sec  4.08 MBytes  34.2 Mbits/sec                  
[  5]  36.00-37.00  sec  2.04 MBytes  17.1 Mbits/sec                  
[  5]  37.00-38.00  sec  1.27 MBytes  10.7 Mbits/sec                  
[  5]  38.00-39.00  sec   554 KBytes  4.54 Mbits/sec                  
[  5]  39.00-40.00  sec  1.16 MBytes  9.73 Mbits/sec                  
[  5]  40.00-41.00  sec  6.31 MBytes  52.9 Mbits/sec                  
[  5]  41.00-42.00  sec  5.74 MBytes  48.2 Mbits/sec                  
[  5]  42.00-43.00  sec  4.96 MBytes  41.7 Mbits/sec                  
[  5]  43.00-44.00  sec  3.92 MBytes  32.8 Mbits/sec                  
[  5]  44.00-45.00  sec  3.29 MBytes  27.6 Mbits/sec                  
[  5]  45.00-46.00  sec  2.29 MBytes  19.2 Mbits/sec                  
[  5]  46.00-47.00  sec  3.12 MBytes  26.2 Mbits/sec                  
[  5]  47.00-48.00  sec  8.99 MBytes  75.4 Mbits/sec                  
[  5]  48.00-49.00  sec  13.0 MBytes   109 Mbits/sec                  
[  5]  49.00-50.00  sec  5.77 MBytes  48.4 Mbits/sec                  
[  5]  50.00-51.00  sec  1.10 MBytes  9.25 Mbits/sec                  
[  5]  51.00-52.00  sec  2.92 MBytes  24.5 Mbits/sec                  
[  5]  52.00-53.00  sec  2.81 MBytes  23.6 Mbits/sec                  
[  5]  53.00-54.00  sec  1.82 MBytes  15.3 Mbits/sec                  
[  5]  54.00-55.00  sec   458 KBytes  3.75 Mbits/sec                  
[  5]  55.00-56.00  sec   509 KBytes  4.17 Mbits/sec                  
[  5]  56.00-57.00  sec   501 KBytes  4.10 Mbits/sec                  
[  5]  57.00-58.00  sec   559 KBytes  4.58 Mbits/sec                  
[  5]  58.00-59.00  sec   819 KBytes  6.71 Mbits/sec                  
[  5]  59.00-60.00  sec   665 KBytes  5.45 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.03  sec   239 MBytes  33.4 Mbits/sec  28034             sender
[  5]   0.00-60.00  sec   239 MBytes  33.4 Mbits/sec                  receiver

ip 质量

TK 是解锁的啊,这个脚本有点问题

IPV4 质量

IPV6 质量

常见流媒体解锁

---------------流媒体解锁--感谢oneclickvirt/UnlockTests测试----------------
Can not detect IPv6 Address
测试时间:  2026-01-11 20:15:17
IPV4:
============[ 跨国平台 ]============
Apple                     YES (Region: JPN)
BingSearch                YES (Region: JP)
Claude                    YES
Dazn                      YES (Region: JP)
Disney+                   YES (Region: JP)
Gemini                    YES (Region: JP)
GoogleSearch              YES
Google Play Store         YES (Region: JP)
IQiYi                     YES (Region: JP)
Instagram Licensed Audio  YES
KOCOWA                    NO
MetaAI                    YES (Region: US)
Netflix                   YES (Region: JP)
Netflix CDN               JP
OneTrust                  YES (Region: JP TOKYO)
ChatGPT                   YES (Region: JP)
Paramount+                YES
Amazon Prime Video        YES (Region: JP)
Reddit                    YES
SonyLiv                   Banned
Sora                      YES (Region: JP)
Spotify Registration      NO
Steam Store               YES (Community Available) (Region: JP)
TVBAnywhere+              YES (Region: JP)
TikTok                    YES (Region: JP)
Viu.com                   YES
Wikipedia Editability     YES
YouTube Region            YES (Region: JP)
YouTube CDN               kddi - HND
---------------------TikTok解锁--感谢lmc999的源脚本---------------------
 Tiktok Region:         【JP】

细分流媒体解锁

 ** 正在测试 IPv4 解锁情况
--------------------------------
 ** 您的网络为: au one net (59.132.*.*)
============[ Multination ]============
 Dazn:                                  Yes (Region: JP)
 Disney+:                               Yes (Region: JP)
 Netflix:                               Yes (Region: JP)
 YouTube Premium:                       Yes (Region: JP)
 Amazon Prime Video:                    Yes (Region: JP)
 TVBAnywhere+:                          Yes
 Spotify Registration:                  No
 OneTrust Region:                       JP [Tokyo]
 iQyi Oversea Region:                   JP
 Bing Region:                           JP (Risky)
 Apple Region:                          JP
 YouTube CDN:                           [KDDI] in [Tokyo]
 Netflix Preferred CDN:                 Tokyo
 ChatGPT:                               Yes
 Google Gemini:                         Yes (Region: JPN)
 Claude:                                Yes
 Wikipedia Editability:                 Yes
 Google Play Store:                     Japan 
 Google Search CAPTCHA Free:            Yes
 Steam Currency:                        JPY
 ---Forum---
 Reddit:                                Yes
 ---Game---
 SD Gundam G Generation Eternal:        Yes
=======================================
===============[ Japan ]===============
 DMM:                                   Yes
 DMM TV:                                Yes
 Abema.TV:                              Yes (Region: JP)
 Niconico:                              Failed (Error: PAGE ERROR)
 Telasa:                                Yes
 U-NEXT:                                Yes
 Hulu Japan:                            Yes
 TVer:                                  Failed (Error: PAGE ERROR)
 Lemino:                                Yes
 AnimeFesta:                            Yes
 WOWOW:                                 Failed (Error: PAGE ERROR 1)
 VideoMarket:                           Yes
 D Anime Store:                         Yes
 FOD(Fuji TV):                          Yes
 Radiko:                                Yes (City: KAGOSHIMA)
 Karaoke@DAM:                           Yes
 J:com On Demand:                       Yes
 WATCHA:                                Yes
 Rakuten TV JP:                         Failed (Error: PAGE ERROR 1)
 ---Game---
 Kancolle Japan:                        Failed (Network Connection)
 Pretty Derby Japan:                    Yes
 Konosuba Fantastic Days:               Failed (Network Connection)
 Princess Connect Re:Dive Japan:        Yes
 Project Sekai: Colorful Stage:         Yes
 ---Music---
 Mora:                                  Yes
 music.jp:                              Yes
 ---Forum---
 EroGameSpace:                          Yes
=======================================

常见 IP 库结果

-------------IP质量检测--基于oneclickvirt/securityCheck使用--------------
数据仅作参考,不代表100%准确,如果和实际情况不一致请手动查询多个数据库比对
以下为各数据库编号,输出结果后将自带数据库来源对应的编号
ipinfo数据库  [0] | scamalytics数据库 [1] | virustotal数据库   [2] | abuseipdb数据库   [3] | ip2location数据库    [4]
ip-api数据库  [5] | ipwhois数据库     [6] | ipregistry数据库   [7] | ipdata数据库      [8] | db-ip数据库          [9]
ipapiis数据库 [A] | ipapicom数据库    [B] | bigdatacloud数据库 [C] | dkly数据库        [D] | ipqualityscore数据库 [E]
ipintel数据库 [F] | ipfighter数据库   [G] | fraudlogix数据库   [H] | cloudflare数据库  [I] |
IPV4:
安全得分:
信任得分(越高越好): 100 [8] 
VPN得分(越低越好): 0 [8] 
代理得分(越低越好): 0 [8] 
社区投票-无害: 0 [2] 
社区投票-恶意: 0 [2] 
威胁得分(越低越好): 0 [8] 
欺诈得分(越低越好): 28 [E] 
滥用得分(越低越好): 0 [3] 
威胁级别: low [9] 
流量占比: 真人(越高越好)96% [I] 机器人(越低越好)3% [I]
黑名单记录统计:(有多少黑名单网站有记录):
无害记录数: 0 [2]  恶意记录数: 0 [2] 可疑记录数: 0 [2]  无记录数: 93 [2] 
安全信息:
使用类型: unknown [C] business [9] cellular [3] isp [0 7 8]
公司类型: isp [0 7] 
浏览器类型: 主流37% 其他62% [I] 
设备类型: 桌面27% 移动72% 其他0% [I] 
操作系统类型: 主流98% 其他1% [I] 
是否云提供商: No [7 D] 
是否数据中心: No [0 5 8 C G] 
是否移动设备: No [5 G] Yes [C E]
是否代理: Yes [G] No [0 4 5 7 8 9 C D E]
是否VPN: No [0 7 C D E G] 
是否Tor: No [0 3 7 8 C D E] 
是否Tor出口: No [7 D] 
是否网络爬虫: No [9 E]
是否匿名: No [7 8 D] 
是否攻击者: No [7 8 D] 
是否滥用者: No [7 8 C D E] 
是否威胁: No [7 8 C D] 
是否中继: No [0 7 8 C D] 
是否Bogon: No [7 8 C D] 
是否机器人: No [E] 
Google搜索可行性:NO
------------邮件端口检测--基于oneclickvirt/portchecker开源------------
Platform  SMTP  SMTPS POP3  POP3S IMAP  IMAPS
LocalPort ✔     ✔     ✔     ✔     ✔     ✔    
QQ        ✔     ✔     ✔     ✘     ✔     ✘    
163       ✔     ✔     ✔     ✘     ✔     ✘    
Sohu      ✔     ✔     ✔     ✘     ✔     ✘    
Yandex    ✔     ✔     ✔     ✘     ✔     ✘    
Gmail     ✔     ✔     ✘     ✘     ✘     ✘    
Outlook   ✔     ✘     ✔     ✘     ✔     ✘    
Office365 ✔     ✘     ✔     ✘     ✔     ✘    
Yahoo     ✔     ✔     ✘     ✘     ✘     ✘    
MailCOM   ✔     ✔     ✔     ✘     ✔     ✘    
MailRU    ✔     ✔     ✘     ✘     ✔     ✘    
AOL       ✔     ✔     ✘     ✘     ✘     ✘    
GMX       ✔     ✔     ✔     ✘     ✔     ✘    
Sina      ✔     ✔     ✔     ✘     ✔     ✘    
Apple     ✘     ✘     ✘     ✘     ✘     ✘    
FastMail  ✘     ✔     ✘     ✘     ✘     ✘    
ProtonMail✘     ✘     ✘     ✘     ✘     ✘    
MXRoute   ✔     ✘     ✔     ✘     ✔     ✘    
Namecrane ✔     ✔     ✔     ✘     ✔     ✘    
XYAMail   ✘     ✘     ✘     ✘     ✘     ✘    
ZohoMail  ✘     ✔     ✘     ✘     ✘     ✘    
Inbox_eu  ✔     ✔     ✔     ✘     ✘     ✘    
Free_fr   ✘     ✔     ✔     ✘     ✔     ✘  

机器性能


📌 转载信息
原作者:
STALK
转载时间:
2026/1/12 10:34:35

效果图

先上个效果图

NewAPI 搭建的中转站

大部分的中转站都是基于 NewAPI 部署,一般可以在中转站底部 footer 看到是不是,那么可以使用接下来的两种用量查询方式

使用访问令牌

1. 获取用户 ID + 访问令牌:在 NewAPI 系统中转站 ,登录后找到 个人设置 -> 安全设置 -> 系统访问令牌,生成令牌。头像的旁边可以看到你的 ID

2. 填写配置:在 cc-switch 中进入用量查询配置页面,选择 NewAPI 模板,将请求地址、访问令牌、用户 ID 都填写上,注意这 3 个都是必填项。勾选启用用量查询 保存即可查询。


使用 APIKey

这个方式不用生成访问令牌,使用你填写的供应商 key 完成查询。使用 通用模板,在提取器代码输入框中输入以下脚本。

({
  request: {
    url: "{{baseUrl}}/api/usage/token",
    method: "GET",
    headers: {
      Authorization: "Bearer {{apiKey}}",
    },
  },
  extractor: function (response) {
    if (response.code) {
      if (response.data.unlimited_quota) {
        return {
          planName: response.data.name,
          total: -1,
          used: response.data.total_used / 500000,
          unit: "USD",
        };
      }
      return {
        isValid: true,
        planName: response.data.name,
        total: response.data.total_granted / 500000,
        used: response.data.total_used / 500000,
        remaining: response.data.total_available / 500000,
        unit: "USD",
      };
    }
    if (response.error) {
      return {
        isValid: false,
        invalidMessage: response.error.message,
      };
    }
  },
})

这个方式是查询你这个供应商 key 的用量情况,并非是你账号的,如果你的 key 生成时选择的无限额度,那么在 cc-switch 中只会显示这个 key 已经使用的用量,并不会显示剩余的。

其它

还有很多中转站是自研的系统,无法使用上述的方式进行查询,那么就要自己去写对应的查询脚本完成查询,这里我贴一个 88code 的,其它支持查询用量的站点,可以私聊我进行补充。

88code

和方式 2 一样,使用 通用模板 ,在提取器代码输入框中粘贴以下脚本。

({
  request: {
    url: "{{baseUrl}}/subscription",
    method: "POST",
    headers: {
      Authorization: "Bearer {{apiKey}}",
      "User-Agent": "cc-switch/1.0",
      Accept: "*/*",
    },
  },
  extractor: function (response) {
    if (response.error && response.msg == "No active subscription found") {
      throw new Error("该套餐暂无额度可使用");
    }
    if (response.error && response.msg == "API key not found") {
      throw new Error("该KEY无效");
    }
    const res = response.data // 成功处理:检查响应是否为非空数组 if (Array.isArray(res) && res.length > 0) {
      return res.filter(i => i.subscriptionStatus === "活跃中").map((i) => {
        let extraInfo = ""; // 初始化 extra 字段变量 // 判断是否有上次重置时间,以此来计算下次刷新时间 // lastCreditReset 字段存在且不为 null if (i.lastCreditReset) {
          // 1. 将上次重置时间的字符串转换为 Date 对象 const lastResetDate = new Date(i.lastCreditReset);
          // 2. 根据套餐描述,假设是每日重置,计算下次重置时间(加上24小时) // 86400000 毫秒 = 24 * 60 * 60 * 1000 const nextResetDate = new Date(lastResetDate.getTime() + 5*60*60*1000);
          // 3. 格式化日期为 "MM-DD HH:MM" const pad = (num) => String(num).padStart(2, "0");
          const month = pad(nextResetDate.getMonth() + 1); // 月份是从0开始的,所以+1 const day = pad(nextResetDate.getDate());
          const hours = pad(nextResetDate.getHours());
          const minutes = pad(nextResetDate.getMinutes());
          const formattedNextReset = `${month}-${day} ${hours}:${minutes}`;
          // 4. 拼接成最终的字符串
          extraInfo = `下次可刷新时间:${formattedNextReset}(${i.resetTimes})`;
        }
        // 对于按量付费(PAY_PER_USE)类型的套餐,提供特定信息 else if (i.subscriptionPlan.planType === "PAY_PER_USE") {
          extraInfo = "按量付费套餐,无固定刷新周期";
        }
        // 返回包含新字段的完整对象 return {
          isValid: true,
          planName: i.subscriptionPlan.subscriptionName,
          total: i.subscriptionPlan.creditLimit,
          remaining: i.currentCredits,
          unit: "USD",
          extra: extraInfo, // 将生成的 extra 信息添加到返回对象中
        };
      });
    }
  },
});

📌 转载信息
转载时间:
2026/1/12 10:34:08

为了体验一下 claude 的 skills,直接让 AI 阅读 claude 官方文档,生成了一个 skills
专门针对 PHP 项目的代码审查 skill ,试了下还不错,欢迎体验。


📌 转载信息
原作者:
love1024
转载时间:
2026/1/12 10:33:29

起因

今天打开活动监视器,发现内存压力已经黄了。

一看进程列表,好家伙,满屏的 node

排查

ps aux | grep node

输出让我沉默了:

node auggie --mcp -m default -w /Users/xxx/project
node auggie --mcp -m default -w /Users/xxx/project
node auggie --mcp -m default -w /Users/xxx/project
... (x34)

34 个 auggie --mcp 进程,全是 Augment 官方的 CLI 工具。

有些从 12月27日 就开始跑了,已经跑了两周了...

问题分析

Auggie 作为 MCP server 被 Claude Code / Cursor 等客户端调用时:

  1. 每次新会话都 fork 新进程 —— 这没问题
  2. 但是客户端断开后,进程不退出 —— 这就有问题了
  3. 没有任何清理机制 —— 进程就这么一直挂着
  4. 静默吃内存 —— 没有任何提示,用户完全无感知

结果就是:用一天,攒一堆僵尸进程,内存越来越少,直到你发现电脑开始卡了。

临时解决方案

# 一键清理所有 auggie 进程, 普通的 `pkill -f "auggie --mcp"` 居然杀不掉,必须用 `kill -9` 强制终止:
pkill -9 -f "auggie --mcp"

或者写个 alias 放到 .zshrc:

alias kill-auggie='pkill -9 -f "auggie --mcp" && echo "已清理 auggie 僵尸进程"' 

作为一个官方出品的 CLI 工具,进程生命周期管理这种基本功都没做好,属实有点说不过去。

ps: 可以用佬友 开发的 优化版… 官方这个属实有点坑了…


📌 转载信息
原作者:
cao_Jacker
转载时间:
2026/1/12 10:33:17

直接产出 Dreamy-rain/gemini-business2api 所需 json 注册效率~60s 一个
日抛 直接每日重新注册即可

刚刚那个版本有点问题 已修复
已经生成的佬记得把 config_id 后缀的?csesidx=.* 清理掉重新导入

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
from datetime import datetime
import time, random, json, os, requests

# 配置
TOTAL_ACCOUNTS = 20
MAIL_API = "https://mail.chatgpt.org.uk"
MAIL_KEY = "gpt-test"
OUTPUT_DIR = "gemini_accounts"
LOGIN_URL = "https://auth.business.gemini.google/login?continueUrl=https:%2F%2Fbusiness.gemini.google%2F&wiffid=CAoSJDIwNTlhYzBjLTVlMmMtNGUxZC1hY2JkLThmOGY2ZDE0ODM1Mg" # XPath
XPATH = {
    "email_input": "/html/body/c-wiz/div/div/div[1]/div/div/div/form/div[1]/div[1]/div/span[2]/input",
    "continue_btn": "/html/body/c-wiz/div/div/div[1]/div/div/div/form/div[2]/div/button",
    "verify_btn": "/html/body/c-wiz/div/div/div[1]/div/div/div/form/div[2]/div/div[1]/span/div[1]/button",
}

NAMES = ["James Smith", "John Johnson", "Robert Williams", "Michael Brown", "William Jones",
         "David Garcia", "Mary Miller", "Patricia Davis", "Jennifer Rodriguez", "Linda Martinez"]

def log(msg, level="INFO"): print(f"[{level}] {msg}")

def create_email():
    """创建临时邮箱""" try:
        r = requests.get(f"{MAIL_API}/api/generate-email",
            headers={"X-API-Key": MAIL_KEY}, timeout=30)
        if r.status_code == 200 and r.json().get('success'):
            email = r.json()['data']['email']
            log(f"邮箱创建: {email}")
            return email
    except Exception as e:
        log(f"创建邮箱失败: {e}", "ERR")
    return None def get_code(email, timeout=30):
    """获取验证码"""
    log(f"等待验证码 (最多{timeout}s)...")
    start = time.time()
    while time.time() - start < timeout:
        try:
            r = requests.get(f"{MAIL_API}/api/emails", params={"email": email},
                headers={"X-API-Key": MAIL_KEY}, timeout=30)
            if r.status_code == 200:
                emails = r.json().get('data', {}).get('emails', [])
                if emails:
                    html = emails[0].get('html_content') or emails[0].get('content', '')
                    soup = BeautifulSoup(html, 'html.parser')
                    span = soup.find('span', class_='verification-code')
                    if span:
                        code = span.get_text().strip()
                        if len(code) == 6:
                            log(f"验证码: {code}")
                            return code
        except: pass print(f"  等待中... ({int(time.time()-start)}s)", end='\r')
        time.sleep(3)
    log("验证码超时", "ERR")
    return None def save_config(email, cookies, url):
    """保存配置"""
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    parsed = urlparse(url)
    path_parts = url.split('/')
    config_id = None for i, p in enumerate(path_parts):
        if p == 'cid' and i+1 < len(path_parts):
            config_id = path_parts[i+1]
            # 清理 config_id 结尾的 ?csesidx=xxx if config_id and '?' in config_id:
                config_id = config_id.split('?')[0]
            break

    cookie_dict = {c['name']: c for c in cookies}
    ses_cookie = cookie_dict.get('__Secure-C_SES', {})

    data = {
        "id": email,
        "csesidx": parse_qs(parsed.query).get('csesidx', [None])[0],
        "config_id": config_id,
        "secure_c_ses": ses_cookie.get('value'),
        "host_c_oses": cookie_dict.get('__Host-C_OSES', {}).get('value'),
        "expires_at": datetime.fromtimestamp(ses_cookie.get('expiry', 0) - 43200).strftime('%Y-%m-%d %H:%M:%S') if ses_cookie.get('expiry') else None
    }

    with open(f"{OUTPUT_DIR}/{email}.json", 'w') as f:
        json.dump(data, f, indent=2, ensure_ascii=False)
    log(f"配置已保存: {email}.json")
    return data

def register(driver):
    """注册单个账号"""
    email = create_email()
    if not email: return None, False, None

    wait = WebDriverWait(driver, 60)

    # 1. 访问登录页
    driver.get(LOGIN_URL)
    time.sleep(5)

    # 2. 输入邮箱
    log("输入邮箱...")
    inp = wait.until(EC.visibility_of_element_located((By.XPATH, XPATH["email_input"])))
    inp.click(); time.sleep(0.3); inp.clear(); time.sleep(0.3)
    for c in email: inp.send_keys(c); time.sleep(0.05)
    log(f"邮箱: {email}, 实际值: {inp.get_attribute('value')}")
    time.sleep(1)

    # 3. 点击继续
    btn = wait.until(EC.element_to_be_clickable((By.XPATH, XPATH["continue_btn"])))
    driver.execute_script("arguments[0].click();", btn)
    log("点击继续")
    time.sleep(3)

    # 4. 获取验证码
    code = get_code(email)
    if not code: return email, False, None # 5. 输入验证码
    time.sleep(2)
    log(f"输入验证码: {code}")
    try:
        pin = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='pinInput']")))
        pin.click(); time.sleep(0.2)
        for c in code: pin.send_keys(c); time.sleep(0.1)
    except:
        try:
            span = driver.find_element(By.CSS_SELECTOR, "span[data-index='0']")
            span.click(); time.sleep(0.3)
            driver.switch_to.active_element.send_keys(code)
        except Exception as e:
            log(f"验证码输入失败: {e}", "ERR")
            return email, False, None # 6. 点击验证
    time.sleep(1)
    try:
        vbtn = driver.find_element(By.XPATH, XPATH["verify_btn"])
        driver.execute_script("arguments[0].click();", vbtn)
    except:
        for btn in driver.find_elements(By.TAG_NAME, "button"):
            if '验证' in btn.text: driver.execute_script("arguments[0].click();", btn); break
    log("点击验证")
    time.sleep(5)

    # 7. 输入姓名 try:
        name_inp = WebDriverWait(driver, 30).until(EC.visibility_of_element_located(
            (By.CSS_SELECTOR, "input[formcontrolname='fullName'], input[placeholder='全名'], input#mat-input-0")))
        name = random.choice(NAMES)
        name_inp.clear(); time.sleep(0.3)
        for c in name: name_inp.send_keys(c); time.sleep(0.03)
        log(f"姓名: {name}")
        from selenium.webdriver.common.keys import Keys
        name_inp.send_keys(Keys.ENTER)
    except Exception as e:
        log(f"姓名输入异常: {e}", "WARN")

    # 8. 等待进入工作台
    log("等待工作台...")
    time.sleep(6)
    for _ in range(30):
        if 'business.gemini.google' in driver.current_url and 'auth' not in driver.current_url:
            break
        time.sleep(2)
    time.sleep(3)

    # 9. 保存配置
    config = save_config(email, driver.get_cookies(), driver.current_url)
    log(f"注册成功: {email}")
    return email, True, config

def main():
    print(f"\n{'='*50}\nGemini Business 批量注册 - 共 {TOTAL_ACCOUNTS} 个\n{'='*50}\n")

    driver = uc.Chrome(options=uc.ChromeOptions(), use_subprocess=True)
    success, fail, accounts = 0, 0, []

    for i in range(TOTAL_ACCOUNTS):
        print(f"\n{'#'*40}\n注册 {i+1}/{TOTAL_ACCOUNTS}\n{'#'*40}\n")

        try:
            driver.current_url  # 检查driver是否有效 except:
            driver = uc.Chrome(options=uc.ChromeOptions(), use_subprocess=True)

        try:
            email, ok, cfg = register(driver)
            if ok: success += 1; accounts.append((email, cfg))
            else: fail += 1 except Exception as e:
            log(f"异常: {e}", "ERR"); fail += 1 try: driver.quit()
            except: pass
            driver = uc.Chrome(options=uc.ChromeOptions(), use_subprocess=True)

        print(f"\n进度: {i+1}/{TOTAL_ACCOUNTS} | 成功: {success} | 失败: {fail}")

        if i < TOTAL_ACCOUNTS - 1:
            try: driver.delete_all_cookies()
            except: pass
            time.sleep(random.randint(3, 5))

    try: driver.quit()
    except: pass print(f"\n{'='*50}\n完成! 成功: {success}, 失败: {fail}\n配置保存在: {OUTPUT_DIR}/\n{'='*50}")

if __name__ == "__main__":
    main()


感谢佬友的临时邮箱 gptmail 也感谢谷大善人不限域名大赦天下

特别感谢 2api 作者 大家也别忘了给他的帖子和仓库 star 一下~


📌 转载信息
原作者:
SnapSheep
转载时间:
2026/1/12 10:33:02

本来想做导航网站的,后来感觉做新标签页也不错,于是让 AI 也做了浏览器扩展版
网页: https://lumina.jkai.de/
扩展:

  1. 下载最新版本

    • 访问 Releases 页面
    • 下载 lumina-extension-v1.0.0.zip
    • 解压到任意文件夹
  2. 加载扩展

    • 打开 Chrome 浏览器,访问 chrome://extensions/
    • 开启右上角的 " 开发者模式 "
    • 点击 " 加载已解压的扩展程序 "
    • 选择解压后的文件夹



📌 转载信息
原作者:
qinmu
转载时间:
2026/1/12 10:32:48

老婆天天拿 chatgpt 写小说,弄的文件东一头西一头,上下文满了还有幻觉,搞的很难受,她不好受,那我也别想着好受,这是背景。

所以,小可爱写作助手就这样诞生了!

纯本地,不用服务器,数据导出 josn 保存,写作这种事情,搞线上是一点好处没有,但是你可以把放稿子的文件夹同步到云端。附带 ai 功能,导入你的大纲或者你已经写的文章就能够和你一起商讨剧情,帮你整理和记录世界线和人物设定,剧情走向等。但是没有一键续写的功能,只是一个辅助的作用。

欢迎各位大佬给出建议。感谢各位的支持。

试用地址 https://write.thetruetao.com/

顺便提一嘴,我自然拼读的项目这两天看的人明显少了,赶紧学习起来!


📌 转载信息
原作者:
Jojo_Coco
转载时间:
2026/1/12 10:32:36

泄露 Telegram 真实 IP 1-click 漏洞

攻击者可以伪装一个看似普通的 @用户名提及(mention),但实际上背后藏着一个恶意代理链接(比如 mtproto:// 或 socks5:// 格式的代理配置)。

通过重设代理暴露真实 IP

・Telegram 在添加代理之前会自动 ping 代理。

・该请求绕过了所有已配置的代理

・你的真实 IP 地址会被立即记录

只需点击一下即可显示你的真实 IP 地址。

会影响安卓和 iOS 版本的 Telegram 客户端


📌 转载信息
原作者:
Haifa_Ortmeier
转载时间:
2026/1/12 10:20:13

用中文回复。
保持尖锐、一阵见血地指出问题。你非常有主见和创造性,同时你对项目很负责,你可以大胆提出建议,即使是在任务边界之外。
先理解需求再干活避免跑偏,只有用户同意后才能开始干活,如果需求不明确则需要用户澄清。
你有一定代码/架构/规范洁癖,但不过度设计/过早优化。
注释和文档应当是无状态的,你不应该将对话语境带入这些地方。

📌 转载信息
转载时间:
2026/1/12 10:20:02

過去幾個月都是使用 ChatGPT-5.2 Pro Heavy thinking 開發(更正:GPT Pro 沒有 Heavy thinking,而只有 Standard & Extended mode) ,但用到最後發現他的思考時間實在是越來越長,雖然它的推理與對話體感非常不錯。因此,決定來嘗試看看 Claude,買了 $100 的 Max 版本來用,感到十分驚奇!(初期)開發速度至少是 GPT-5.2 Pro Heavy Thinking 的 10 倍,甚至 20 倍以上!在這過程中,我也捉摸出了些可以讓開發更穩固的 instructions,底下就跟各位分享。

請以 Python 軟體開發專家與架構師的視角來跟我討論。在我開啟新視窗提問時,總是立即產生一份 markdown 檔案(task_summary.md)統整我的問題,並且以底下格式呈現:

1. 背景與發問動機
2. 簡潔有力的問題描述
3. 條列詳細的需求或規格

在分析我問你的問題之前,請幫我思考:
1. 這些分析規則是否足夠明確?
2. 有沒有哪些問題或要求須要更明確的定義?
3. 我提供你的資訊是否邏輯一致?
4. 我提供你的資訊有沒有內部矛盾的地方?

假如你目前有儲存標記軟體規格的 spec.md 檔案,則請幫我檢查是否有著與原先規格不一致的地方。

請反覆對我提出你所需要的更明確的規格或者研究問題的條件。

每次我簡短回應你我對原始問題的補充時,就請你把那些補充規格新增到 task_summary.md 的規格列表中。

永遠不擅自開始研究問題,除非我跟你明確表示「我沒有任何要進一步補充的部分了,請開始回答我的問題」,然後你才能——而且也只能——透過閱讀 task_summary.md 來研究與試圖回答 task_summary.md 的問題。

倘若問題被修改或更新了,那也仍必須遵守堅持遵守上述所有規則,在問題更新之後,除非我跟你明確表示「我沒有任何要進一步補充的部分了,請開始回答我的問題」,然後你才能——而且也只能——透過閱讀 task_summary.md 來研究與試圖回答 task_summary.md 的問題。

請幫我生成一個用以儲存軟體設計規格的 spec.md 檔案。最初這 spec.md 會是空的,所以請你在每次完成任務之後,都幫我把我們於 task_summary.md 內寫的規格內容整合至 spec.md 之中。整合的原則為:

1. 若 task_summary.md 中的軟體規格與 spec.md 邏輯不一致,則以 task_summary.md 為主。
2. 若 task_summary.md 中的軟體規格與 spec.md 邏輯上相容,則將 task_summary.md 的規格內容放在 spec.md 的適當章節中。

小弟我沒有 CS 領域背景知識,事實上,我接觸 AI 的時間也很短,所以真是獻醜了。

經測試,以上這種「規格驅動開發」的好處在於它能有效降低重構導致破壞程式碼的風險。而且,上述的 instructions 強迫 Claude 思考並對你提問有效的問題,補充相關且必要的規格。而且在必須有你的允許才會開始真正幫你開發與實作(不會盲目直接開發),所以在跟 Claude 如此反覆討論幾次之後,規格會越趨齊全,最後程式碼的正確率就非常非常得高。

不過,我認為 Claude Max 的科學與數學推理能力可能還是沒有 GPT-5.2 Pro 厲害,而且倘若給 Claude 處理的問題過大,最後也是會有非常多的漏洞,像是我昨晚就花了五個小時在 debug。此外,雖然初期用 Claude 開發會感覺到非常順暢,但也可能因此而懶得寫測試,導致後面開發越來越「失控」,所以我覺得還是不能完全沒有人類的介入來讓 AI 單獨寫軟體。

不曉得這對各位有沒有幫助。這是小弟第一次與他人分享我的 AI 使用心得,還請各位多多指教。謝謝!


📌 转载信息
转载时间:
2026/1/12 10:19:50