文章

记一场短暂的 AI 狂欢:与 OpenAI 风控的猫鼠游戏

AI 摘要

那是一个属于“AI 狂欢”的短暂月份。因为能免费薅到 gpt5.4,各家公益站都起来了。

早期:简单粗暴的野蛮生长

最开始大家干得都很糙:直接上 codex 注册机,通过模拟请求批量跑号,用临时邮箱接码。拿到 `auth` 文件后,往 CPA 里一塞直接反代出来。那会儿全靠最基础的 HTTP 请求去处理,验证步骤直接走 API 提交验证码。简单、粗暴、高效。

风控升级:CF 盾与赛博大善人

但好日子没多久,Codex 那边就反应过来了,直接在 API 端设了卡。针对那些无环境直接走 API 的请求,只要你用的是“万人骑”的烂代理,或者拿不出正经的域名邮箱,迎面就是死死卡住的 CF 盾和强制手机验证。

这一手确实拍死了绝大多数跟风的白嫖党。不过俗话说得好,大清都替咱们交过钱了,拿回点属于自己的东西算什么?既然老路被堵了,我们就换条道。

为了绕过限制,我们盯上了动态家宽代理池和临时邮箱。这得感谢 Cloudflare 这位赛博大善人提供的邮箱托管服务——只需把自己的域名托管上去,就能零成本搞出域名邮箱,同时利用 Worker 跑个收发服务。

伪代码

# 1. 初始化纯底层协议会话
session = requests.Session(impersonate="chrome131")
session.headers.update(_build_client_hints(sec_ch_ua, full_version_list))

# 2. 授权入口,获取Device ID
oauth = generate_oauth_url()
session.get(oauth.auth_url) 
device_id = session.cookies.get("oai-did")

# 3. 自动发包注册
# 【阶段 A】提交注册邮箱
token_1 = build_sentinel_token(session, device_id, flow="authorize_continue")
session.post(".../authorize/continue", 
             headers={"openai-sentinel-token": token_1}, 
             data={'username': email})

# 【阶段 B】提交账户密码
token_2 = build_sentinel_token(session, device_id, flow="signup_password")
session.post(".../user/register", 
             headers={"openai-sentinel-token": token_2}, 
             data={'password': password})

# 【阶段 C】触发发信并秒填邮箱验证码
session.get(".../email-otp/send")
code = get_oai_code(dev_token, email) # 无模型物理提取
token_3 = build_sentinel_token(session, device_id, flow="email_otp_verification")
session.post(".../email-otp/validate", 
             headers={"openai-sentinel-token": token_3}, 
             data={'code': code})

# 【阶段 D】填充虚构名字与生日资料
token_4 = build_sentinel_token(session, device_id, flow="create_account")
session.post(".../create_account", 
             headers={"openai-sentinel-token": token_4}, 
             data={'name': "Alex Smith", 'birthdate': "1994-06-15"})

# 4. 协议层拦截重定向,手动拽取最终 Auth Code
# 这里模拟浏览器的一步步跳转,但绝不去渲染页面,只要协议头 Location!
url = continue_url
while True:
    resp = session.get(url, allow_redirects=False) # 必须禁用自动跳转
    next_url = resp.headers.get("Location")
    if "code=" in next_url:
        final_callback_url = next_url
        break
    url = next_url

# 5. 回交拦截到的数据
token_json = submit_callback_url(callback_url=final_callback_url)
print(token_json)

凛冬降临:401 与指纹追杀

就在大家都换上新装备,以为狂欢还能接着奏乐接着舞的时候,OpenAI 祭出了大杀器:过期打击

他们开始查底层特征了。注册 IP 和使用 IP 不一致?短期内请求指纹对不上?直接通过这些手段让 token 失效,满屏的 `401` 报错贴脸输出。

但封号永远没有我们注册得快,狂欢还在强行续命。

终极武器:物理直连的覆灭

为了应对愈发变态的风控,我们全面升级了注册机,抛弃纯 API,改用 Python + 原生 Playwright 搞物理直连流程。

为了彻底抹掉机器味,我们在指纹抹除上下了血本:

  1. 全面挂载 `playwright-stealth` 插件,启动即销毁特征源,把原本容易被识别的 `webdriver` 机器特征彻底抹平。
  2. 配合启动参数 `--disable-blink-features=AutomationControlled`,让浏览器的底层签名跟真人玩家无异。
  3. 挂载海外 ISP 住宅及纯净代理,强行保障注册网络环境的高质量。

伪代码

def intercept_callback(route, request):
    global final_code_url
    if "localhost/auth/callback" in request.url:
        final_code_url = request.url
        route.abort() 
    else:
        route.continue_()

# 1. 启动浏览器与防风控环境
browser = chromium.launch(proxy={"server": "IP:PORT", "username": "xxx", "password": "xxx"})
page = browser.new_page()
Stealth().apply_stealth_sync(page)
page.route("**/*", intercept_callback)

# 2. 自动化前台操作
page.goto(oauth_url)
page.fill("input[name='email']", email)
page.fill("input[name='password']", password)
page.keyboard.press("Enter")

# 3. 提取并填入验证码
code = poll_email_code(email) 
page.type("input.otp", code)

page.fill("input[name='fullname']", "Alex Smith")
page.keyboard.press("Enter")

# 4. 阻塞等待底层拦截结果
while not final_code_url:
    sleep(1)

# 5. 脱离浏览器,直接从底层换取 Token
token_json = exchange_token_via_http(final_code_url)
print(token_json)

我们以为这套高配物理连招天衣无缝。 但是现实很骨感——现在的结局是:封号还是一样的快,但是架不住我注册的快呀。