Back to the feed

Verified by us: this deal no longer works.

100% of the community still says it works — but we checked, and it's dead.

检查自己的账户是否还有邀请用户获得重置卡的资格

#Chatgpt

先检查下,再确认是否要升级会员获得邀请吗 (已过期关闭)

The briefing

1. 在网页登录Chatgpt

2. 使用F12 控制台输入以下命令,查看资格。

(async () => {
  if (location.hostname !== "chatgpt.com") {
    throw new Error("请在 https://chatgpt.com 页面执行");
  }

const referralKey = "codex_referral_persistent_invite";

const sessionRes = await fetch("/api/auth/session", {
    credentials: "include",
    headers: { accept: "application/json" },
  });
  const session = await sessionRes.json();
  const token = session.accessToken;

if (!token) {
    throw new Error("无法获取 accessToken,请确认已登录 ChatGPT");
  }

async function api(path) {
    const res = await fetch(path, {
      method: "GET",
      credentials: "include",
      headers: {
        accept: "application/json",
        authorization: `Bearer ${token}`,
      },
    });

const text = await res.text();
    let data;
    try {
      data = JSON.parse(text);
    } catch {
      data = text.slice(0, 300);
    }

return { status: res.status, ok: res.ok, data };
  }

console.clear();
  console.log("%c正在检测 Codex 邀请资格...", "font-size:14px;font-weight:700;color:#2563eb;");

const [account, usage, rules, eligibility, resetCredits] = await Promise.all([
    api("/backend-api/wham/accounts/check"),
    api("/backend-api/wham/usage"),
    api(`/backend-api/wham/referrals/eligibility_rules?referral_key=${encodeURIComponent(referralKey)}`),
    api(`/backend-api/referrals/invite/eligibility?referral_key=${encodeURIComponent(referralKey)}`),
    api("/backend-api/wham/rate-limit-reset-credits"),
  ]);

const acct = account.data?.accounts?.[0] ?? {};
  const plan = usage.data?.plan_type ?? acct.plan_type ?? "unknown";
  const timeRule = rules.data?.time_frame_rules?.[0] ?? {};
  const sent = Number(timeRule.invites_sent ?? 0);
  const total = Number(timeRule.invites_total ?? 0);
  const remaining = Math.max(total - sent, 0);
  const shouldShow = eligibility.data?.should_show;

let verdict;
  let verdictColor;

if (remaining <= 0) {
    verdict = "当前周期邀请额度已用完。";
    verdictColor = "#dc2626";
  } else if (plan === "free") {
    verdict = "当前有邀请规则额度,但 Free 账号发送可能被 plan 拦截;升级 Plus/Pro 后可能解锁,但不能保证。";
    verdictColor = "#b45309";
  } else if (shouldShow === false) {
    verdict = "当前有额度,但前端 eligibility 不显示;可能被服务端活动/实验开关拦截。";
    verdictColor = "#b45309";
  } else {
    verdict = "当前账号大概率有邀请资格,可以尝试发送邀请。";
    verdictColor = "#047857";
  }

const summary = {
    plan_type: plan,
    reset_cards_available:
      usage.data?.rate_limit_reset_credits?.available_count ??
      resetCredits.data?.available_count ??
      "unknown",
    invites_sent: timeRule.invites_sent ?? "unknown",
    invites_total: timeRule.invites_total ?? "unknown",
    invite_remaining: remaining,
    time_frame: timeRule.time_frame ?? "unknown",
    eligibility_http: eligibility.status,
    should_show: typeof shouldShow === "boolean" ? shouldShow : "unknown",
    verdict,
  };

const rawSanitized = JSON.parse(JSON.stringify({
    account,
    usage,
    rules,
    eligibility,
    resetCredits,
  }, (k, v) => /token|secret|authorization|cookie|email|url|link|id/i.test(k) ? "[redacted]" : v));

const css = {
    title: "font-size:18px;font-weight:800;color:#111827;margin:6px 0;",
    verdict: `font-size:15px;font-weight:800;color:${verdictColor};`,
    label: "color:#6b7280;font-weight:700;",
    value: "color:#111827;font-weight:800;",
    muted: "color:#6b7280;",
    line: "color:#d1d5db;",
  };

console.log("%cCodex 邀请资格检测结果", css.title);
  console.log("%c%s", css.verdict, verdict);
  console.log("%c────────────────────────────────────", css.line);

console.log("%c当前套餐        %c%s", css.label, css.value, summary.plan_type);
  console.log("%c重置卡数量      %c%s", css.label, css.value, summary.reset_cards_available);
  console.log(
    "%c邀请额度        %c已用 %s / 总计 %s / 剩余 %s",
    css.label,
    css.value,
    summary.invites_sent,
    summary.invites_total,
    summary.invite_remaining
  );
  console.log("%c统计周期        %c%s", css.label, css.value, summary.time_frame);
  console.log("%cEligibility     %cHTTP %s", css.label, css.value, summary.eligibility_http);
  console.log("%c前端 should_show %c%s", css.label, css.value, summary.should_show);

console.log("%c────────────────────────────────────", css.line);
  console.log("%c结论说明", css.label);
  console.log(
    "%c%s",
    css.muted,
    "invite_remaining > 0 只代表规则额度未用完;真实能否发送还取决于 plan 和服务端 eligibility。"
  );

console.groupCollapsed("完整响应,已脱敏");
  console.dir(rawSanitized);
  console.groupEnd();

return summary;
})();

3. 使用F12 控制台输入以下命令,查看现在的邀请情况

(async () => {
  if (location.hostname !== "chatgpt.com") throw new Error("请在 https://chatgpt.com 执行");

const referralKey = "codex_referral_persistent_invite";
  const timeZone = "Asia/Shanghai";
  const privacyMode = true;

const session = await (await fetch("/api/auth/session", {
    credentials: "include",
    headers: { accept: "application/json" },
  })).json();

const token = session.accessToken;
  if (!token) throw new Error("无法获取 accessToken,请确认已登录 ChatGPT");

async function get(path) {
    const res = await fetch(path, {
      credentials: "include",
      headers: { accept: "application/json", authorization: `Bearer ${token}` },
    });
    const text = await res.text();
    let data;
    try { data = JSON.parse(text); } catch { data = text.slice(0, 300); }
    return { status: res.status, ok: res.ok, data };
  }

const [account, usage, rules, eligibility, resetCredits] = await Promise.all([
    get("/backend-api/wham/accounts/check"),
    get("/backend-api/wham/usage"),
    get(`/backend-api/wham/referrals/eligibility_rules?referral_key=${encodeURIComponent(referralKey)}`),
    get(`/backend-api/referrals/invite/eligibility?referral_key=${encodeURIComponent(referralKey)}`),
    get("/backend-api/wham/rate-limit-reset-credits"),
  ]);

const esc = (v) => String(v ?? "").replace(/[&<>"']/g, m => ({
    "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;"
  }[m]));

const mask = (s) => {
    s = String(s ?? "");
    if (!privacyMode) return s;
    return s
      .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, "[email]")
      .replace(/\b\d{7,}\b/g, v => `尾号 ${v.slice(-4)}`);
  };

const fmt = (iso) => iso ? new Intl.DateTimeFormat("zh-CN", {
    timeZone,
    year: "numeric", month: "2-digit", day: "2-digit",
    hour: "2-digit", minute: "2-digit", second: "2-digit",
    hour12: false,
  }).format(new Date(iso)).replace(/\//g, "-") : "";

const sourceOf = (c) => {
    const text = `${c.title ?? ""} ${c.description ?? ""}`.toLowerCase();
    if (/invite|referral|邀请/.test(text)) return mask(c.description || "邀请奖励");
    if (/codex team|free|official|官方/.test(text)) return "官方免费赠送";
    return mask(c.description || c.title || c.reset_type || "未知来源");
  };

const acct = account.data?.accounts?.[0] ?? {};
  const plan = usage.data?.plan_type ?? acct.plan_type ?? "unknown";
  const rule = rules.data?.time_frame_rules?.[0] ?? {};
  const sent = Number(rule.invites_sent ?? 0);
  const total = Number(rule.invites_total ?? 0);
  const remaining = Math.max(total - sent, 0);
  const shouldShow = eligibility.data?.should_show;

const summary = {
    plan,
    resetCards: usage.data?.rate_limit_reset_credits?.available_count ?? resetCredits.data?.available_count ?? "unknown",
    invitesSent: rule.invites_sent ?? "unknown",
    invitesTotal: rule.invites_total ?? "unknown",
    inviteRemaining: remaining,
    timeFrame: rule.time_frame ?? "unknown",
    eligibilityHttp: eligibility.status,
    shouldShow: typeof shouldShow === "boolean" ? shouldShow : "unknown",
  };

const rows = (resetCredits.data?.credits ?? []).map((c, i) => ({
    序号: i + 1,
    来源: sourceOf(c),
    状态: c.status ?? "",
    领取时间: fmt(c.granted_at),
    过期时间: fmt(c.expires_at),
  }));

const verdict =
    remaining <= 0 ? "当前周期邀请额度已用完"
    : plan === "free" ? "有规则额度,但 Free 可能被套餐拦截"
    : shouldShow === false ? "有规则额度,但前端 eligibility 不显示"
    : "大概率具备邀请资格";

document.getElementById("codex-invite-report")?.remove();
  const box = document.createElement("div");
  box.id = "codex-invite-report";
  box.style = "position:fixed;right:20px;top:20px;z-index:999999;width:760px;max-height:80vh;overflow:auto;background:#111827;color:#f9fafb;border:1px solid #374151;border-radius:10px;box-shadow:0 20px 50px #0008;font:14px system-ui;padding:18px;";
  box.innerHTML = `
    <div style="display:flex;justify-content:space-between;gap:12px;align-items:center">
      <div style="font-size:18px;font-weight:800">Codex 邀请资格详情</div>
      <button onclick="this.closest('#codex-invite-report').remove()" style="background:#374151;color:white;border:0;border-radius:6px;padding:6px 10px;cursor:pointer">关闭</button>
    </div>
    <div style="margin:10px 0 16px;color:${remaining > 0 && plan !== "free" && shouldShow !== false ? "#34d399" : "#fbbf24"};font-weight:800">${esc(verdict)}</div>
    <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:16px">
      ${[
        ["套餐", summary.plan],
        ["重置卡", summary.resetCards],
        ["邀请额度", `${summary.invitesSent}/${summary.invitesTotal}`],
        ["剩余邀请", summary.inviteRemaining],
        ["周期", summary.timeFrame],
        ["Eligibility", `HTTP ${summary.eligibilityHttp}`],
        ["should_show", summary.shouldShow],
      ].map(([k,v]) => `<div style="background:#1f2937;border-radius:8px;padding:10px"><div style="color:#9ca3af;font-size:12px">${esc(k)}</div><div style="font-weight:800;margin-top:4px">${esc(v)}</div></div>`).join("")}
    </div>
    <table style="width:100%;border-collapse:collapse">
      <thead><tr>${["序号","来源","状态","领取时间","过期时间"].map(h => `<th style="text-align:left;border-bottom:1px solid #374151;padding:8px;color:#d1d5db">${h}</th>`).join("")}</tr></thead>
      <tbody>${rows.map(r => `<tr>${Object.values(r).map(v => `<td style="border-bottom:1px solid #1f2937;padding:8px">${esc(v)}</td>`).join("")}</tr>`).join("")}</tbody>
    </table>
  `;
  document.body.appendChild(box);

console.log("Codex 邀请资格摘要:", summary);
  console.table(rows);
})();

—— 这条活动日期已过(截止日期记的是 2026-06-25),先关掉了。若后面官方又开,再单独更新。