一套用於研究 SSO 工作區推薦邀請流程的自動化工具,支援 OIDC SSO 系統整合,可一條命令完成全流程。
- 全自動流程:一條命令完成 母號建立 → 母號登入 → 發送邀請 → 子號登入 → 子號激活
- OIDC SSO 整合:支援自訂 OIDC SSO 系統,自動註冊與登入
- 並發處理:母號登入、邀請發送、子號登入均支援多執行緒並發
- 多種輸入格式:支援 CSV、JSON(物件陣列)、純文字(每行一個郵箱)
- 自動備份:邀請結果自動備份,避免覆蓋歷史記錄
- 代理支援:所有腳本的所有 HTTP 請求均走代理,且每支腳本都預設
http://127.0.0.1:7890(不傳--proxy也會走代理;用--proxy ""可停用)
- Python 3.8+
- 已部署的 OIDC SSO 系統(用於帳號註冊與登入)
- HTTP 代理(建議)
# 建立虛擬環境
python -m venv .venv
# 啟動虛擬環境
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
# 安裝依賴
pip install -r requirements.txtpython codex_referral_flow.py \
--auto-seeds 10 \
--seeds-invite-code JOIN-2026 \
--domain your-domain.com \
--per-account 5 \
--concurrency 10 \
--oidc-sso-url https://your-sso.example.com \
--oidc-sso-admin-token YOUR_ADMIN_TOKEN \
--oidc-sso-invite-code JOIN-2026這會自動:
- 在 SSO 系統建立 10 個母號
- 登入這 10 個母號到 OpenAI
- 每個母號發送 5 個邀請(共 50 個子號)
- 登入 50 個子號(自動在 SSO 註冊)
- 激活所有子號
PowerShell 使用反引號 ` 續行:
python codex_referral_flow.py `
--auto-seeds 10 `
--seeds-invite-code JOIN-2026 `
--domain your-domain.com `
--per-account 5 `
--concurrency 10 `
--oidc-sso-url https://your-sso.example.com `
--oidc-sso-admin-token YOUR_ADMIN_TOKEN `
--oidc-sso-invite-code JOIN-2026或寫成一行:
python codex_referral_flow.py --auto-seeds 10 --seeds-invite-code JOIN-2026 --domain your-domain.com --per-account 5 --concurrency 10 --oidc-sso-url https://your-sso.example.com --oidc-sso-admin-token YOUR_ADMIN_TOKEN --oidc-sso-invite-code JOIN-2026新用戶建議用「獨立輸出目錄 + 全程日誌落檔」的方式執行,這樣產物不會互相覆蓋,中斷後也能對照日誌接續。PowerShell:
cd C:\Projects\codex-referral-risk-research
# 用帶時間戳的獨立目錄,避免覆蓋舊產物
$ts = Get-Date -Format yyyyMMdd_HHmmss
$out = "runs\$ts"
python codex_referral_flow.py --auto-seeds 10 --seeds-invite-code JOIN-2026 --domain your-domain.com --per-account 5 --concurrency 10 --oidc-sso-url https://your-sso.example.com --oidc-sso-admin-token YOUR_ADMIN_TOKEN --oidc-sso-invite-code JOIN-2026 --proxy http://127.0.0.1:7890 --out-dir $out 2>&1 | Tee-Object -FilePath "$out\run.log"說明:
--out-dir $out:所有產物(憑證、邀請結果、子號清單)落在這個獨立目錄,下次重跑不會覆蓋。--proxy http://127.0.0.1:7890:本程式所有網絡操作都走 HTTP 代理(無驗證);代理沒開會導致全部請求失敗。Tee-Object:把完整執行過程同時印到螢幕並寫入$out\run.log,中斷後可查到斷在哪一步。$out是 PowerShell 變數,只在同一個視窗有效;換視窗請把$out改成實際路徑字串(例如runs\20260618_103000)。
注意:
Tee-Object要等程式結束才會寫完整 log。若中途強制關閉視窗,log 可能不完整,但$out下的產物檔(憑證、邀請結果)仍會逐步落檔保留。
| 步驟 | 說明 | 對應腳本 |
|---|---|---|
| 0 | 自動建立母號(在 SSO 系統註冊) | codex_referral_flow.py 內建 |
| 1 | 母號登入 OpenAI(透過 SSO OAuth) | codex_protocol_login.py |
| 2 | 母號發送邀請(生成隨機子號郵箱) | codex_invitation_batch.py |
| 3 | 子號登入(在 SSO 註冊 + OpenAI 建號) | codex_protocol_login.py |
| 4 | 子號激活(模擬 Codex 桌面端遙測) | codex_activation_batch.py |
| 參數 | 必填 | 說明 |
|---|---|---|
--auto-seeds N |
三選一 | 自動建立 N 個母號 |
--seeds FILE |
三選一 | 指定母號 JSON 文件 |
--use-existing-seeds |
三選一 | 使用已存在的母號(讀取 out-dir/auto_seeds.json) |
--seeds-invite-code |
條件 | 自動建立母號時使用的 SSO 邀請碼(--auto-seeds 時必填) |
--seeds-prefix |
否 | 母號帳號前綴,預設 seed |
--domain |
否 | 邀請郵箱域名,預設 dfhdg.store |
--per-account |
否 | 每個母號邀請的子號數量,預設 5 |
--concurrency |
否 | 並發數(同時執行的母號數量),預設 10 |
--out-dir |
否 | 輸出目錄,預設 ./runs/auto |
--proxy |
否 | HTTP 代理,預設 http://127.0.0.1:7890 |
--oidc-sso-url |
是 | OIDC SSO 伺服器 URL |
--oidc-sso-admin-token |
是 | SSO 系統的 ADMIN_TOKEN |
--oidc-sso-invite-code |
是 | 子號註冊時使用的 SSO 邀請碼 |
--skip-seeds-login |
否 | 跳過母號登入(假設已登入) |
--skip-invitations |
否 | 跳過發送邀請(假設已發送) |
--skip-activation |
否 | 跳過子號激活 |
--dry-run |
否 | 只預檢,不實際發送邀請 |
| 參數 | 說明 |
|---|---|
--email / --password |
單帳號登入 |
--csv FILE |
CSV 批量登入(格式:email,password) |
--json FILE |
JSON 批量登入(支援物件陣列、字串陣列、純文字) |
--out / --out-dir |
輸出路徑 |
--concurrency N |
並發數,預設 1 |
--retries N |
失敗重試次數,預設 2 |
--skip-existing |
跳過已存在的帳號 |
--proxy URL |
代理 URL,預設 http://127.0.0.1:7890 |
--oidc-sso-url |
SSO 伺服器 URL |
--oidc-sso-admin-token |
SSO ADMIN_TOKEN |
--oidc-sso-invite-code |
SSO 邀請碼(有則走 /api/register,無則走 /api/login) |
| 參數 | 說明 |
|---|---|
--auth-dir |
母號憑證目錄 |
--domain |
隨機郵箱域名,預設 dfhdg.store |
--per-account |
每個母號邀請數量,預設 5 |
--concurrency |
並發母號數,預設 5 |
--proxy |
代理 URL,預設 http://127.0.0.1:7890 |
--out |
結果輸出 JSON 路徑 |
--dry-run |
只預檢不發送 |
--save-back |
刷新 token 後寫回原文件 |
| 參數 | 說明 |
|---|---|
--auth-dir |
子號憑證目錄 |
--concurrency |
並發數,預設 5 |
--proxy |
代理 URL,預設 http://127.0.0.1:7890 |
--save-back |
刷新 token 後寫回原文件 |
python codex_referral_flow.py \
--auto-seeds 10 \
--seeds-invite-code JOIN-2026 \
--domain your-domain.com \
--per-account 5 \
--concurrency 10 \
--oidc-sso-url https://your-sso.example.com \
--oidc-sso-admin-token YOUR_ADMIN_TOKEN \
--oidc-sso-invite-code JOIN-2026python codex_referral_flow.py \
--use-existing-seeds \
--domain your-domain.com \
--per-account 5 \
--concurrency 10 \
--oidc-sso-url https://your-sso.example.com \
--oidc-sso-admin-token YOUR_ADMIN_TOKEN \
--oidc-sso-invite-code JOIN-2026 \
--skip-seeds-login \
--skip-invitationspython codex_referral_flow.py \
--seeds my_seeds.json \
--domain your-domain.com \
--per-account 5 \
--concurrency 10 \
--oidc-sso-url https://your-sso.example.com \
--oidc-sso-admin-token YOUR_ADMIN_TOKEN \
--oidc-sso-invite-code JOIN-2026# 母號登入(走 /api/login)
python codex_protocol_login.py \
--json seeds.json \
--out-dir ./seeds \
--concurrency 10 \
--oidc-sso-url https://your-sso.example.com \
--oidc-sso-admin-token YOUR_ADMIN_TOKEN
# 子號登入(走 /api/register,帶邀請碼)
python codex_protocol_login.py \
--json invitees.json \
--out-dir ./invitees \
--concurrency 10 \
--oidc-sso-url https://your-sso.example.com \
--oidc-sso-admin-token YOUR_ADMIN_TOKEN \
--oidc-sso-invite-code JOIN-2026全流程分四步,每步完成的產物都會落在 --out-dir 目錄。如果中途斷掉(網絡、代理、Ctrl+C 等),不需要從頭重來,用同一個 --out-dir 加上對應的 --skip-* 跳過已完成的步驟即可接續。
判斷斷在哪一步,看 --out-dir 下已經產生了哪些檔:
| 已存在的產物 | 代表已完成 | 續跑時加的參數 |
|---|---|---|
auto_seeds.json |
步驟 0 建母號 | --use-existing-seeds |
seeds/*.json |
步驟 1 母號登入 | --skip-seeds-login |
invite_results.json |
步驟 2 發送邀請 | --skip-invitations |
invitees/*.json |
步驟 3 子號登入 | (激活前已完成,可直接補激活) |
續跑一定要帶上原本那次的
--out-dir,否則讀不到先前的產物。PowerShell 同一視窗可直接用$out變數;換了視窗請填實際路徑字串。
跳過建號,從母號登入往後接續:
python codex_referral_flow.py --use-existing-seeds --seeds-invite-code JOIN-2026 --domain your-domain.com --per-account 5 --concurrency 10 --oidc-sso-url https://your-sso.example.com --oidc-sso-admin-token YOUR_ADMIN_TOKEN --oidc-sso-invite-code JOIN-2026 --proxy http://127.0.0.1:7890 --out-dir $out --skip-seeds-login 2>&1 | Tee-Object -FilePath "$out\run_resume.log" -Append只補「子號登入 + 激活」,不重發邀請:
python codex_referral_flow.py --use-existing-seeds --domain your-domain.com --concurrency 10 --oidc-sso-url https://your-sso.example.com --oidc-sso-admin-token YOUR_ADMIN_TOKEN --oidc-sso-invite-code JOIN-2026 --proxy http://127.0.0.1:7890 --out-dir $out --skip-seeds-login --skip-invitations 2>&1 | Tee-Object -FilePath "$out\run_resume.log" -Append直接單獨跑激活腳本,最省事:
python codex_activation_batch.py --auth-dir $out\invitees --concurrency 10 --save-back --proxy http://127.0.0.1:7890 2>&1 | Tee-Object -FilePath "$out\run_activate.log" -Append如果子號已經在 OpenAI / SSO 系統建好了(例如先前因 bug 中斷),只需重新拿 token 再激活,登入時不要帶 --oidc-sso-invite-code,這樣會走 /api/login(登入既有帳號),而不是 /api/register(重複註冊會失敗):
# 第 1 步:重新登入拿 token(走 /api/login)
python codex_protocol_login.py --json $out\invitees.txt --out-dir $out\invitees --concurrency 10 --oidc-sso-url https://your-sso.example.com --oidc-sso-admin-token YOUR_ADMIN_TOKEN --proxy http://127.0.0.1:7890
# 第 2 步:激活
python codex_activation_batch.py --auth-dir $out\invitees --concurrency 10 --save-back --proxy http://127.0.0.1:7890字串陣列(只有郵箱,密碼為空):
["alice@example.com", "bob@example.com", "charlie@example.com"]物件陣列(帶密碼):
[
{"email": "alice@example.com", "password": "optional"},
{"email": "bob@example.com", "password": "optional"}
]純文字(每行一個郵箱,.txt 或 .json 均可):
alice@example.com
bob@example.com
charlie@example.com
alice@example.com,password
bob@example.com,password本工具透過 OIDC 協議與自訂 SSO 系統整合:
- 母號登入:呼叫 SSO 的
/api/login,帳號必須已存在於 SSO 系統 - 子號登入:呼叫 SSO 的
/api/register(帶邀請碼),自動在 SSO 建立帳號 - 判斷邏輯:有
--oidc-sso-invite-code參數時走/api/register,無則走/api/login
你的 SSO 系統需要提供以下 API:
POST /api/login— 登入已有帳號POST /api/register— 註冊新帳號(需要邀請碼)
所有 API 需要 Authorization: Bearer <ADMIN_TOKEN> 認證。
runs/auto/
├── auto_seeds.json # 自動建立的母號帳號列表
├── seeds/ # 母號憑證(auth.json)
│ ├── seed_abc12345.json
│ └── seed_def67890.json
├── invite_results.json # 最新邀請結果
├── invite_results_20260115_*.json # 歷史邀請結果備份
├── invitees.txt # 被邀請的郵箱列表
└── invitees/ # 子號憑證(auth.json)
├── sfvm3ta6b0lf99zhoapf.json
└── 3y1or48la0x07sykisa3.json
--per-account:每個母號邀請多少個子號--concurrency:同時有多少個母號並發執行
例如 10 個母號、--per-account 5、--concurrency 10,會同時用 10 個母號各邀請 5 個子號,總共 50 個子號。
可以。--seeds-invite-code 用於建立母號,--oidc-sso-invite-code 用於註冊子號,兩者可以不同。
不會。每次發送邀請前,如果 invite_results.json 已存在,會自動備份為 invite_results_YYYYMMDD_HHMMSS.json。
所有腳本都預設走 http://127.0.0.1:7890(無驗證),不傳 --proxy 也會走代理,所以執行前請確認本機代理已開啟,否則所有網絡請求都會失敗。如果你的代理位址不同,用 --proxy 指定;如果不需要代理,用 --proxy "" 停用。
你的 SSO 系統需要是 OIDC 提供者,並在 OpenAI 後台配置為 Custom OIDC。SSO 的 ACCOUNT_DOMAIN 必須與 --domain 參數一致。
不用。每一步的產物都落在 --out-dir 目錄。看目錄下已經有哪些檔,判斷斷在哪一步,再用同一個 --out-dir 加對應的 --skip-* 接續即可。詳見〈中斷後如何續跑〉章節。
程式本身只把日誌印到螢幕,不自動寫檔。執行時在命令尾端加 2>&1 | Tee-Object -FilePath "$out\run.log"(PowerShell),即可同時顯示在螢幕並寫入 log 檔,方便中斷後排查斷點。
已存在的帳號要走 /api/login,不能再走 /api/register。重新登入時移除 --oidc-sso-invite-code 參數即可(有邀請碼才走註冊)。詳見〈已建好的子號要重新登入 + 激活〉。
| 腳本 | 用途 |
|---|---|
codex_referral_flow.py |
全自動流程(一條命令搞定) |
codex_protocol_login.py |
純 HTTP 協議登入(支援 SSO) |
codex_invitation_batch.py |
批量並發發送邀請 |
codex_invitation_helper.py |
單帳號邀請助手 |
codex_activation_batch.py |
批量並發激活子號 |
codex_activation_helper.py |
單帳號激活模擬器 |
codex_sso_login.py |
瀏覽器自動化登入(備用) |
sentinel.py |
Sentinel token 生成 |
運行時資料已從 git 排除,請勿提交以下內容:
- 帳號憑證文件(
auth.json) - access_token / refresh_token / id_token
- 帳號 ID
- 郵箱密碼 CSV 文件
- 邀請結果
- 本地日誌
.gitignore 已封鎖:accounts/、runs/、*.csv、*auth*.json、.venv/、*.log