惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The GitHub Blog
The GitHub Blog
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
腾讯CDC
博客园 - 聂微东
The Cloudflare Blog
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
Last Week in AI
Last Week in AI
B
Blog

LINUX DO - 最新话题

谷歌云盘下载700g数据集,求方法 OpenAI推出了100美元的Pro订阅后,plus的Codex 5小时限额大幅缩水 之前买的super grok居然还没掉 关于CPA认证文件周限 佬们,默认CDK的要求是什么等级啊? 最新版本的微信群聊机器人方案 有没有人知道如何free号没有封,那么是否可以循环使用,因为我看主要是周限 L站改版了?吓我一跳,我以为我浏览器崩了 淘宝这种宽带可信吗,500兆移动宽带月费8元到2099年 docker内部应用访问宿主机mysql和redis时被拒绝connection refuse Erp全栈想转行做Ai有什么推荐的吗 boost有bug 佬们,有没有靠谱点的 Plus 购买渠道 大妈,狗妈用的 lg 服务有源头开源项目吗? 有人有能过验证码打码的嘛 上次帖里好像发过通过大模型来打码的 gpt plus 封号似乎也太快了点,一天就给封号了 按流量/token收费的国产官方AI推荐 我算是知道了为什么Oracle总是ABC了 佬友们帮我分析一下 ChatGPT Team账号只有一个人使用和4个席位邀请满了使用的总额度是一样的吗? gpt-free 10个带rt CPA反代claude是默认1m吗? 我终于敢说我做出来windows上tmux的替代了,目标windows/全平台最强的终端Ai编程工具 claude pro升级max,除了原来的$20,好像还能再领一次$100 关于AI agent的知识框架 独乐乐不如众乐乐,分享一下我的的AI对话程序 佬们自建网站支付问题是怎么解决的 怎么能让gpt模仿claude风格输出 codex free已经死了,下一个会是plus或者team吗 请问chatgpt pro里的fast模式,速度快了,降智吗
sharedchat 公益站 领取权益浏览器总是失败的问题,解决方案
notochen (藏柏) · 2026-06-16 · via LINUX DO - 最新话题

直接贴代码了,懒得搞个文件上传了,ai vibe 的,使用的话,可以让 ai 帮你看看怎么用

比如 SHAREDCHAT_USERNAME=(你的 qq 邮箱) SHAREDCHAT_PASSWORD=(你的密码)
xxx.sh 就可以了

需要 node ,npm 环境,本质就是给你打开一个浏览器,其他的都会自动处理的,已经领取过的也会提示已领取,自用了几天了,没什么太大问题

#!/usr/bin/env bash
set -euo pipefail

BASE_URL="${SHAREDCHAT_BASE_URL:-https://new.sharedchat.cc}"
USERNAME="${SHAREDCHAT_USERNAME}"
PASSWORD="${SHAREDCHAT_PASSWORD}"
REASON="${SHAREDCHAT_REASON:-用于开发个人项目,学习code的使用 $(date +%s)}"
HEADLESS="${HEADLESS:-1}"
PLAYWRIGHT_VERSION="${PLAYWRIGHT_VERSION:-1.60.0}"
WORK_DIR="${SHAREDCHAT_WORK_DIR:-${TMPDIR:-/tmp}/sharedchat-codex-claim}"

if [[ -z "$PASSWORD" ]]; then
  printf "SharedChat password: " >&2
  IFS= read -rs PASSWORD
  printf "\n" >&2
fi

if [[ -z "$PASSWORD" ]]; then
  echo "Password is required. Set SHAREDCHAT_PASSWORD or enter it at the prompt." >&2
  exit 2
fi

if ! command -v node >/dev/null 2>&1; then
  echo "node is required." >&2
  exit 2
fi

if ! command -v npm >/dev/null 2>&1; then
  echo "npm is required to install playwright-core." >&2
  exit 2
fi

if [[ -z "${CHROME_PATH:-}" ]]; then
  for candidate in \
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    "/Applications/Chromium.app/Contents/MacOS/Chromium" \
    "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"; do
    if [[ -x "$candidate" ]]; then
      CHROME_PATH="$candidate"
      break
    fi
  done
fi

if [[ -z "${CHROME_PATH:-}" || ! -x "$CHROME_PATH" ]]; then
  echo "Chrome was not found. Set CHROME_PATH to your Chrome executable." >&2
  exit 2
fi

mkdir -p "$WORK_DIR"
cd "$WORK_DIR"

if [[ ! -d node_modules/playwright-core ]]; then
  npm init -y >/dev/null
  npm install "playwright-core@$PLAYWRIGHT_VERSION" >/dev/null
fi

export BASE_URL USERNAME PASSWORD REASON HEADLESS CHROME_PATH

node <<'NODE'
const { chromium } = require('playwright-core');

const baseUrl = process.env.BASE_URL;
const username = process.env.USERNAME;
const password = process.env.PASSWORD;
const reason = process.env.REASON;
const chromePath = process.env.CHROME_PATH;
const headless = process.env.HEADLESS === '1';

function pickCodexQuota(payload) {
  return payload?.data?.codex || null;
}

async function readJsonResponse(response) {
  try {
    return JSON.parse(await response.text());
  } catch {
    return null;
  }
}

(async () => {
  const browser = await chromium.launch({
    executablePath: chromePath,
    headless,
    args: [
      '--disable-blink-features=AutomationControlled',
      '--no-first-run',
      '--no-default-browser-check',
    ],
  });

  const context = await browser.newContext({
    locale: 'zh-CN',
    timezoneId: 'Asia/Shanghai',
    viewport: { width: 1280, height: 900 },
  });

  await context.addInitScript(() => {
    Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
  });

  const page = await context.newPage();

  try {
    await page.goto(`${baseUrl}/list/#/login`, { waitUntil: 'domcontentloaded' });
    await page.waitForLoadState('networkidle', { timeout: 30000 }).catch(() => {});

    const inputs = page.locator('input');
    await inputs.nth(0).fill(username);
    await inputs.nth(1).fill(password);
    await page.locator('button.submit-btn').first().click();

    await page.waitForResponse(
      (response) => response.url().includes('/frontend-api/getme') && response.status() === 200,
      { timeout: 30000 }
    );

    await page.goto(`${baseUrl}/list/#/vibe-code/dashboard`, { waitUntil: 'domcontentloaded' });
    const quotaResponse = await page.waitForResponse(
      (response) =>
        response.url().includes('/frontend-api/vibe-code/quota') && response.status() === 200,
      { timeout: 30000 }
    );
    const quotaPayload = await readJsonResponse(quotaResponse);
    const codex = pickCodexQuota(quotaPayload);
    const sub = codex?.subscriptions || null;

    if (sub?.isActive) {
      console.log(
        JSON.stringify(
          {
            ok: true,
            status: 'already_active',
            message: 'Codex subscription is already active.',
            expireTime: sub.expireTime,
            remainingAmount: sub.remainingAmount,
          },
          null,
          2
        )
      );
      return;
    }

    const claimButton = page
      .getByRole('button', { name: /领取\s*Codex\s*权益|Claim\s*Codex\s*Access/i })
      .first();
    await claimButton.waitFor({ state: 'visible', timeout: 30000 });
    await claimButton.click();

    const textarea = page.locator('textarea').last();
    await textarea.waitFor({ state: 'visible', timeout: 10000 });
    await textarea.fill(reason);

    const claimResponsePromise = page.waitForResponse(
      (response) => response.url().includes('/frontend-api/vibe-code/codex/claim'),
      { timeout: 60000 }
    );
    await page.getByRole('button', { name: /^领取$|^Claim$/i }).click();
    const claimResponse = await claimResponsePromise;
    const claimPayload = await readJsonResponse(claimResponse);
    const data = claimPayload?.data || {};

    if (!data.claimed) {
      console.log(
        JSON.stringify(
          {
            ok: false,
            status: 'claim_failed',
            message: data.message || claimPayload?.msg || 'Claim failed.',
            response: claimPayload,
          },
          null,
          2
        )
      );
      process.exitCode = 1;
      return;
    }

    console.log(
      JSON.stringify(
        {
          ok: true,
          status: 'claimed',
          message: data.message || 'Claim succeeded.',
          subscriptionId: data.subscriptionId,
          expireTime: data.expireTime,
        },
        null,
        2
      )
    );
  } finally {
    await browser.close();
  }
})().catch((error) => {
  console.error(JSON.stringify({ ok: false, status: 'error', message: String(error) }, null, 2));
  process.exit(1);
});
NODE