顯示具有 樹莓派 標籤的文章。 顯示所有文章
顯示具有 樹莓派 標籤的文章。 顯示所有文章

2026年9月6日 星期日

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (五)

在前一篇測試中, 我已將 Gateway 從預設的只監聽本機 127.0.0.1 (localhost) 存取改為綁定到所有網路介面 (網址 0.0.0.0), 這樣可讓區網內其他主機也可存取 Web UI 主控台頁面. 本篇則是要用 ngrok 來取得 HTTPS 網址並綁定 18789 埠, 讓外網也可以存取 Web UI 主控台. 

本系列全部測試文章索引參考 :


在前面的第二篇測試中, 我已在 Pi 4 上安裝好 Ngrok, 用 Yahoo 信箱註冊了一個新帳號後取得認證金鑰, 然後用此金鑰將 Ngrok 綁定到此新帳號, 參考 :


首先檢查 Ngrok 版本 : 

pi@pi4b:~ $ ngrok --version  
ngrok version 3.39.10

然後下 ngrok http 18789 :

pi@pi4b:~ $ ngrok http 18789   

這樣 Ngrok 會為 OpenClaw 的 Gateway 建立一個 https://xxxx.ngrok-free.app 網址, 並綁定到 http://127.0.0.1:18789 本機網址 :




複製此網址到外網主機 (例如我的 LG Gram 筆電) 的瀏覽器網址列貼上, 就會連線到 Pi 4 的 OpenClaw 的 Web UI 頁面 :




但是底下出現 "瀏覽器來源不允許" 訊息, 即使貼上 OpenClaw 設定檔 openclaw.json 中的 token 到 "網關令牌" 欄後按 "連接" 鈕還是一樣 : 




我問 Gemini, 原來跟前一篇區網網址存取一樣, 是被 OpenClaw 設定檔預設的安全限制阻擋了, 用 nano 開啟 openclaw.json 設定檔 : 

pi@pi4b:~ $ nano ~/.openclaw/openclaw.json  

在 gateway 屬性中加入子屬性 controlUi, 並在其孫屬性 allowedOrigins 中填入 ngrok 網址 :

"controlUi": {
      "allowedOrigins": [
        "https://starxxx-yyyyy-zzzzzzz.ngrok-free.dev"
      ]
    },




按 Ctrl + O 存檔再按 Ctrl + X 離開 nano 後重啟 OpenClaw 的 Gateway 服務 :

pi@pi4b:~ $ systemctl --user restart openclaw-gateway.service   

重新整理外網瀏覽器的 Web UI 網頁還是一樣顯示 "瀏覽器來源不允許", 用 下列指令檢視設定檔, 發現剛剛用 nano 編輯設定檔所新增的屬性根本沒把網址寫進去 : 

pi@pi4b:~ $ openclaw config get gateway   

OpenClaw 2026.7.1-2 (0790d9f)
I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.

{
  "port": 18789,
  "mode": "local",
  "bind": "lan",
  "controlUi": {
    "allowInsecureAuth": true
  },
  "auth": {
    "mode": "token",
    "token": "__OPENCLAW_REDACTED__"
  },
  "tailscale": {
    "mode": "off",
    "resetOnExit": false
  },
  "nodes": {
    "denyCommands": [
      "camera.snap",
      "camera.clip",
      "screen.record",
      "contacts.add",
      "calendar.add",
      "reminders.add",
      "sms.send",
      "sms.search"
    ]
  }
}

Gemini 建議用下列指令直接修改設定檔, 不要用 nano 去編輯 :

pi@pi4b:~ $ openclaw config set gateway.controlUi.allowedOrigins '["https://starxxx-yyyyy-zzzzzzz.ngrok-free.dev"]'   
◇  

OpenClaw 2026.7.1-2 (0790d9f) — Half butler, half debugger, full crustacean.

Updated gateway.controlUi.allowedOrigins. Restart the gateway to apply.

再次用 openclaw config get gateway 指令檢視設定檔 :

pi@pi4b:~ $ openclaw config get gateway   

OpenClaw 2026.7.1-2 (0790d9f) — Hot reload for config, cold sweat for deploys.

{
  "port": 18789,
  "mode": "local",
  "bind": "lan",
  "controlUi": {
    "allowedOrigins": [
      "https://starxxx-yyyyy-zzzzzzz.ngrok-free.dev"
    ],
    "allowInsecureAuth": true
  },
  "auth": {
    "mode": "token",
    "token": "__OPENCLAW_REDACTED__"
  },
  "tailscale": {
    "mode": "off",
    "resetOnExit": false
  },
  "nodes": {
    "denyCommands": [
      "camera.snap",
      "camera.clip",
      "screen.record",
      "contacts.add",
      "calendar.add",
      "reminders.add",
      "sms.send",
      "sms.search"
    ]
  }
}

這樣便確認網址已經寫進去了, 重啟 OpenClaw 的 Gateway 服務 :

pi@pi4b:~ $ systemctl --user restart openclaw-gateway.service   

按外網瀏覽器 Web UI 網頁中的連接鈕, 這回 "瀏覽器來源不允許" 就消失了, 變成 "需要裝置配對" : 




複製底下 2 中的配對指令貼到終端機執行配對 : 

pi@pi4b:~ $ openclaw devices approve d9dd91cf-abec-4e3c-bdc5-6f39644361e9
◇  

OpenClaw 2026.7.1-2 (0790d9f) — Hot reload for config, cold sweat for deploys.

◇  
◇  
Approved e99ee4c23140e1e4649ec8bd11507aae08c70a68c499270439986d244803fbc5 (d9dd91cf-abec-4e3c-bdc5-6f39644361e9)

顯示 Approved 表示配對成功, 回到 Web UI 頁面, 再次按連接鈕就可以順利顯示 Web UI 控制台頁面了 :




但是要注意的是, 樹莓派中綁定 Ngrok 到 18789 埠的終端機視窗不可以關閉, 也不可以按 Ctrl+C 跳出綁定, 否則所建立的通道會被拆除而無法從外網存取, 再次綁定所建立的 https 網址會變更 (除非你付費), 需修改 OpenClaw 設定檔並再次重啟 Gateway 服務配對. 

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (四)

在前一篇測試中我已完成 OpenClaw 初始化 (Onboarding), 主要是設定好語言模型 (選擇 GTP 5.6) 後用瀏覽器透過 Web UI 介面順利連線 Gateway. 但是 OpenClaw 預設只綁定 127.0.0.0 (localhost) 網址, 僅能本機瀏覽, 如果使用本機的內網 IP (192.168.xxx.xxx) 會顯示無法連線, 本篇將更改設定, 綁定 Gateway 到所有網路介面 (網址 0.0.0.0), 讓區網內其他主機也可存取 Web UI 主控台頁面.

本系列全部測試文章索引參考 :



首先用下列指令過濾出樹莓派 Pi 4 在區網的 IP :

pi@pi4b:~ $ hostname -I | awk '{print $1}'   
192.168.1.111

然後開啟 Pi 4 瀏覽器用此網址訪問 Gateway 會看到 "無法連上這個網站" :




這是因為 OpenClaw 預設只監聽本機 loopback 位址 (127.0.0.1/localhost), 沒有對外綁定到所有網路介面 (0.0.0.0), 可用下列指令確認 : 

pi@pi4b:~ $ ss -tulpn | grep 18789  
tcp   LISTEN 0      511        127.0.0.1:18789      0.0.0.0:*    users:(("MainThread",pid=829,fd=32))
tcp   LISTEN 0      511            [::1]:18789         [::]:*    users:(("MainThread",pid=829,fd=33))

輸出顯示 127.0.0.1:18789 表示 Gateway 目前只對本機開放, 外部或實體 IP 無法存取. 當服務只監聽 127.0.0.1 時, 任何透過實體 IP  (192.168.1.111) 進來的封包, Linux 核心都會直接拒絕連線.

要讓區網內其它主機可以存取 OpenClaw 的作法有兩個, 採用任何一個都可以, 但它們的層級不同, 標準作法是兩個都做, 這樣有雙重保障作用 :


1. 修改 OpenClaw 設定檔 :

修改 OpenClaw 設定檔決定了程式預設的內部行為. 

先檢視 openclaw 資料夾下的檔案列表 : 

pi@pi4b:~ $ ls -ls ~/.openclaw   
總用量 68
4 drwxr-xr-x 3 pi pi 4096  8月 25 14:58 agents
4 drwxr-xr-x 2 pi pi 4096  8月 25 14:59 audit
4 drwxr-xr-x 4 pi pi 4096  8月 27 19:24 crestodian
4 drwxr-xr-x 2 pi pi 4096  9月  5 01:45 devices
4 -rw------- 1 pi pi  143  8月 25 14:58 exec-approvals.json
4 drwx------ 2 pi pi 4096  8月 25 14:59 identity
4 drwx------ 2 pi pi 4096  8月 25 14:58 logs
4 drwxr-xr-x 3 pi pi 4096  8月 25 17:52 npm
4 -rw------- 1 pi pi 1455  8月 25 18:07 openclaw.json
4 -rw------- 1 pi pi 1079  8月 25 18:07 openclaw.json.bak
4 -rw------- 1 pi pi 1455  9月  5 01:39 openclaw.json.last-good
4 drwxr-xr-x 2 pi pi 4096  8月 27 19:24 plugin-skills
4 drwxr-xr-x 3 pi pi 4096  8月 25 15:04 skill-workshop
4 drwx------ 2 pi pi 4096  9月  5 01:39 state
4 drwx------ 2 pi pi 4096  8月 25 18:07 tui
4 drwx------ 3 pi pi 4096  8月 25 14:58 workspace
4 drwxr-xr-x 2 pi pi 4096  8月 25 14:58 workspace-attestations

OpenClaw 的設定檔為 openclaw.json, 用 nano 開啟它後, 找到 gateway 屬性底下的子屬性 bind, 將其預設值 loopback 改為 lan, 按 Ctrl + O 存檔再按 Ctrl + X 離開 nano 即可 : 




預設的 "bind": "loopback" 會將 host 限制在 127.0.0.1 (即 localhost), 改成 "bind": "lan" 就是將 host 開放為 0.0.0.0 (允許區域網路內所有 IP 存取). 


2. 修改 systemd 服務啟動參數 :

啟動服務 systemd 的命令列參數權限高於上面 OpenClaw 的設定檔 (CLI flag overrides config), 即使 OpenClaw 設定檔被重設或誤動, systemd 常駐服務依然會將 Gateway 強制綁定在區網介面上. 用 nano 編輯 systemd 服務檔 : 

pi@pi4b:~ $ nano ~/.config/systemd/user/openclaw-gateway.service  

找到 ExecStart 這一行, 在末尾加上 --bind lan :





按 Ctrl + O 存檔再按 Ctrl + X 離開 nano 後, 重載 systemd 服務設定並重啟 Gateway : 

pi@pi4b:~ $ systemctl --user daemon-reload   
pi@pi4b:~ $ systemctl --user restart openclaw-gateway.service

再次驗證監聽位址 : 

pi@pi4b:~ $ ss -tulpn | grep 18789   
tcp   LISTEN 0      511          0.0.0.0:18789      0.0.0.0:*    users:(("MainThread",pid=1683315,fd=32))

可知 Gateway 監聽位址已變更為 0.0.0.0:18789, 這時重新整理樹莓瀏覽器 (或用區網其它主機瀏覽器) 就可順利用 http://192.168.1.111:18789 存取 OpenClaw 的 Web UI 了 : 




但我在網關令牌欄位貼上 openclaw.json 設定檔中的 token 後卻無法連線 OpenClaw :





詢問 Gemini, 原來 OpenClaw 的 Gateway 本身沒有提供關閉安全上下文校驗的 CLI 旗標, 這是刻意設計的硬性安全防護, Web UI 產生裝置金鑰必須依賴瀏覽器的 Crypto Subsystem, 而非 HTTPS 或非 localhost 環境下該 API 會被瀏覽器直接鎖死. 

最快且免架設反向代理 (HTTPS 憑證) 的解決方案在瀏覽器將該 IP 列入白名單, 在 Chrome 網址列輸入並開啟下列網址 : 

chrome://flags/#unsafely-treat-insecure-origin-as-secure

找到 Insecure origins treated as secure, 勾選右邊選單為 "已啟動", 在底下欄位輸入 http://192.168.1.111:18789 後按右下角的 "重新啟動" 鈕 :





這時回 Web UI 網頁按連接鈕, 底下不再是無法連線, 而是需要配對 :




複製底下 2 中的配對指令貼到終端機執行配對 : 

pi@pi4b:~ $ openclaw devices approve 797a2bd2-d650-4fe2-993d-af6aa93229c0   
◇  

OpenClaw 2026.7.1-2 (0790d9f) — Self-hosted, self-updating, self-aware (just kidding... unless?).

◇  
◇  
Approved 3af89ec715dfe4d2fffeb70c6ae3df44d802893ecdec8fe71d573455d081a1db (797a2bd2-d650-4fe2-993d-af6aa93229c0)

看見 Approved 表示配對成功, 回到 Web UI 頁面, 再次按連接鈕就可以順利顯示 Web UI 控制台頁面了 :




2026年9月5日 星期六

樹莓派學習筆記 : VNC Viewer 剪貼簿失效問題

最近使用 VNC Connect 遠端連線樹莓派桌面時偶而會發生無法從 PC 正常貼指令到樹莓派, 只好人工輸入指令, 若指令很長就會非常困擾. 我詢問 Gemini 此問題之原因, 它要我檢查 Wayland 是否有設為 X11, 這在系統設定時就已經設好啦! 其次可能是 X11 剪貼簿所有權機制 (Selection Ownership) 被搶奪, 建議安裝 autocutsel 套件讓它在背景常駐是一勞永逸的辦法 :

先更新套件清單再用 apt install 安裝 :

pi@pi4b:~ $ sudo apt update && sudo apt install -y autocutsel   
已有:1 http://deb.debian.org/debian bookworm InRelease                                                   
已有:2 http://deb.debian.org/debian-security bookworm-security InRelease                                 
下載:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]                             
已有:4 https://ngrok-agent.s3.amazonaws.com buster InRelease                                             
下載:5 http://archive.raspberrypi.com/debian bookworm InRelease [55.0 kB]                                
下載:6 http://archive.raspberrypi.com/debian bookworm/main arm64 Packages [581 kB]
下載:7 http://archive.raspberrypi.com/debian bookworm/main armhf Packages [582 kB]                       
取得 1,273 kB 用了 28s (45.7 kB/s)                                                                       
正在讀取套件清單... 完成
正在重建相依關係... 完成
正在讀取狀態資料... 完成  
238 packages can be upgraded. Run 'apt list --upgradable' to see them.
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
下列【新】套件將會被安裝:
  autocutsel
升級 0 個,新安裝 1 個,移除 0 個,有 238 個未被升級。
需要下載 16.3 kB 的套件檔。
此操作完成之後,會多佔用 62.5 kB 的磁碟空間。
下載:1 http://deb.debian.org/debian bookworm/main arm64 autocutsel arm64 0.10.1-1 [16.3 kB]
取得 16.3 kB 用了 1s (13.9 kB/s)
選取了原先未選的套件 autocutsel。
(讀取資料庫 ... 目前共安裝了 131154 個檔案和目錄。)
正在準備解包 .../autocutsel_0.10.1-1_arm64.deb……
Unpacking autocutsel (0.10.1-1) ...
設定 autocutsel (0.10.1-1) ...
執行 man-db (2.11.2-2) 的觸發程式……

安裝完後將其加入開機自啟動, 作法如下 : 

pi@pi4b:~ $ mkdir -p ~/.config/autostart   
pi@pi4b:~ $ nano ~/.config/autostart/autocutsel.desktop

貼入下列內容 : 

[Desktop Entry]
Type=Application
Exec=sh -c "autocutsel -fork -selection CLIPBOARD && autocutsel -fork -selection PRIMARY"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=AutoCutSel

按 Ctrl+O 存檔後按 Ctrl+X 跳出 nano 即可, 這樣每次開機就會自動維持剪貼簿通道暢通. 

2026年8月28日 星期五

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (三)

在前面的測試中, 我已在 Pi 4 中安裝好 OpenClaw 與 Ngrok, 接下來就可以啟動 OpenClaw 進行 Onboading 初始設定了. 本系列全部測試文章索引參考 :



1. 取得 LLM 的 API 金鑰 :

由於本地的 AI 代理幾乎都使用 CUDA 函式庫進行推理, 但 CUDA 並未支援樹莓派的 GPU (僅支援 Nvidia 的 GPU), 只能依賴 CPU 推理, 但那速度非常慢且只能使用量化小模型, 因此在樹莓派上跑 OpenClaw 必須仰賴雲端 LLM. 

連線雲端大模型可以使用 OAuth 授權與 API key 連線兩種方式. 前者是以網頁登入訂閱方案的方式來使用模型, 用量會計入方案的額度; API Key 則是按 token 使用量計費, 與訂閱方案無關, 適合無訂閱方案者使用. 因 OAuth 授權並非永久有效, 通常每 10 天須重新驗證, 若因 OpenClaw 頻繁呼叫 LLM 被認為違反平台使用條款而使帳號被停用, 以 Gemini 來說會連帶無法存取整個 Google 服務, 因此還是以 API key 連接較為妥當. 

為了避免與測試用的金鑰混用, 我新建了專用於 OpenClaw 的 Gemini 與 OpenAI API key :


(1). 建立 Gemini API Key :

Gemini API Key 可在 Google AI Studio 網站按 Dashboard, 在儀表板頁面上按 "Create API Key" 鈕來建立 OpenClaw 專用的金鑰 :





或直接前往 API key 頁面 :





填寫金鑰名稱勾選所屬專案後按 "Create key" :




建立後要立即按後面的複製鈕, 將金鑰儲存到記事本 (只顯示一次) :





參考 :



(2). 建立 OpenAI API Key :

首先登入 OpenAI 帳戶 :


按左邊導覽列的 API keys :




按 Create new secrets key 鈕 :



填寫金鑰名稱後按 Create secret key :





複製金鑰貼到記事本中儲存備用 :




當然建立金鑰的前提示必須先儲值, 登入後切換到帳務頁面 (Billing) 輸入信用卡即可 : 


參考 :



(3). 建立 Claude API Key :

首先登入 Claude 帳戶 (Claude 是透過 Email 取得驗證碼) :





按左邊導覽列的 API Keys 顯示目前的金鑰列表, 按右上角的 Create key :




這時會跳出視窗, 詢問是否要使用身分聯邦 (Identity Federation) 功能, 這是可讓雲端平台自動核發幾分鐘內就會過期的短期 Token 的功能, 這種方式比產生永久金鑰更安全, 不用擔心金鑰外洩, 但我們是要在本地主機使用金鑰, 故要按底下的 "Continue with an API key" :




在 Name 欄輸入金鑰名稱後按 Add 鈕 :




按 Copy key 複製金鑰貼到記事本中儲存備用 :



參考 : 



2. OpenClaw 初始化設定 (Onboarding) :  

以下按照 "OpenClaw 超入門" 這本書建議的最小可行原則 (Minimum Viable), 在初始化設定時跳過頻道, 搜尋引擎, Skills 與 Hooks 等設定, 先建立一個可運行的基本系統配置, 利用 Web UI 代理人與 OpenClaw 對話, 透過視覺化介面了解其核心功能與選項用途, 後續再逐步擴充與優化. 

Onboarding 是一個互動式的初始化程序, 透過問答式引導精靈 (Setup Wizard) 介面, 協助完成以下系統初始化所需之核心設定 (只需在第一次使用前或日後想整機重新配置時執行) :
  • 選擇並綁定 AI 模型大腦
  • 配置對外通訊通道 (Channels)
  • 設定預設角色與 Agent 權限
  • 自動產生組態設定檔 (config.json 或 .env)
開啟樹莓派 OS 終端機, 輸入 openclaw onboard 指令, 發現與書中描述的大不同, 原來我安裝的是新版 Openclaw,  :

pi@pi4b:~ $ openclaw onboard  
 openclaw crestodian - crestodian local - agent crestodian (Crestodian) -       
 session main                                                                   

 session agent:crestodian:main                                                  

Hi, I'm Crestodian — let's hatch your agent.                                    
                                                                                
No menus here: tell me what you want and I'll do the configuring. I looked      
around this machine:                                                            
                                                                                
- AI: nothing detected yet (no Claude Code or Codex login, no                   
  OPENAI_API_KEY/ANTHROPIC_API_KEY). I'll set up the basics first, then ask     
  whether you want to configure a model provider with masked credential prompts.
- Workspace: ~/.openclaw/workspace                                              
- Gateway: runs locally, private to this machine (token auth).                  
                                                                                
Say yes and I'll set all of that up now.                                        
                                                                                
Heads up: your agent gets real access to this machine —                         
https://docs.openclaw.ai/security                                               
Afterwards: connect discord, connect slack, connect telegram, connect whatsapp  
(or channels for the full list), then talk to agent to meet your agent.         
 local ready | idle                                                             
 agent crestodian (Crestodian) | session main (Crestodian) | unknown | tokens ? 
────────────────────────────────────────────────────────────────────────────────

輸入 yes :

yes                                                                             
                                                                                

 ⠧ conjuring… • 3s | local ready                                                
 agent crestodian (Crestodian) | session main (Crestodian) | unknown | tokens ? 
────────────────────────────────────────────────────────────────────────────────
[crestodian] running: crestodian.setup                                          
Workspace OK: ~/.openclaw/workspace                                             
Sessions OK: ~/.openclaw/agents/main/sessions                                   
Systemd: Linux 安裝預設使用 systemd 使用者服務。沒有 lingering 時,systemd 會在 
使用者工作階段退出/閒置後停止工作階段並終止 Gateway。                           
Enabling lingering now (may require sudo; writes /var/lib/systemd/linger).      
Systemd: Enabled systemd lingering for pi.                                      
Gateway 服務執行環境: QuickStart 使用 Node 執行 Gateway 服務(穩定且受支援)。  
Gateway 服務                                                                    
正在準備 Gateway 服務...                                                        
正在安裝 Gateway 服務...                                                        
Gateway 服務已安裝。                                                            
Updated /home/pi/.openclaw/openclaw.json                                        
Workspace: ~/.openclaw/workspace                                                
Gateway: not reachable yet (connect ECONNREFUSED 127.0.0.1:18789) — say gateway 
status to check                                                                 
Default model: not configured yet                                               
[crestodian] done: crestodian.setup                                             
                                                                                
No usable model provider is configured, so the agent cannot answer yet.         
Configure a model provider now? Say yes or no.                                  
 local ready | idle                                                             
 agent crestodian (Crestodian) | session main (Crestodian) | unknown | tokens ? 

可見 Crestodian 已經自動幫我完成了以下底層配置 :
  • 建立工作目錄與工作階段 (~/.openclaw/workspace)
  • 啟用了 Linux systemd lingering (確保即便你登出 SSH 終端機, Gateway 服務依然能在背景常駐執行)
  • 產生了核心組態檔 ~/.openclaw/openclaw.json。
但系統尚未配置可用的 AI 模型, OpenClaw 目前還無法回答問題, 詢問是否要設定模型來源? 輸入 yes 會列出一份模型清單, 可用上下鍵移動選項後按 Enter 選定, 此處我直接按 Enter 選擇預設的 OpenAI 模型 :

yes                                                                             
                                                                                

Opening masked model-provider setup in the terminal.                            
 local ready | idle                                                             
 agent crestodian (Crestodian) | session main (Crestodian) | unknown | tokens ? 
────────────────────────────────────────────────────────────────────────────────
                                                                                
────────────────────────────────────────────────────────────────────────────────
◆  Model/auth provider
│  ● OpenAI (ChatGPT/Codex sign-in or API key)
│  ○ Anthropic
│  ○ xAI (Grok)
│  ○ Google
│  ○ OpenRouter
│  ○ Meta
│  ○ More…
│  ○ Skip for now
│  ↑/↓ to navigate • Enter: confirm

按向下鍵移動到第二項 OpenAI API Key 後按 Enter :

◇  Model/auth provider
│  OpenAI
◆  OpenAI auth method
│  ○ ChatGPT Login
│  ● OpenAI API Key (Use your OpenAI API key directly)
│  ○ Back
│  ↑/↓ to navigate • Enter: confirm

要求輸入 API Key, 將上面專為 OpenClaw 建立的金鑰複製貼上後按 Enter :

◆  Enter OpenAI API key
│  ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
▪▪▪▪▪▪▪_

這時會顯示 Installing ... 安裝進度, 初始化程序會透過 npm 下載名為 @openclaw/codex 的適配器套件, 負責封裝 API 請求協定與 Token 處理邏輯, 但似乎從伺服器下載 npm 套件時發生卡頓, 超過了預設的 300 秒上限, OpenClaw 會自動切回標準的 @openclaw/openai-provider (此模組在先前的清單中已經預先內建), 並直接採用標準的通用模型 :

◇  安裝逾時:Codex
◇  插件安裝 ───────────────────────────────────╮
│                                              │
│  安裝 @openclaw/codex 逾時,已等待 5 分鐘。  │
│  返回選擇。                                  │
│                                              │
├──────────────────────────────────────────────╯
Plugin install timed out after 300000ms: @openclaw/codex
◇  模型已設定 ──────────────────────╮
│                                   │
│  預設模型已設定為 openai/gpt-5.6  │
│                                   │
├───────────────────────────────────╯
◆  預設模型
│  ● 保留目前值(openai/gpt-5.6)
│  ○ 手動輸入模型
│  ○ 瀏覽所有模型
│  ↑/↓ to navigate • Enter: confirm

直接按 Enter 使用 gpt-5.6 即可 :

 openclaw crestodian - crestodian local - agent crestodian (Crestodian) -       
 session main                                                                   

 session agent:crestodian:main                                                  

Hi, I'm Crestodian.                                                             
                                                                                
- Start me when setup, config, Gateway, model choice, or agent routing feels    
  off.                                                                          
- Using: openai/gpt-5.6 — just tell me what you want.                           
- Config: valid. Default agent: main.                                           
- Gateway: not reachable at ws://127.0.0.1:18789; I already did the first probe.
                                                                                
I can start debugging with gateway status, or queue restart gateway for         
approval.                                                                       
 local ready | idle                                                             
 agent crestodian (Crestodian) | session main (Crestodian) | openai/gpt-5.6 |   
 tokens ?                   

這表示目前已經成功完成出初始化設定, 已進入 Crestodian 的互動對話交談模式, AI 大腦已綁定為 openai/gpt-5.6, 並提示目前 Gateway 服務 (連接埠 18789) 尚未啟動連線, 可在底下輸入 restart gateway 後按 Enter, 讓 Crestodian 啟動網關服務 : 

restart gateway                                                                 
                                                                                

The gateway is currently reachable. Restarting is a persistent action and will  
briefly interrupt it. Confirm and I’ll restart it.                              
 local ready | idle                                                             
 agent crestodian (Crestodian) | session main (Crestodian) | openai/gpt-5.6 |   
 tokens ?                                                       

開頭提示代表 Gateway 服務其實已經在背景自動啟動成功並正常連線中, 如果重啟會短暫中斷服務, 它在確認是否要執行, 既然 Gateway 已在執行中, 那就輸入 no 並按 Enter 取消重啟. 

no                                                                              
                                                                                

Understood—no restart. The gateway is reachable, so I’ll leave it running. Tiny 
crab, zero unnecessary button-pushing.  

這樣便完成初始化設定了.

可以開啟另一個終端機, 輸入 openclaw status 檢視目前狀態 :

pi@pi4b:~ $ openclaw status

OpenClaw 2026.7.1-2 (0790d9f) — Greetings, Professor Falken

◇  
OpenClaw status

Overview




Security audit
Skipped in fast status. Full report: openclaw security audit
Deep probe: openclaw status --deep

Channels
No channels configured

Sessions
No sessions

FAQ: https://docs.openclaw.ai/faq
Troubleshooting: https://docs.openclaw.ai/troubleshooting
Next steps:
  Need to share?      openclaw status --all
  Need to debug live? openclaw logs --follow
  Need to test channels? openclaw status --deep

從 Overview 表格可知, Gateway 儀錶板 (dashboard) 位址為 http://127.0.0.1:18789, 這在後續用 Webui 來瀏覽儀表板時要用到. 


3. 用 Web UI 開啟 OpenClaw 儀表板 :  

開啟樹莓派瀏覽器, 在網址列輸入 http://localhost:18789 或 http://127.0.0.1:18789 會開啟 OpenClaw 儀錶板頁面 : 




但由於沒有 token 導致無法連線, 連線 token 寫在 ~/.openclaw/openclaw.json 設定檔中, 用 cat 輸出此檔, 從 gateway/auth/token 屬性即可取得 : 

pi@pi4b:~ $ cat ~/.openclaw/openclaw.json    




將 token 填入 "網關令牌" 欄位後按 "連接" 鈕即可進入儀表板頁面了 :






左上角區域的功能說明 : 




左下角區域的功能說明 : 




右上角區域的功能說明 : 




中間區域的功能說明 : 




下方區域的功能說明 : 



2026年8月8日 星期六

OpenClaw 學習筆記 : 在樹莓派 Pi 4 安裝 OpenClaw (二)

在前一篇測試中, 我已在 Pi 4B 上順利安裝好 OpenClaw, 但執行 OpenClaw 時產生的網址為 localhost:18789 的內網網址, 無法作為 LINE 或 Telegram 的 webhook 網址 (因為 LINE 或 Telegram 需要 https 網址才能找到位於內網的 OpenClaw). 

解決方案之一是安裝 ngrok,  它可以為內網應用程式提供 https 網址, 但免費版提供是動態隨機 https 網址, 每次主機重開機或重新執行 ngrok 網址就會改變, 如此一來就必須去修改 LINE/Telegram Bot 的 Webhook 網址與 OpenClaw 的 .env  設定檔, 要付費版才會提供靜態網址. 在測試階段使用免費版 ngrok 即可, 如果要在本地端要打造全自動無人值守的龍蝦 AI 助理就需要買付費版 (另一個付費方案是使用 Cloudflare)

本系列之前的文章參考 : 



1. 申請 Ngrok 帳號 :

首先到 Ngrok 官網 : 


按右上角的 SIGN UP 鈕 : 




可以用 GitHub 或 Gmail 帳戶快速註冊, 也可以用 Email 註冊 (密碼至少需 10 個字元), 我這次使用 Yahoo 信箱 : 




它會寄一封認證信到郵箱 : 




開啟認證信, 按下認證連結會登入並開啟 Ngrok 儀錶板的安裝設定頁面 :




按 Copy 複製認證金鑰 (AuthToekn) 貼到記事本存檔備用 :




如果忘記記在哪裡, 可以登入 ngrok 後點左邊導覽列上方的 "Your Authtoken" 即可複製 :





2. 安裝 Ngrok : 

接下來開啟 Pi 4 終端機, 使用 apt install 來安裝 Ngrok, 但在正式安裝之前, 有些前置作業須先完成後才能順利安裝 :


(1). 將 Ngrok 數位簽章加入信任 CPG 金鑰庫 : 

此步驟是要將 Ngrok 數位簽章 (金鑰) ngrok.asc 放到系統的 trusted.gpg.d (信任金鑰庫), 這樣後面執行 apt install ngrok 安裝指令時, 樹莓派會用它來比對下載下來的檔案簽章, 如果中途被駭客調包或檔案毀損將導致簽章比對不符, 系統就會拒絕安裝, 這樣便能保證所安裝的 ngrok 是官方原廠發行的 : 

curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc

pi@pi4b:~ $ curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc   
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGFGa/IBEAC0pgrns33QSiSipIKRnUCLeXX8d8WQjeqOqVEA6QlavAW54hKn
uHbbf151LFp0eGGaTp5ppJih2u9geiE8GxVACMuCHdlI0d35wAkucr+15qG+rfxm
qLkGGWARsRni3RJwg9R6/MwBgG ...
... (略) ...
FHIT8wNII9bhe7NvXBG7RcA6hvjcRO3gp+usaO1MzRDnbmosRQoeGSjh9txMQVIQ
HiRXcKdw6yyrtu12KMD/nJwgbEomikgPfEqRPtTTKYGjwV0/BQcMvJ/3u3AQCDYd
asvZu3xH2Cn0aoGMg+jqPVzyC0vY/SQQqmTHjz+msFu3OUsnXsJ6zQaxfGle5O4o
9zWY/VMfdn2r9I7sHNk2Sxu3ZALyorHHqeuHBKnM6Ui6ISrWr/9SAPaHN14IR/Le
/7JXRqfXsWxyTbOUVnmRWIXPXHU=
=ghCR
-----END PGP PUBLIC KEY BLOCK-----


(2). 將 Ngrok 下載網址加入套件庫 (軟體源清單) : 

此指令會在系統的軟體源目錄中建立一個 ngrok.list 檔案, 裡面紀錄 Ngrok 官方下載伺服器的網址, 這樣當執行 sudo apt update 時, 樹莓派就會根據此網址去查看 ngrok 目前有哪些最新版本可以下載 : 

echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list  

pi@pi4b:~ $ echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list
deb https://ngrok-agent.s3.amazonaws.com buster main


(3). 更新套件庫清單 & 安裝 ngrok : 

完成前置步驟後, 用下列指令更新軟體源清單, 便能順利從 Ngrok 倉庫下載安裝 ngrok : 

sudo apt update
sudo apt install ngrok -y

pi@pi4b:~ $ sudo apt update  
已有:1 http://deb.debian.org/debian bookworm InRelease
下載:2 http://deb.debian.org/debian-security bookworm-security InRelease [34.8 kB]
下載:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]       
下載:4 https://ngrok-agent.s3.amazonaws.com buster InRelease [20.3 kB]         
下載:5 http://deb.debian.org/debian-security bookworm-security/main arm64 Packages [323 kB]
下載:6 http://archive.raspberrypi.com/debian bookworm InRelease [55.0 kB]
下載:7 https://ngrok-agent.s3.amazonaws.com buster/main arm64 Packages [12.9 kB]
下載:8 http://deb.debian.org/debian-security bookworm-security/main armhf Packages [300 kB]
下載:9 https://ngrok-agent.s3.amazonaws.com buster/main armhf Packages [12.9 kB]
下載:10 http://archive.raspberrypi.com/debian bookworm/main armhf Packages [580 kB]
下載:11 http://archive.raspberrypi.com/debian bookworm/main arm64 Packages [580 kB]
取得 1,974 kB 用了 5s (403 kB/s)   
正在讀取套件清單... 完成
正在重建相依關係... 完成
正在讀取狀態資料... 完成  
218 packages can be upgraded. Run 'apt list --upgradable' to see them.

安裝 ngrok : 

pi@pi4b:~ $ sudo apt install ngrok -y  
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
下列【新】套件將會被安裝:
  ngrok
升級 0 個,新安裝 1 個,移除 0 個,有 218 個未被升級。
需要下載 7,431 kB 的套件檔。
此操作完成之後,會多佔用 0 B 的磁碟空間。
下載:1 https://ngrok-agent.s3.amazonaws.com buster/main arm64 ngrok arm64 3.39.10 [7,431 kB]
取得 7,431 kB 用了 8s (959 kB/s)                                               
選取了原先未選的套件 ngrok。
(讀取資料庫 ... 目前共安裝了 131151 個檔案和目錄。)
正在準備解包 .../ngrok_3.39.10_arm64.deb……
Unpacking ngrok (3.39.10) ...
設定 ngrok (3.39.10) ...

完成安裝後檢視 ngrok 版本 : 

ngrok version

pi@pi4b:~ $ ngrok version  
ngrok version 3.39.10   


(4). 備份樹莓派 TF 卡映像 : 

安裝好 Ngrok 後正是建立 TF 卡映像檔的黃金時刻, 因為這時 Node.js v24 + npm 全域環境就緒, OpenClaw + ngrok 安裝完畢, 且尚未寫入任何 API Key 或 Token, 即使將映像檔分享給朋友或備份在雲端硬碟也不用擔心外洩私鑰. 

在製作映像檔前先清除一些垃圾 : 

pi@pi4b:~ $ npm cache clean --force   
npm warn using --force Recommended protections disabled.
pi@pi4b:~ $ sudo apt clean   
pi@pi4b:~ $ sudo apt autoremove -y     
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
升級 0 個,新安裝 0 個,移除 0 個,有 233 個未被升級。

然後先用 sudo poweroff 關機取出 TF 卡, 再插入讀卡機連接 PC 後用 Win32DiskImager 備份映像檔, 可避免以後 TF 卡異常要從頭重建系統很花時間, 直接從映像檔復原最快 (換新卡也可以). 




在這一步做是因為要保留系統復原後綁定其它 Ngrok 帳號的彈性. 關於 Win32DiskImager 備份映像檔作法參考 :



(5). 綁定 Ngrok 帳號 : 

上面做完映像檔備份後, 將 TF 卡插回 Pi 4 開機, 接下來進行 Ngrok 帳號綁定. 上面安裝的 ngrok 軟體必須與 Ngrok 帳號綁定才能開通安全隧道, 複製上面註冊 Ngrok 帳號時取得之認證金鑰 (AuthToekn), 貼到下面指令最後面 : 

ngrok config add-authtoken 我的Token  

pi@pi4b:~ $ ngrok config add-authtoken 3FL6yMDKr...(略)...qfps4wWn
Authtoken saved to configuration file: /home/pi/.config/ngrok/ngrok.yml

出現 "Authtoken saved to configuration file" 表示已經綁定成功, 後面是其設定檔位置. 

若想解除 Ngrok 綁定只要刪除該設定檔即可, 指令如下 :

pi@pi4b:~ $ rm -f ~/.config/ngrok/ngrok.yml   

解除綁定後可用 ngrok http 80 指令來驗證是否已解除 : 

pi@pi4b:~ $ ngrok http 80  
ERROR:  authentication failed: This ngrok session is not authenticated. ngrok requires an account and a valid credential to start a session.
ERROR:  
ERROR:  Sign up for an account: https://dashboard.ngrok.com/signup
ERROR:  Get your credential: https://dashboard.ngrok.com/get-started/your-authtoken
ERROR:  
ERROR:  ERR_NGROK_4018
ERROR:  https://ngrok.com/docs/errors/err_ngrok_4018
ERROR:  

出現 "authentication failed" 與 "ERR_NGROK_4018" 表示金鑰已經徹底被抹除乾淨了.


(6). 啟動 ngrok 外網穿透服務 : 

接下來要啟動樹莓派上的 ngrok 程式連線到 Ngrok 雲端伺服器, 透過雙方握手建立起一條專屬加密虛擬隧道, 並且為位於內網的 OpenClaw 網頁與通訊埠 18789 建立一個 https 公網網址, 這樣所有連到該網址的流量都會透過隧道安全地引導到樹莓派本地端正在執行的 OpenClaw 服務中, 指令如下 : 

ngrok http 18789

可見 Ngrok 已為 OpenClaw 建立一個 https://xxxx.ngrok-free.app 網址, 把這網址設定為 LINE/Telegram 的 Webhook, 當用這兩個通訊軟體向 OpenClaw 下達指令時, 訊息會先到達 Ngrok 的雲端伺服器, Ngrok 會透過與樹莓派之間已建立的隱形隧道將訊息傳給樹莓派上的 ngrok 程式, ngrok 接收到後立刻轉交給正在 localhost:18789 待命的 OpenClaw. 

2026年7月4日 星期六

在樹莓派 Pi 400 (Trixie) 虛擬環境中佈署市圖爬蟲程式 (v14)

這兩天利用 Antigravity CLI 搞定市圖爬蟲程式 v14 升版後, 陸續佈署到 kaopi3 與 pi3aplus 主機上且順利運行中, 今天輪到 Pi 400 主機了. 

我目前在 Pi 400 安裝的樹莓派 OS 是最新的 Trixie (內建 Python 3.13), 從上一版的從 Bookworm 開始, 樹莓派 OS 即遵循 PEP 668 規範, 不允許直接在系統 Python 環境用 pip 安裝第三方套件, 必須建立虛擬環境後在虛擬環境裡面才能用 pip 安裝套件. 

有別於 Pi 3 主機直接在系統 Python 3.9.2 上執行 Python 程式, 在 Pi 400 上必須在虛擬環境中安裝套件與執行 Python 程式, 目前 Pi 400 的爬蟲是在虛擬環境 myenv313 下執行, 所以先進入此虛擬環境 : 

pi@pi400:~ $ source ~/myenv313/bin/activate   
(myenv313) pi@pi400:~ $

因為之前就已在此環境下安裝 Numpy 時安裝過 OpenBLAS 及相關的底層依賴庫, 所以下面指令可以略過 :

sudo apt-get update
sudo apt update sudo apt install -y libopenblas-dev libatlas-base-dev 

接下來安裝 tesseract-ocr 套件 : 

(myenv313) pi@pi400:~ $ sudo apt-get install tesseract-ocr   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
The following packages were automatically installed and are no longer required:
  alacarte gir1.2-gmenu-3.0 gnome-menus gtk-nop libevent-pthreads-2.1-7t64 libgnome-menu-3-0
  libwlroots-0.18 python3-gi-cairo retry
Use 'sudo apt autoremove' to remove them.
下列的額外套件將被安裝:
  libleptonica6 libtesseract5 tesseract-ocr-eng tesseract-ocr-osd
下列【新】套件將會被安裝:
  libleptonica6 libtesseract5 tesseract-ocr tesseract-ocr-eng tesseract-ocr-osd
升級 0 個,新安裝 5 個,移除 0 個,有 261 個未被升級。
需要下載 7,207 kB 的套件檔。
此操作完成之後,會多佔用 24.5 MB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] y
下載:1 http://deb.debian.org/debian trixie/main arm64 libleptonica6 arm64 1.84.1-4 [994 kB]
下載:2 http://deb.debian.org/debian trixie/main arm64 libtesseract5 arm64 5.5.0-1+b1 [1,237 kB]
下載:3 http://deb.debian.org/debian trixie/main arm64 tesseract-ocr-eng all 1:4.1.0-2 [1,594 kB]
下載:4 http://deb.debian.org/debian trixie/main arm64 tesseract-ocr-osd all 1:4.1.0-2 [2,992 kB]
下載:5 http://deb.debian.org/debian trixie/main arm64 tesseract-ocr arm64 5.5.0-1+b1 [389 kB]
取得 7,207 kB 用了 3s (2,122 kB/s)      
選取了原先未選的套件 libleptonica6:arm64。
(讀取資料庫 ... 目前共安裝了 147525 個檔案和目錄。)
正在準備解包 .../libleptonica6_1.84.1-4_arm64.deb……
Unpacking libleptonica6:arm64 (1.84.1-4) ...
選取了原先未選的套件 libtesseract5:arm64。
正在準備解包 .../libtesseract5_5.5.0-1+b1_arm64.deb……
Unpacking libtesseract5:arm64 (5.5.0-1+b1) ...
選取了原先未選的套件 tesseract-ocr-eng。
正在準備解包 .../tesseract-ocr-eng_1%3a4.1.0-2_all.deb……
Unpacking tesseract-ocr-eng (1:4.1.0-2) ...
選取了原先未選的套件 tesseract-ocr-osd。
正在準備解包 .../tesseract-ocr-osd_1%3a4.1.0-2_all.deb……
Unpacking tesseract-ocr-osd (1:4.1.0-2) ...
選取了原先未選的套件 tesseract-ocr。
正在準備解包 .../tesseract-ocr_5.5.0-1+b1_arm64.deb……
Unpacking tesseract-ocr (5.5.0-1+b1) ...
設定 libleptonica6:arm64 (1.84.1-4) ...
設定 tesseract-ocr-eng (1:4.1.0-2) ...
設定 libtesseract5:arm64 (5.5.0-1+b1) ...
設定 tesseract-ocr-osd (1:4.1.0-2) ...
設定 tesseract-ocr (5.5.0-1+b1) ...
執行 man-db (2.13.1-1) 的觸發程式……
執行 libc-bin (2.41-12+rpt1+deb13u2) 的觸發程式……

最後安裝 pytesseract 與 Pillow 套件 :

(myenv313) pi@pi400:~ $ pip install pytesseract Pillow   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pytesseract
  Downloading https://www.piwheels.org/simple/pytesseract/pytesseract-0.3.13-py3-none-any.whl.metadata (11 kB)
Requirement already satisfied: Pillow in ./myenv313/lib/python3.13/site-packages (11.3.0)
Requirement already satisfied: packaging>=21.3 in ./myenv313/lib/python3.13/site-packages (from pytesseract) (25.0)
Downloading https://www.piwheels.org/simple/pytesseract/pytesseract-0.3.13-py3-none-any.whl (14 kB)
Installing collected packages: pytesseract
Successfully installed pytesseract-0.3.13

至此執行新版爬蟲所需的套件都齊了, 測試一下 :

(myenv313) pi@pi400:~ $ python ksml_lib_14.py abc 123456
主機 : pi400
[嘗試 1/3] 驗證碼辨識結果: 0003
[嘗試 1/3] 登入失敗,準備重試...
[嘗試 2/3] 驗證碼辨識結果: 43504
登入成功(第 2 次嘗試)
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
資源已釋放
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': abc 的資料已更新', 'status': 'success'}
執行時間:61.67458128929138

爬蟲程式可以順利執行. 這樣就可以為爬蟲程式添加可執行權限 :

pi@pi400:~ $ chmod +x ksml_lib_14.py   

由於 Pi 400 主要做為支援 pi3aplus 主機的爬蟲任務之用, 所以它所綁定的後端 render.com 伺服器為 fdof, 用 nano 修改 ksml_lib_14.py 中的網址 : 

    # --- 推送資料 ---
    if b_msg or r_msg:  # 任一不為空字串就更新資料表
        url = "https://serverless-fdof.onrender.com/function/update_ksml_books"
        payload = {
            "account": account,
            "borrow_books": b_msg,
            "reserve_books": r_msg
        }
        res = requests.post(url, json=payload)
        print(res.json())

另外, 從 render.com 截取資料的程式 get_ksml_books_messages.py 也是綁定 fdof : 

# get_ksml_books_messages.py
import requests
import socket

host_name=socket.gethostname()
print(f'主機 : {host_name}')
params={'crawler': f'{host_name}'}
# for kaopi3
# url='https://serverless-5e6i.onrender.com/function/send_books_messages'
# for pi3aplus & pi400 (備援)
url='https://serverless-fdof.onrender.com/function/send_books_messages'
res=requests.get(url, params=params)
print(res)

最後把 crontab 中的爬蟲程式由 v13 改成 v14 即可 (雖然目前都被註解掉未執行).