2026年6月28日 星期日

OpenClaw 賦予 Cron 有 Glob 讀取檔案的權限

OpenClaw 賦予 Cron 有 Glob 讀取檔案的權限

預設龍蝦的 cron 能用的內部工具是有限的,如果你有下指令讓她根據最近的對話紀錄的之類得,會需要用到搜尋 memory/2026-*.md 就有機率用到下面的的錯誤

I can’t use the tool “glob” here because it isn’t available. I need to stop retrying it and answer without that tool.


基本大概這幾個基礎指令有用到就給她吧

動作需要的工具原因
找記憶檔案 memory/2026-*.mdGlob找檔案模式匹配
讀記憶檔案內容Read讀檔案
搜尋檔案內容Grep搜關鍵字
執行指令Bash查今日 commit
發報告到 DiscordSendMessage發訊息


給全域權限的指令

openclaw config set tools.alsoAllow '["glob","read","grep"]'


也能針對特定 corn 給權限

openclaw cron edit <cron-id> --tools glob,read,grep


看需求自己添加吧

2026年6月26日 星期五

OpenClaw 如何關閉心跳節省 Token 的成本

OpenClaw 如何關閉心跳

預設心跳是每30分鐘會從 main 會話啟動一次,這會消耗一次對話的 Token,主要是為了定期起來做事。

但如果擁有多台 OpenClaw 的話這個消耗就非常可觀了,看需求可以關掉一些不必要的心跳


設定心跳

關閉心跳

openclaw config set agents.defaults.heartbeat.every "0m"

每30分鐘心跳一次

openclaw config set agents.defaults.heartbeat.every "30m"


確認設定值

openclaw config get agents.defaults.heartbeat.every


設定完記得要重啟才會生效

openclaw gateway restart --safe

重啟完就生效了



Openclaw 讓 session 永遠延續不要每天自動重置

Openclaw 讓 session 永遠延續不要每天自動重置

最初一開始的版本其實不管經過幾天都不會自動刷掉會話重來,從某一版開始就變得每天會自動重置,好處是會話別一直累積,可以減少 Token 的消耗與反應速度快一點

不過缺點也很明顯會話的連續性,具體表現就是過一天之後龍蝦就失憶了,明明 Discord 上還有昨天的對話可是他卻說他不記得了

調整成不過期之後對話滿的時候會自動壓縮,可能要卡個10幾秒左右,遇到了自己有耐心等一下


具體要改的值在這裡,這是快速設定的指令

openclaw config set session.reset '{"mode":"idle","idleMinutes":52596000}' --strict-json


具體表現在 openclaw.json 上長這個樣子

{
  "session": {
    "reset": {
      "mode": "idle",
      "idleMinutes": 52596000
    }
  }
}

簡單的改成 100 年基本上就是不會過期了


設定完記得要重啟才會生效

openclaw gateway restart --safe






2026年6月23日 星期二

如何讓 OpenClaw 的 corn 根據聊天內容判斷決定是否要發送提醒

如何讓 OpenClaw 的 corn 根據聊天內容判斷決定是否要發送提醒

一個最簡單的做法是走心跳,但是心跳不是很穩定,心跳的好處是直接從主會話啟動,可以有主會話的記憶,不過缺點是不可控

再來就只剩下走普通 corn 呼叫一個獨立會話來做事了,第一個問題是他讀不到其他會話,雖然可以走 Discord API 讀到,但是萬一你不是在 DC 上聊呢?

找到最好的解法是用 TaskList() 列出會話並依照時間與類型塞選,然後再用 TaskHistory() 來讀取最新多少則內容,如此一來就可以絕對取得近期所有記錄了

這個做法除了能判斷之外最大的優點是,讓提醒具備對話連續性的能力,才不會只是冷冰冰的固定文字提醒而已


固定的技能流程

取得方法的固定流程可以參考這個
技能包: gist/context-reader.md (進後按右上角raw按鈕可以複製)

技能需要打開兩個能力才能順利運行

1. 使 Agent 有能力讀取其他會話

openclaw config set tools.sessions.visibility agent

2. 使 Agent 有能力自己發到 Discord 中

openclaw config set channels.discord.actions.messages true


設定 corn 的提示詞

傳送的部分選無就可以了不經由內建的傳送
最後在 corn 中輸入這樣的提示詞。(target 那裡記得改成自己的ID)

現在是中午11:45,提醒主人去吃午餐。

步驟:
1. 讀取 cron-skills/context-reader/SKILL.md 並執行,載入主人最近的對話
2. 根據對話內容和發送判斷,決定是否發送午餐提醒

內容要求:
- 簡短、不囉唆
- 語氣輕鬆關心
- 根據今天的狀態調整內容
- 可以用 emoji
- 每天說法稍微不同

**你必須使用 message 工具發送 Discord DM:**
- action: send
- channel: discord
- target: user:{UserID}
- message: 一條簡短溫馨的午餐提醒

**發送判斷:**
- 如果對話中主人已經說過吃飽了、正在吃、或剛吃完 → 不發送
- 如果沒有相關資訊或不確定 → 發送提醒



實際成果

實際成功阻斷的範例,成功獲取信息並像個人一樣思考了






2026年5月29日 星期五

WindwosUpdate 延緩 自動更新 14天

WindwosUpdate 延緩 自動更新 14天

怕安全更新出事主力機有檔一下,這必須是專業版以上版本才有用,家用版估計是不起作用的

更改的登陸檔指令在這裡

reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DeferQualityUpdates /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DeferQualityUpdatesPeriodInDays /t REG_DWORD /d 14 /f

分別是 啟用「「延後品質更新」」與「延後 14 天」兩個選項的設置

這個只會延緩每月一次的安全更新,每幾天一次的小補釘照樣會跑




2026年5月27日 星期三

OpenClaw 安全的自我改 json 設定值 (用migration的方式)

OpenClaw 安全的自我改 json 設定值 (用migration的方式)

直接改 openclaw.json 容易手殘改炸,也沒有紀錄。用 migration 的方式可以追溯每次改了什麼、為什麼改,還能先 dry-run 驗證



建立 migration 檔案

在 workspace 的 migrations/ 目錄下建檔,命名格式跟 Supabase 一樣用時間戳:

// migrations/20260527211900_你的描述.json5

// Migration: 簡短標題
// 原因: 為什麼要改
// 日期: 2026-05-27
// 影響: 改了會怎樣
{
  "要改的區塊": {
    "要改的key": "新的值"
  }
}

例如關閉 session 自動 reset 的設定值是

// migrations/20260525010000_disable-session-auto-reset.json5
{
  "session": {
    "reset": {
      "mode": "idle",
      "idleMinutes": 52596000
    }
  }
}



套用設定

Dry-run 驗證

openclaw config patch --file migrations/20260525010000_disable-session-auto-reset.json5 --dry-run

通過會顯示 Dry run successful: N update(s) validated
失敗會告訴你哪個值不合法

套用

openclaw config patch --file migrations/20260525010000_disable-session-auto-reset.json5

重啟後生效

openclaw gateway restart --safe



復原

如果改炸了的話,config patch 每次 apply 都會自動產生 openclaw.json.bak,直接復原

cp ~/.openclaw/openclaw.json.bak ~/.openclaw/openclaw.json
openclaw gateway restart --safe



把這套做法安裝到 OpenClaw 中

上面是手動的測試流程,再來我們要把這套流程裝入 workspace 讓 openclaw 有長期記憶下次可以自動執行

  1. 把使用說明 README.md 檔案複製到 ~/.openclaw/workspace/migrations/README.md
  2. 在 TOOLS.md 中填入這裡的提示詞(migrations/TOOLS.md)


這樣就可以在需要的時候自動按需讀取並運作了






2026年5月26日 星期二

OpenClaw 讓龍蝦在不同 會話(session) 互通

OpenClaw 讓龍蝦在不同 會話(session) 互通

龍蝦預設每個會話是不會互通無法查看內容的,這是為了多人使用時不要互相去偷看別人的內容了,但如果只有自己一個人在用,可可以互看會比較好

才不會出現在 Discord 上我在 A頻道聊的東西 B頻道 或 DM上完全不知道,就好像不同人一樣會有種出戲感


設定方法

因為只需要改一個值而已這裡用內建命令啟動比較快

openclaw config set tools.sessions.visibility agent

再來確認當前值

openclaw config get tools.sessions.visibility


要關閉的話

openclaw config unset tools.sessions.visibility


他對應到 json 的這個設定值

{
"tools": { "sessions": { "visibility": "agent" } }
}


設好之後重新啟動一下

openclaw gateway restart --safe

這樣就可以了

OpenClaw 加速重新啟動緩慢的問題

OpenClaw 加速重新啟動緩慢的問題

龍蝦可以自己成長自己改自己,最大的麻煩在於經常一重新啟動就等很久,作者有提供一個方法設置後固定的東西不用重跑可以快很多大概20秒內就可以重啟好



加速重新啟動

要加速重新啟動要自己在環境變數指定 tmp 的位置,這樣就不會每次都重跑了速度會差很多,會需要加入以下的變數

在 .bashrc 中加入下面變數

nano ~/.bashrc

# OpenClaw startup optimization
export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache
export OPENCLAW_NO_RESPAWN=1


接著執行下面指令

# 載入變數
source ~/.bashrc

# 建立目標資料夾
mkdir -p /var/tmp/openclaw-compile-cache

# 重啟 openclaw
openclaw gateway restart --safe


做完之後重啟速度就會快很多了,通常大概20秒內就可以重新上線了



2026年5月20日 星期三

OpenClaw 如何賦予龍蝦聲音學會說話 (範例: 馬娘與原神)

OpenClaw 如何賦予龍蝦聲音學會說話 (範例: 馬娘與原神)

OpenClaw 其實內建就有 tts 工具,可以自動發氣泡語音到 discord 的聊天室中

友情提醒,文章正確的姿勢是把網址貼給龍蝦,你完全不需要自己一步一步來



音源選擇

選用的聲音是來自這個開源的庫,雖然已經封存但東西還能用
Plachtaa/VITS-fast-fine-tuning

作者有上傳一份在 huggingface 上,目前還能用只是免費版本速度慢
Multilingual Anime TTS - a Hugging Face Space by Plachta

能用就足夠了,算力太慢再自己部署到自己的機器上
可以上去挑自己喜歡的聲音,或是貼給龍蝦讓他自己選一個

要注意的是免費算力有單次150字的限制,超過該字數API呼叫會失敗
(把這個規則寫入 TOOLS.md 中避免呼叫失敗)



安裝 VITS 到機器

首先需要你連到機器本身,遠端連入或是你本身就跑在自己的電腦上都可以,文中以 ubuntu 為範例,使用者名稱是 ubuntu。

選好聲音之後我們先裝一個 python 虛擬環境給當前使用者 ubuntu 使用

# 1. 建立 venv(用系統 python3,3.10 以上)
python3 -m venv ~/.venv

# 2. 裝 gradio_client(用 venv 內的 pip,不需要 activate)
~/.venv/bin/pip install --upgrade pip
~/.venv/bin/pip install gradio_client

# 驗證
~/.venv/bin/python3 -c "import gradio_client; print(gradio_client.__version__)"

然後需要安裝 ffmpeg 用來產生氣泡用的

sudo apt install -y ffmpeg

然後下載 claw-voice/cli.py 放到以下位置

mkdir -p ~/.openclaw/workspace/scripts/claw-voice
wget -O ~/.openclaw/workspace/scripts/claw-voice/cli.py bit.ly/claw-voice-tool

Script 中最上方人物的設定與語言設定記得改成自己要的

載好可以先測試一下有沒有語音產生

~/.venv/bin/python3 ~/.openclaw/workspace/scripts/claw-voice/cli.py "こんにちは" /tmp/claw-voice-test.wav

就可以聽到 ai 產出來的語音了

然後查看 claw-voice/cli.py 這個檔案,最上方有角色設置把他改成你想要的角色,再次測試確認有辦法輸出聲音,就可以繼續安裝到 openclaw 上了



安裝到龍蝦

接著繼續,腳本身自帶產生設定檔的功能我們先產一下設定檔

~/.venv/bin/python3 ~/.openclaw/workspace/scripts/claw-voice/cli.py install

會在腳本旁邊產出一個 tts-config.json5 的設定檔

這個檔案 file-config-local-example.json 示範了 josn 還能調整什麼,如果需要輸入 HF_TOKEN 或是 Header,參考這裡,或是從這裡指定角色。

接著安裝到 openclaw

openclaw config patch --file ~/.openclaw/workspace/scripts/claw-voice/tts-config.json5

失敗時自動中止、不會修改 openclaw 主 config

改好設定檔之後重啟 openclaw (重啟前必須讓使用者確認不要擅自重啟)

openclaw gateway restart --safe



在 DC 中使用 tts 產生聲音

在 discord 中可以使用斜線召喚命令,不過由於 tts 是 dc 內建的保留字,所以打斜線不會出現這個命令,但是送出還是可以用的。

/tts audio ご主人様、まだ眠いでござる……朝……?

他就會回覆一個氣泡語音回來了



在 dc 中其實龍蝦把 voice 這個關鍵字讓位給 tts 了
也就是在 dc 中輸入 /voice 或 /tts 等於在 telegram 輸入 /tts 的意思
而 voice 原本是語音通話的意思,在 dc 中輸入 /talk-voice 等於在 tg 輸入 /voice
但是有 bug 在 dc 使用 voice 會跑去呼叫 talk-voice 所以用不了就乖乖用 tts 吧



自動語音回覆

cli.py 產生的 tts-config.json5 內含兩個影響「AI 何時自動以語音回覆」的設定

設定說明
messages.tts.autotagged觸發時機。off:永不自動 / always:每個回覆都 TTS / inbound:使用者用語音傳訊時才 TTS / tagged:模型在回覆中明確標註要 TTS 時才合成
messages.tts.modelOverrides.enabledtrue是否允許模型 per-response 控制 TTS。關閉後模型無法主動觸發語音

兩者合起來 = AI 有權限使用氣泡語音發送給你

這是為了以下兩個功能

  1. 聊天時讓龍蝦回覆氣泡語音
  2. 在 cron 中使用提示詞發氣泡語音

但是缺點就是佔用了關鍵字 [[tts:text]]這裡會自動轉成語音[[/tts:text]] 導致龍蝦如果發送給你的聊天中包含這個規則會自動轉換。(被 code block 包覆則例外)

但是這出現的概率極低,自己記得有這回事就好可以放心打開。




2026年3月23日 星期一

在 Linux/Win 上用 Shell/powershell 函式自動更新 DuckDNS

在主機上自動更新 DuckDNS


前言

DuckDNS 是免費的 DDNS 服務,適合家用伺服器或 Raspberry Pi 等動態 IP 環境。本文介紹如何在 ~/.profile 中建立一個 Shell 函式,隨時手動執行更新,也可搭配 cron 排程自動執行。


前置作業

  1. 前往 duckdns.org 註冊並登入
  2. 建立一個子網域(例如 my-host
  3. 在頁面上方複製你的 token

Linux設定函式

編輯 ~/.profile,加入以下函式:

duckdns() {
    local result
    local domain="my-host"
    local token="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    result=$(echo url="https://www.duckdns.org/update?domains=${domain}&token=${token}&ip=&verbose=true" | curl -s -k -K -)
    local status=$(echo "$result" | head -1)
    local ip=$(echo "$result" | sed -n '2p')
    if [ "$status" = "OK" ]; then
        echo -e "\033[1;32m[OK] ${domain}.duckdns.org → ${ip}\033[0m"
    else
        echo -e "\033[1;31m[FAILED] ${domain}.duckdns.org update failed\033[0m"
        return 1
    fi
}

將 domain 和 token 替換成你自己的值。


使用方式

# 載入設定(僅首次需要,新開終端機會自動載入)
source ~/.profile

# 執行更新
duckdns

成功會顯示:

[OK] my-host.duckdns.org → 123.45.67.89


搭配 cron 自動排程

如果希望每 5 分鐘自動更新,執行 crontab -e 加入:

*/5 * * * * . $HOME/.profile; duckdns > /dev/null 2>&1


運作原理

  • 使用 DuckDNS API 的 verbose=true 參數,回傳更新狀態與實際註冊的 IP
  • 不帶 ip= 參數時,DuckDNS 會自動偵測請求來源 IP
  • 函式會驗證 API 回傳狀態,成功顯示綠色,失敗顯示紅色





Windows開機自動更新DDNS

在PowerShell中執行以下的函式註冊工作排程

先載入函式

function Register-DuckDNS {
    param(
        [Parameter(Mandatory)][string]$Domain,
        [Parameter(Mandatory)][string]$Token,
        [int]$Interval
    )
    Get-ScheduledTask -TaskName "DuckDNS_9615e983" -ErrorAction SilentlyContinue |
        Unregister-ScheduledTask -Confirm:$false
    $url      = "https://www.duckdns.org/update?domains=$Domain&token=$Token"
    $action   = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -Command `"Invoke-RestMethod '$url'`""
    $triggers = @(New-ScheduledTaskTrigger -AtStartup)
    if ($Interval) {
        $triggers += New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes $Interval) -RepetitionDuration (New-TimeSpan -Days 9999)
    }
    $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
    Register-ScheduledTask -TaskName "DuckDNS_9615e983" -Action $action -Trigger $triggers -Settings $settings -User "SYSTEM" -RunLevel Highest
}


或是從gist上抓取

irm https://gist.githubusercontent.com/hunandy14/c7fa21d0e2ad88a7443e9aef3010f89c/raw/Register-DuckDNS.ps1 | iex


然後註冊工作排程

Register-DuckDNS -Domain "duck-dns-domain" -Token "duck-dns-token"

重開機就會自動更新IP了


如果需要每5分鐘同步一次就添加 -Interval 5 進去
執行後會追加一個名稱固定不變的 DuckDNS_9615e983 排程
重複執行 Register-DuckDNS 會覆蓋同一個排程

(如果要多個排程自己從函式改名稱吧,刻意寫死是怕重複執行跑出一堆幽靈排程)



刪除排程

Unregister-ScheduledTask -TaskName "DuckDNS_9615e983" -Confirm:$false






2026年3月17日 星期二

Pnp.PowerShell 如何從IDCRL改用OAuth 2.0憑證登入

Pnp.PowerShell 如何從IDCRL改用OAuth 2.0憑證登入

記得先更新pnp到最新版本: CHG: Pnp.PowerShell 如何安裝 與 基本用法
以及參考上一篇文章創建應用程式: CHG: 2024-09-09 SharePoint 禁用帳密登入改動 如何使用Application應用程式登入

2026-05-01 即將停用委託登入了,再來強迫必須用證書登入了,在舊文章裡有說如何直接註冊應用程式+創建證書,這邊單獨講在現有的應用程式裡添加證書


生成證書

這是生成證書的指令 (再次提醒 pnp 要更新到最新版本)

$params = @{
    CommonName          = "PnP_Rocks"
    ValidYears          = 10
    OutPfx              = "./secrets/PnP_Rocks.pfx"
    OutCert             = "./secrets/PnP_Rocks.cer"
    CertificatePassword = "<YourPassword>" | ConvertTo-SecureString -AsPlainText -Force
}; New-PnPAzureCertificate @params

CertificatePassword 是可選項可以不設就空白密碼,要設記得改成自己的密碼

生成之後把 PnP_Rocks.cer 上傳到應用程式上就可以用了



連接測試

連接方式有幾種這個是從檔案直接連(以檔案方式儲存比較不安全)

$params = @{
    Url                 = "https://<tenant>.sharepoint.com/sites/<SiteName>"
    ClientId            = "<YourClientId>"
    Tenant              = "<tenant>.onmicrosoft.com"
    CertificatePath     = "./secrets/PnP_Rocks.pfx"
    CertificatePassword = ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force
}; Connect-PnPOnline @params 

這個是加到信任區之後用指紋連接 (這才是真正安全的方式)

$params = @{
    Url        = "https://<tenant>.sharepoint.com/sites/<SiteName>"
    ClientId   = "<YourClientId>"
    Tenant     = "<tenant>.onmicrosoft.com"
    Thumbprint = "<YourCertThumbprint>"
}; Connect-PnPOnline @params 

目前還沒設權限登入啥都不能做只是先測試能登再說,下一步設完權限就可以動了



權限設置

關於權限限縮的問題用 Sites.Selected 可以限制僅能單一網站,下面是範例。

先到應用程式中新增該權限,讓 pnp.powershell 可以指定權限
(目前只能用 pnp.powershell 設置,網頁上無法設置)



用管理員帳號 DeviceLogin 登入

$param = @{
    Url      = "https://<tenant>.sharepoint.com/sites/<SiteName>"
    ClientId = "<YourClientId>"
}; Connect-PnPOnline @param -Interactive

授權 App 存取指定網站 (這跟上面是一組的要設別的網站得在登一次)

$param = @{
    AppId       = "<YourClientId>"
    DisplayName = "<AppName>"
    Site        = "https://<tenant>.sharepoint.com/sites/<SiteName>"
    Permissions = "FullControl" # Read | Write | Manage | FullControl
}; Grant-PnPAzureADAppSitePermission @paramg

設好之後就可以開始操作了,這樣就可以應付 5/1 的改版了






[番外] 將憑證加入Windows憑證商店

加入當前使用者的"個人"中

$params = @{
    FilePath          = "./secrets/PnP_Rocks.pfx"
    CertStoreLocation = "Cert:\CurrentUser\My"
    Password = ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force
}; Import-PfxCertificate @params


加入本機的"個人"中

$param = @{
    FilePath          = "./secrets/PnP_Rocks.pfx"
    CertStoreLocation = "Cert:\LocalMachine\My"
    Password = ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force
}; Import-PfxCertificate @param


匯入後會自動顯示指紋,要直接看指紋的話是這個指令

$param = @{
    TypeName = "Security.Cryptography.X509Certificates.X509Certificate2"
    ArgumentList = @(
        "./secrets/PnP_Rocks.pfx",
        (ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force)
    )
}; (New-Object @param)