系列最後一篇,實戰部署 remotetools:申請 bot、填設定、跑起來、鎖白名單,最後用 NSSM 包成 Windows 服務讓它開機自動執行。(前情提要:專案介紹、底層邏輯)
前置需求
- Windows(其他平台也能跑,但防睡眠的
keep_awake.py只在 Windows 生效) - Python 3.10+
- 已安裝、PATH 找得到的
claudeCLI,且登入完成 - Telegram bot token 或 Discord bot token(下面說怎麼拿)
先把 repo 抓下來:
1 | git clone https://github.com/murmur-wu/claude_RemoteForWindows.git C:\claude\remotetools |
也可以從 GitHub Releases 下載打包好的 zip——每次 release 會附 -telegram、-discord、-services 三種部署包,不想裝 git 的話直接解壓即可。
路線一:Telegram
1. 申請 bot token
在 Telegram 找 @BotFather,送出 /newbot,照指示取名,拿到一串 token。
2. 設定 .env
1 | cd C:\claude\remotetools\telegram |
至少填這幾項:
1 | TELEGRAM_BOT_TOKEN=123456:ABC-DEF... |
PROJECTS 就是 bot 可以操作的 working directory 清單,格式是 名稱:路徑、分號分隔。
3. 啟動 + 鎖白名單
1 | .\start.ps1 |
第一次跑會自動建 .venv 並安裝套件。啟動後對 bot 傳任意訊息,console 會印:
1 | rejected message from chat_id=987654321 (not whitelisted) |
這就是白名單 fail-closed 的設計:名單空著時拒絕所有人。把那個數字填進 .env 的 ALLOWED_CHAT_IDS,重啟,完成。
路線二:Discord
Discord 流程類似,但多兩個必做設定,漏掉的話 bot「連得上但完全沒反應」:
- Developer Portal 建立 Application → Bot → 拿 token
- Bot → Privileged Gateway Intents → 打開 MESSAGE CONTENT INTENT——不開的話
message.content永遠是空字串,bot 看不到任何訊息內容 - OAuth2 → URL Generator:Scopes 勾
bot,Permissions 勾Send Messages+Read Message History,用產生的 URL 把 bot 邀進你的伺服器(或直接 DM 它)
1 | cd C:\claude\remotetools\discord |
白名單用的是 user id(ALLOWED_USER_IDS):Discord 設定 → Advanced → 開 Developer Mode → 對自己頭像右鍵 Copy User ID;或跟 Telegram 一樣先留空、看 rejection log。
安全檢查清單
上線前過一遍:
-
ALLOWED_CHAT_IDS/ALLOWED_USER_IDS已填,只有自己的 id -
PERMISSION_MODE理解過取捨:bypassPermissions(推薦,全放行、信任押在白名單)或auto(受~/.claude/settings.json的 allow/deny 表管制)。default和acceptEdits會讓 bot 卡死等一個沒人能回答的權限詢問 -
DAILY_MESSAGE_LIMIT(預設 100)和RATE_LIMIT_PER_MINUTE(預設 6)沒有關掉——它們保護的是你自己的 Claude Max 配額 -
.env(含 token)和state/sessions.json不會進版控(repo 已 gitignore,備份時記得加密)
服務化:開機自動跑
start.ps1 開著 PowerShell 視窗跑當然可以,但關掉視窗 bot 就死了。services/ 資料夾提供用 NSSM 包成 Windows 服務的腳本。
安裝步驟
- 從 nssm.cc/download 下載 win64 zip,把
nssm.exe丟進services\ - 確認兩個 bot 都各自跑過一次
start.ps1(.venv和.env要先就位) - 以系統管理員身分開 PowerShell:
1 | cd C:\claude\remotetools\services |
安裝時會跳出 Get-Credential 視窗——必須輸入你登入 Windows 的帳號密碼,不能用預設的 LocalSystem。原因:claude CLI 的認證存在 %USERPROFILE%\.claude\,SYSTEM 帳號的 profile 裡根本沒有這份認證,服務起得來但 claude 一律失敗。
裝完之後
註冊出兩個服務:ClaudeRemoteTelegram、ClaudeRemoteDiscord,特性:
- 開機自動啟動
- crash 後 5 秒自動重啟
- stdout/stderr 寫到
services\logs\<bot>.{out,err}.log,10MB 自動 rotate
日常操作:
1 | Get-Service ClaudeRemote* # 看狀態 |
常見坑
| 症狀 | 原因 |
|---|---|
| Discord bot 在線但不回應 | MESSAGE CONTENT INTENT 沒開,或在 guild channel 沒 @mention 它 |
| 每次任務都卡住不動 | PERMISSION_MODE 用了 default/acceptEdits,claude 在等沒人能回答的權限詢問 |
| 服務啟動但 claude 一直失敗 | 服務裝成 LocalSystem 了,重裝並輸入自己的 Windows 帳密 |
改了 .env 沒生效 |
服務模式要 Restart-Service |
| bot 回「已達今日上限」 | DAILY_MESSAGE_LIMIT 觸發——這是配額保護正常運作,隔天自動重置 |
到這裡整套系統就完成了:手機傳訊息 → 家裡電腦的 Claude Code 動起來 → 結果回到手機,電腦睡不著、bot 死了自己爬起來。系列三篇到此結束,回顧:專案介紹、底層邏輯。