后记:已开源发布,仓库地址: https://github.com/lyessure/cdtalive

在前几天的贴文中,我谈到了阿里抢占 CDT 的创建(https://wuliao.de/blog/index.php/archives/450/),它配套的保活我当时只是提了一下,因为网上确实已经有不少了。不过老实说,这些脚本都不太易用,功能也太弱,所以我决定自己写一个。

主要特点是:

基于 Docker 及提供简单的 WebUI、余额分析、流量监控、回收后重新拉起(保活)、多时段定时开关机、紧急全地域自动停机。目前还没决定的是在 DockerHub 上发布,还是在 GitHub 上源码包发布。改天再琢磨下。

顺便说下,别说美国豆包老流口水,但在前端审美上真的是秒杀 Codex。我这个应用的后端用 Codex,前端用 AGY,因为第一版用 Codex 做的前端实在太丑了,就这么个简单的单页应用都丑到爆。后面改用大豆包就好很多,像模像样的。

image.png

今天给博客塞了个AI写稿功能——就是一个聊天框,跟它聊着聊着,博文就自动写好了。写博客要是还用古法一个字一个字敲,那也太对不起这个时代了。好像还没看到哪家博客这么玩过?

广告时间到:本博客系统是开源的,源码在 https://github.com/lyessure/Go-TeBlog,欢迎 star 欢迎试用。后台地址:https://wuliao.de/admin,账号密码都是 guest。guest帐号全功能的,只是没有写操作权限。

image.png

今天 5.6 出来了,第一时间一定是要好好折腾的,毕竟 Tibo 也说了,今天要重置两次额度。所以,我就来改改博客的编辑器吧,把原来的 textarea 改成了支持所见即所得的 Markdown 编辑器。

整个过程还好,只是在最后要求按照工作流提交 GitHub 时,5.6 和我杠上了。以前还从来没哪个版本这样。

问题不大,只是觉得好玩,发文记录下。

顺便说一句,此次改动,用的gpt 5.6 terra medium,用掉了5h额度的60%左右。按照api计费的话,价值 $7.5。sol那是真心用不起了。

image.png

上次在哪吒探针事件时说过,开源项目如果出现漏洞,很难静默修复,有心之人分析一下diff一下,很容易发动 0day 攻击。 以前还要读代码,现在甚至代码都不用读了,扔给ai就几秒的事。
今天再次看到一个反面例子。开发商在这次事件中的表现那是相当的不专业。

某开源软件发了一个紧急通知:

image.webp

马上 ai 走起,提示语:帮我看看一个开源项目,new api,它的 v1.0.0-rc.18 版本修复了一个和帐户余额有关的什么漏洞

ai 回报:

image.webp

够明白了吧,只要在 api 请求时,改一下 max_tokens,然后余额起飞啦。

codex只能显示有几张重置卡,但具体什么时候到期不显示,然后app里面永远只显示你新获得一张重置卡有效期30天。让人感觉是永久的。其实不然。
根据论坛上看到的别人的介绍,然后让codex自己搓了一个查自己的。实测好用。

#!/usr/bin/env python3

import json
import sys
import urllib.error
import urllib.request
from datetime import datetime, timedelta, timezone
from pathlib import Path


AUTH_PATH = Path.home() / ".codex" / "auth.json"
API_URL = "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits"
BEIJING_TZ = timezone(timedelta(hours=8))


def load_access_token() -> str:
    try:
        data = json.loads(AUTH_PATH.read_text(encoding="utf-8"))
    except FileNotFoundError:
        print(f"未找到认证文件: {AUTH_PATH}", file=sys.stderr)
        sys.exit(1)
    except json.JSONDecodeError:
        print(f"认证文件不是合法 JSON: {AUTH_PATH}", file=sys.stderr)
        sys.exit(1)

    token = data.get("tokens", {}).get("access_token")
    if not token:
        print("认证文件中缺少 tokens.access_token", file=sys.stderr)
        sys.exit(1)
    return token


def parse_utc_to_beijing(value: str) -> str:
    dt = datetime.fromisoformat(value.replace("Z", "+00:00"))
    return dt.astimezone(BEIJING_TZ).strftime("%Y年%-m月%-d日 %H:%M:%S")


def fetch_credits(token: str) -> list[dict]:
    req = urllib.request.Request(
        API_URL,
        headers={
            "Authorization": f"Bearer {token}",
            "Accept": "application/json",
            "User-Agent": "codexreset.py",
        },
    )

    try:
        with urllib.request.urlopen(req, timeout=20) as resp:
            data = json.loads(resp.read().decode("utf-8"))
    except urllib.error.HTTPError as err:
        if err.code == 401:
            print("HTTP 401:凭证失效或 Authorization header 不正确", file=sys.stderr)
            sys.exit(1)
        print(f"HTTP {err.code}:请求失败", file=sys.stderr)
        sys.exit(1)
    except urllib.error.URLError as err:
        print(f"网络请求失败:{err.reason}", file=sys.stderr)
        sys.exit(1)

    credits = data.get("credits")
    if not isinstance(credits, list):
        print("接口返回格式异常:缺少 credits 数组", file=sys.stderr)
        sys.exit(1)
    return credits


def main() -> None:
    token = load_access_token()
    credits = fetch_credits(token)

    if not credits:
        print("没有可显示的重置卡。")
        return

    for idx, credit in enumerate(credits, start=1):
        granted_at = credit.get("granted_at")
        expires_at = credit.get("expires_at")
        if not granted_at or not expires_at:
            continue
        print(f"{idx}. 发放时间:{parse_utc_to_beijing(granted_at)}")
        print(f"   过期时间:{parse_utc_to_beijing(expires_at)}")


if __name__ == "__main__":
    main()

运行结果:

root@leb:/usr/local/bin# codexreset.py
1. 发放时间:2026年6月12日 11:56:56
   过期时间:2026年7月12日 11:56:56
2. 发放时间:2026年6月18日 08:33:06
   过期时间:2026年7月18日 08:33:06
3. 发放时间:2026年6月27日 08:07:52
   过期时间:2026年7月27日 08:07:52
4. 发放时间:2026年7月2日 04:28:21
   过期时间:2026年8月1日 04:28:21

 

 

后记: 这玩意没存在意义了。openai已经决定要加入这功能了。

image.webp