Jason's Base 數位生活實驗室
5 min read

Claude Code Telegram Bot 完整教學:不用 API Key,用 Claude Pro 訂閱直接部署

AI工具Claude CodeTelegram BotZeabur自動化資安
Claude Code Telegram Bot on Zeabur cloud deployment
目錄
  1. 為什麼用訂閱,不用 API Key?
  2. Claude Code Telegram Bot 架構總覽
  3. 第一步:申請 Telegram Bot Token
  4. 第二步:取得 OAuth 憑證
  5. 第三步:建立 Bot 程式碼
  6. 第四步:部署到 Zeabur
  7. 第五步:憑證複製到 Volume
  8. 常見錯誤排除
  9. 實測心得:能取代 OpenClaw 嗎?
  10. 資安注意事項
  11. 結語
  12. FAQ

支持創作

Buy Me a Coffee

推薦碼優惠

Zeabur 購買伺服器或 AI Hub 額度,享 10% 折扣

jason10%sale

每次跑完一個稍微複雜的專案,帳單一出來都讓人心跳加速。Claude API 按 token 計費,認真開發一週,費用很快就超過訂閱方案的好幾倍。更讓人惱的是,你可能已經訂了 Claude Pro,卻還要另外付一筆 API 費用——明明是同一家公司的服務。

這篇文章要教你用 Claude Pro 訂閱的 OAuth 憑證取代 API Key,把 Claude Code CLI 裝進 Docker 容器,部署到 Zeabur 雲端,打造一個 24 小時都能用的 Telegram Bot。不需要額外付 API 費用,手機上就能接續開發,還可以保留多輪對話記憶。

為什麼用訂閱,不用 API Key?

這個問題我自己也糾結過。API Key 的優點是彈性高,但當你認真跑專案,token 費用會跑得很快。以 claude-sonnet-4-6 為例,輸入 $3 / 1M tokens、輸出 $15 / 1M tokens,一個稍微複雜的 agentic 任務跑完,幾美元就沒了。如果每天都在用,一個月的 API 費用輕鬆超過 $100。

相比之下,Claude Pro 訂閱每月 $20,使用量上限每 4 小時重置一次。對於大多數個人開發者來說,這個額度完全夠用。更重要的是:訂閱已經付了,不拿來用就是浪費

方案月費用量限制適合情境
Claude API Key按量計費,$20–$100+無上限(錢到位)商業產品、高流量服務
Claude Pro 訂閱 + OAuth固定 $20每 4 小時重置個人開發、MVP、隨身助理

另一個讓我決定這麼做的原因是行動開發的彈性。以前在公司電腦才能跑 Claude Code,現在手機開 Telegram,隨時都能對 Bot 下指令、調整程式碼邏輯,不受工作環境限制。出門在外遇到客戶突然要求改東西,直接手機搞定。

Claude Code Telegram Bot 架構總覽

整個系統的資料流很直覺:你在 Telegram 傳訊息,Bot 收到後用 execFile 呼叫容器內的 claude --print,Claude Code CLI 帶著 OAuth 憑證去向 Anthropic 的服務器請求,回應後再透過 Telegram Bot API 傳回給你。

你的手機(Telegram)→ Telegram Bot API → Zeabur Container
→ execFile('claude', ['--print']) → OAuth 憑證(PVC Volume)
→ Anthropic API → 回應 → Telegram

部署前最讓我擔心的,就是 Claude Code CLI 本來是本地工具,不確定能不能裝進雲端容器。實測結果:完全可行。只要 npm install -g @anthropic-ai/claude-code 加上把憑證目錄掛進去,在容器裡執行 claude --print 和在本機上一樣正常運作。

第一步:申請 Telegram Bot Token

在 Telegram 搜尋 @BotFather,傳送 /newbot,依指示輸入 Bot 名稱與 username(必須以 bot 結尾)。BotFather 會回傳 Token,格式類似 7123456789:AAH...,這就是 TELEGRAM_BOT_TOKEN。另外搜尋 @userinfobot 取得你的 User ID,等一下設白名單用。

第二步:取得 OAuth 憑證

在本機安裝 Claude Code CLI 並完成 OAuth 登入:

npm install -g @anthropic-ai/claude-code
claude

選擇 Claude.ai(訂閱)驗證方式,瀏覽器授權後憑證會存在 ~/.claude/ 目錄下。這些憑證等一下要複製到 Zeabur 的 Volume。

第三步:建立 Bot 程式碼

mkdir telegram-claude-bot && cd telegram-claude-bot
npm init -y
npm install node-telegram-bot-api

建立 index.js,使用 CommonJS 格式(不可用 ESM import),透過 execFile 呼叫 claude --print

const TelegramBot = require('node-telegram-bot-api');
const { execFile } = require('child_process');

const bot = new TelegramBot(process.env.TELEGRAM_BOT_TOKEN, { polling: true });
const conversations = new Map();
const ALLOWED_IDS = process.env.ALLOWED_USER_IDS
  ? process.env.ALLOWED_USER_IDS.split(',').map(Number) : [];

function buildPrompt(history, msg) {
  if (!history.length) return msg;
  return '以下是對話歷史:
' + history.map(h => h.role + ': ' + h.content).join('
') + '

Human: ' + msg;
}

function askClaude(prompt) {
  return new Promise((resolve, reject) => {
    execFile('claude', ['--print', prompt], {
      env: { ...process.env, HOME: '/root' }, timeout: 120000, maxBuffer: 10485760
    }, (err, stdout, stderr) => {
      if (err) return reject(new Error(stderr || err.message));
      resolve(stdout.trim());
    });
  });
}

bot.on('message', async (msg) => {
  const chatId = msg.chat.id, userId = msg.from.id;
  const text = msg.text && msg.text.trim();
  if (!text) return;
  if (ALLOWED_IDS.length && !ALLOWED_IDS.includes(userId)) return bot.sendMessage(chatId, '無存取權限。');
  if (text === '/start') return bot.sendMessage(chatId, '你好!我是 Claude Bot。

/clear — 清除對話記憶');
  if (text === '/clear') { conversations.delete(userId); return bot.sendMessage(chatId, '對話記憶已清除。'); }
  const history = conversations.get(userId) || [];
  bot.sendChatAction(chatId, 'typing');
  try {
    const response = await askClaude(buildPrompt(history, text));
    history.push({ role: 'Human', content: text }, { role: 'Assistant', content: response });
    if (history.length > 20) history.splice(0, history.length - 20);
    conversations.set(userId, history);
    bot.sendMessage(chatId, response, { parse_mode: 'Markdown' }).catch(() => bot.sendMessage(chatId, response));
  } catch (err) { bot.sendMessage(chatId, '錯誤:' + err.message); }
});
console.log('Telegram Claude Bot 啟動中...');

第四步:部署到 Zeabur

建立 Dockerfileca-certificates 這行非常關鍵——node:20-slim 預設不含完整 CA 憑證,少了它會出現 AggregateError 連線失敗:

FROM node:20-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN npm install -g @anthropic-ai/claude-code
COPY package*.json ./
RUN npm install
COPY . .
ENV NODE_OPTIONS=--dns-result-order=ipv4first
CMD ["node", "index.js"]

推送到 GitHub,在 Zeabur Dashboard 建立 Git Service。完成後在環境變數分頁設定 TELEGRAM_BOT_TOKENALLOWED_USER_IDS,在硬碟分頁建立 Volume(硬碟 ID: claude-creds,掛載目錄: /root/.claude)。

🎁 在 zeabur.com 購買伺服器或 AI Hub 額度,結帳時輸入推薦碼 jason10%sale,即可享受 10% 折扣優惠~

第五步:憑證複製到 Volume

# 上傳憑證到 Zeabur 主機
ssh Zeabur "mkdir -p ~/.claude"
scp ~/.claude/.credentials.json Zeabur:~/.claude/.credentials.json
# 找 PVC 路徑
ssh Zeabur "sudo k3s kubectl get pvc -n "
# 複製到 PVC
ssh Zeabur "sudo cp ~/.claude/.credentials.json /var/lib/rancher/k3s/storage//.credentials.json"
# 重啟
ssh Zeabur "sudo k3s kubectl rollout restart deployment -n "

重啟後在 Telegram 傳訊息給 Bot,收到 Claude 正常回應即完成。

常見錯誤排除

錯誤訊息原因解法
ERR_MODULE_NOT_FOUND使用了 ESM import 語法改用 CommonJS require(),移除 “type”:”module”
AggregateError(輪詢失敗)node-telegram-bot-api 0.66 用舊版 @cypress/request,與 Node 20 不相容改用 telegraf v4(原生 fetch)
FetchError: ETIMEDOUTK3s 容器預設嘗試 IPv6,但 IPv6 路由不通Dockerfile 加入 ENV NODE_OPTIONS=--dns-result-order=ipv4first
Token not provided環境變數未設定Zeabur 環境變數分頁確認 TELEGRAM_BOT_TOKEN
claude auth 失敗憑證未複製到 Volume確認掛載路徑 /root/.claude,重新 cp

實測心得:能取代 OpenClaw 嗎?

在建這個 Bot 之前,我用的是 OpenClaw。它介面做得不錯,但換模型的穩定性很差,前後調整設定四次,每次換模型後行為就跑掉,花在排查的時間比實際使用還多。開發工具要用自己順手的,工具讓你感到卡頓效率直接減半。

Telegram 我每天都在用,介面熟悉,通知即時,對話記錄跨裝置同步。實際用下來,這個自建 Claude Code Telegram Bot 在臨時改需求、快速 MVP 發想、技術問題即時查詢這三個情境特別有用——每 4 小時重置後,手機立即接續,完全不受工作環境限制。

資安注意事項

菜刀給廚師是美味料理,給其他人可能是風險。

  • 白名單是必要的:ALLOWED_USER_IDS 一定要設,不設任何人都能消耗你的配額
  • Token 不要外洩:TELEGRAM_BOT_TOKEN 與 OAuth 憑證不要 commit 進 Git
  • 了解你在做什麼:OAuth 憑證代表你的帳號身份,需妥善保管
  • 個人用途為主:不適合開放給不特定多數人或商業轉售

結語

如果你已經訂了 Claude Pro,把它的能力延伸到 Telegram 是很自然的一步。部署一次之後,你就多了一個隨時隨地都能用的 Claude Code Telegram Bot,不用再受限於電腦前的開發環境。

如果你同時在用 Zeabur 架設 WordPress,也可以參考怎麼在 Zeabur 部署 WordPress,再讓 Claude Code 用 SSH 直接管理——相同的 Zeabur 環境,讓 Claude Code 透過 WP-CLI 操作整個 WordPress 站台。

步驟完成標誌
申請 Telegram Bot TokenBotFather 回傳 Token
本機完成 Claude OAuth 登入~/.claude/ 目錄有憑證
建立 index.js + Dockerfile本機可正常啟動
部署到 Zeabur + 設定環境變數Zeabur 顯示 Running
建立 Volume 並複製憑證Bot 正常回應

FAQ

Q1:用 Claude Pro 訂閱跑 Claude Code Telegram Bot 合法嗎?

以個人開發者自用為前提,屬於正常使用訂閱的範疇。Anthropic 條款禁止的是轉售或開放給不特定大眾。只要設白名單、僅供自己使用,並未違反條款。

Q2:Token 用量重置後 Claude Code Telegram Bot 會中斷嗎?

Bot 容器持續運行。達到上限時 claude –print 回傳錯誤,Bot 轉傳錯誤訊息。每 4 小時重置後自動恢復,不需重啟容器。

Q3:OAuth 憑證過期怎麼辦?

本機重新執行 claude 完成 OAuth,取得新憑證後 scp 上傳再 cp 到 Volume 即可,不需重新部署。

Q4:可以讓多人使用這個 Claude Code Telegram Bot 嗎?

技術上可以,多個 User ID 加進 ALLOWED_USER_IDS 即可。但共享同一訂閱額度,且依 Anthropic 條款,不可開放給不特定多數人。

Q5:和 Claude.ai 網頁版相比,Claude Code Telegram Bot 有什麼優勢?

Telegram 是原生 App,通知即時,對話跨裝置同步,可自訂指令,手機體驗遠優於網頁版。4 小時重置後手機立即接續,不受工作環境限制。

Q6:部署到 Zeabur 的費用是多少?

Bot idle 每月約 $1–3 美元,加上 Claude Pro $20,整體約 $21–23 美元,遠低於 API Key 費用。

延伸閱讀:如果你對 Claude Code 的 Command、Skills 與 Agent 架構還不太熟悉,建議先閱讀:Claude Code 新手完全指南:Agent、Skills 與 Command 的關係與用法


參考來源

Written by
jason wang

在台北玩 AI、寫程式、做設計。 這裡記錄我踩過的坑、用過的工具,以及偶爾的碎念。

留下你的留言