🔐 Cloudflare API 疑難解答

2026-04-09 | Token + HTTP 400 雙問題彙整

📋 問題背景

執行 upload-html 部署時遭遇連續錯誤,經過多次診斷最終成功解決。

錯誤演變過程:
1. code: 9106 → Token 無效或未設置
2. code: 10000 → Account ID 錯誤(權限錯誤)
3. code: 8000007 → 專案不存在
4. HTTP 400 → API URL 格式錯誤(per_page 參數不支援)

🔍 根本原因分析

問題 原因 影響
Account ID 錯誤 使用了 Dashboard 顯示的舊帳號 ID Token 無法認證
環境變數未永久保存 只設定了 Session 變數 重開後設定遺失
專案名稱錯誤 建立了錯誤名稱的專案 部署到錯誤位置

💡 關鍵發現

⚠️ 最重要:Account ID 必須從 wrangler whoami 取得

Dashboard 顯示的 Account ID 可能是舊帳號或不同帳號,
必須使用 wrangler whoami 顯示的 ID 才是 Token 實際關聯的帳號。
# 正確查詢方式
$env:CLOUDFLARE_API_TOKEN = "你的Token"
wrangler whoami

# 輸出示例:
# 👋 You are logged in with an API Token.
# 🔓 Your Token ID: xxx
# 📧 Your Account: 2279623487@qq.com's Account
# 🏠 Your Account ID: 2f2795bc4a98928375b23c36140ba33b  ← 使用這個!

✅ 正確設置步驟(永久有效)

步驟 1:設置環境變數(永久)

# 設置 Token
[Environment]::SetEnvironmentVariable("CF_API_TOKEN", "cfat_xxxxxxxx", "User")

# 設置正確的 Account ID(從 wrangler whoami 取得)
[Environment]::SetEnvironmentVariable("CF_ACCOUNT_ID", "2f2795bc4a98928375b23c36140ba33b", "User")

步驟 2:部署命令

# 載入環境變量
$env:CLOUDFLARE_API_TOKEN = [Environment]::GetEnvironmentVariable("CF_API_TOKEN", "User")
$env:CLOUDFLARE_ACCOUNT_ID = [Environment]::GetEnvironmentVariable("CF_ACCOUNT_ID", "User")

# 執行部署
wrangler pages deploy . --project-name="aiworkforme"

❌ 常見錯誤對照表

錯誤碼 原因 解決方案
9106 Token 無效或未設置 檢查 CF_API_TOKEN 是否正確設置
10000 Account ID 錯誤 使用 wrangler whoami 的 ID
8000007 專案不存在 建立專案或檢查名稱
HTTP 400 API URL 包含不支援的參數 移除 ?per_page=50 參數

📝 主公目前的正確配置

  • Token:cfat_7Y1By...
  • Account ID:2f2795bc4a98928375b23c36140ba33b
  • 專案名稱:aiworkforme
  • 部署網址:https://3b5fa96e.aiworkforme.pages.dev

⚠️ 關鍵提醒

設置環境變數時必須使用 "User" 參數:

❌ 錯誤:[Environment]::SetEnvironmentVariable("CF_ACCOUNT_ID", "xxx")
✅ 正確:[Environment]::SetEnvironmentVariable("CF_ACCOUNT_ID", "xxx", "User")

缺少 "User" 參數只會設定 Session 變數,重開後會遺失!

❌ HTTP 400 Bad Request(API URL 格式問題)

錯誤現象:
使用 PowerShell Invoke-RestMethod 或 Node.js 調用 CF Pages API 時返回 400 錯誤, 但 Token 和 Account ID 都正確。

觸發條件

# ❌ 錯誤写法(PowerShell)
Invoke-RestMethod -Uri "https://api.cloudflare.com/client/v4/accounts/{id}/pages/projects?per_page=50"

# ❌ 錯誤写法(Node.js)
https.request('/client/v4/accounts/{id}/pages/projects?per_page=50', ...)

根本原因

⚠️ Cloudflare Pages API 不支援 per_page 查詢參數

這與大多數 REST API 不同,CF Pages API 的 /pages/projects endpoint 沒有分頁參數,直接返回所有專案。

解決方案

# ✅ 正確写法(PowerShell)
Invoke-RestMethod -Uri "https://api.cloudflare.com/client/v4/accounts/{id}/pages/projects"

# ✅ 正確写法(Node.js)
https.request('/client/v4/accounts/{id}/pages/projects', ...)
✅ Node.js 完整範例(推薦)
node -e "
const https = require('https');
const token = process.env.CF_API_TOKEN;
const accountId = '2f2795bc4a98928375b23c36140ba33b';
const options = {
  hostname: 'api.cloudflare.com',
  path: '/client/v4/accounts/' + accountId + '/pages/projects',
  method: 'GET',
  headers: {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
  }
};
https.request(options, r => {
  let d = '';
  r.on('data', c => d += c);
  r.on('end', () => {
    const j = JSON.parse(d);
    if (j.success) {
      console.log('專案數量:', j.result.length);
      j.result.forEach(p => console.log(p.name));
    } else {
      console.log('錯誤:', JSON.stringify(j));
    }
  });
}).end();
"
方法 per_page 參數 狀態
PowerShell Invoke-RestMethod ❌ 不支援 返回 400
Node.js https.request ❌ 不支援 返回 400
wrangler CLI 自動處理 ✅ 正常

📎 相關備忘

詳細問題分析與過程記錄:16 Token 錯誤解決