{"skill":{"slug":"cny-rate-calculator","displayName":"Cny Skill Extracted","summary":"Fetch Bank of Taiwan CNY exchange rates and calculate tiered prices with discounts, sending results via configured channels on a set schedule.","description":"---\nname: cny-rate-calculator\nversion: 1.0.0\ndescription: Auto-fetch Bank of Taiwan CNY exchange rates and calculate tiered pricing (base cost, 10K discount, 50K discount) using the Prairie Grasslands formula. REQUIRED: Channel configuration and Schedule setup must be completed before use. Supports Telegram, Discord, Slack, Signal, WhatsApp, iMessage, IRC, Google Chat, and webhooks.\n---\n\n# CNY Rate Calculator (大草原匯率計算器)\n\nAutomatically fetch Bank of Taiwan CNY exchange rates and calculate tiered pricing.\n\n---\n\n## 🤖 Agent 指引（自動執行規則）\n\n> **以下規則 Agent 必須優先遵守，在任何使用者互動之前先執行檢查。**\n\n### 規則一：Agent 啟動時 → 主動偵測並引導設定\n\nAgent 每次啟動時，必須：\n\n1. 讀取技能目錄下的 `config.json`\n2. 檢查 `schedule.enabled` 是否為 `true`、`channels` 是否非空\n3. 若任一條件不符（**未完成設定**），立即透過 OpenClaw 已啟用的頻道發送以下訊息：\n\n```\n🦞 大草原匯率計算器尚未完成設定\n\n請選擇：\n1. 快速設定\n2. 自訂設定\n```\n\n4. 等待使用者回覆：\n   - 回覆 `1` 或「快速設定」→ Agent 執行：\n     ```\n     python scripts/cny_rate.py --auto-setup\n     ```\n     自動套用基本設定（第一個已啟用頻道 + 預設排程：週一至週五 09:00–17:00 每小時），\n     並回覆：「✅ 已套用基本設定，排程通知即將啟動。如需調整請輸入『設定匯率』。」\n   - 回覆 `2` 或「自訂設定」→ Agent 在伺服器端執行：\n     ```\n     python scripts/cny_rate.py\n     ```\n     並回覆：「✅ 設定精靈已啟動，請依照終端提示完成設定。」\n\n5. 設定精靈完成後自動將排程寫入 `~/.openclaw/cron/jobs.json`\n\n### 規則二：排程觸發事件 → 執行匯率通知\n\n當收到系統事件「執行人民幣匯率計算並發送通知」時：\n\n1. 先確認 `config.json` 的 `schedule.enabled` 為 `true` 且 `channels` 非空\n2. 若**已完成設定**，執行：\n   ```\n   python scripts/cny_rate.py --run\n   ```\n3. 若**尚未完成設定**，改為執行設定精靈（同規則一步驟 3）\n\n### 規則三：觸發設定精靈的關鍵字\n\n使用者輸入以下任一關鍵字時，執行 `python scripts/cny_rate.py`：\n\n- `設定匯率`、`匯率設定`、`初始化`、`重新設定`\n- `setup`、`configure`、`init`\n\n---\n\n## ⚠️ 使用前必須完成\n\n**本技能會自動檢測系統中已配置的頻道，並引導您完成設定。**\n\n### 🔍 自動檢測 + 交互式選擇 + 🧪 測試訊息\n\n安裝後首次執行，技能會：\n1. **自動掃描**您的 OpenClaw 配置\n2. **列出可用頻道**讓您選擇\n3. **自動保存**配置\n4. **🧪 發送測試訊息**確認設定正確（就像印表機的測試頁！）\n\n### 🧪 測試訊息流程\n\n設定完成後，會詢問是否發送測試：\n\n```\n==================================================\n🧪 設定完成！是否發送測試訊息？\n==================================================\n\n就像印表機安裝後列印測試頁一樣，\n建議發送一次測試訊息確認設定正確。\n\n發送測試訊息？(y/n): y\n\n📤 發送測試訊息到 Telegram...\n✅ 測試訊息發送成功！\n```\n\n**測試訊息內容：**\n```\n🦞 大草原匯率計算器 - 測試訊息\n\n✅ 頻道設定：Telegram\n✅ 排程設定：已啟用\n\n這是一則測試訊息，確認設定正確。\n正式匯率通知將依照排程時間發送。\n\n測試時間：2025/03/16 12:00:00\n```\n\n### 1️⃣ 頻道設定（必需）\n- 執行時自動檢測並提示選擇\n- 或直接編輯 `config.json`\n- 未設定頻道無法執行\n\n### 2️⃣ 排程設定（必需）\n- 編輯 `config.json` 設定發送時間\n- 未設定排程無法執行\n\n### 3️⃣ 🧪 測試訊息（建議）\n- 設定完成後詢問是否發送測試\n- 確認頻道設定正確\n- 就像印表機的測試頁概念\n\n---\n\n## 設定流程\n\n### Step 0: 自動檢測（安裝後自動執行）\n\n安裝後執行技能，會自動檢測您的 OpenClaw 配置：\n\n```\n==================================================\n🔍 檢測到以下可用頻道:\n==================================================\n\n  1. Telegram\n     狀態: 已啟用\n     備註: 需要 Chat ID\n\n  2. Discord\n     狀態: 已啟用\n     備註: 需要 Webhook URL\n\n  3. Console (僅終端輸出，不發送)\n  4. 取消設定\n\n請選擇要使用的頻道 (1-4): 1\n\n已選擇: Telegram\n請輸入 Telegram Chat ID: 6462528054\n\n✅ 已保存頻道配置: telegram\n```\n\n### Step 1: 頻道設定（先完成）\n\n根據自動檢測結果，編輯 `config.json`：\n\n```json\n{\n  \"channels\": [\n    { \"type\": \"telegram\", \"target\": \"YOUR_CHAT_ID\" }\n  ]\n}\n```\n\n**支援頻道：**\n\n| 頻道 | type | target | 環境變數 |\n|------|------|--------|---------|\n| Telegram | `telegram` | Chat ID | `TELEGRAM_BOT_TOKEN` |\n| Discord | `discord` | Webhook URL | 無 |\n| Slack | `slack` | Webhook URL | 無 |\n| Signal | `signal` | 電話號碼 | `OPENCLAW_GATEWAY_TOKEN` |\n| WhatsApp | `whatsapp` | 電話號碼 | `OPENCLAW_GATEWAY_TOKEN` |\n| iMessage | `imessage` | 聯絡人名稱 | `OPENCLAW_GATEWAY_TOKEN` |\n| IRC | `irc` | 頻道名稱 | `OPENCLAW_GATEWAY_TOKEN` |\n| Google Chat | `googlechat` | Webhook URL | 無 |\n| Webhook | `webhook` | 自訂 URL | 無 |\n\n### Step 2: 排程設定（後完成）\n\n編輯 `config.json`：\n\n```json\n{\n  \"schedule\": {\n    \"enabled\": true,\n    \"days_of_week\": [1, 2, 3, 4, 5],\n    \"start_time\": \"09:00\",\n    \"end_time\": \"17:00\",\n    \"interval_hours\": 1,\n    \"schedule_times\": [\"09:00\", \"10:00\", \"11:00\", \"12:00\", \"13:00\", \"14:00\", \"15:00\", \"16:00\", \"17:00\"],\n    \"description\": \"週一至週五 09:00-17:00 每小時\",\n    \"cron\": \"0 9-17 * * 1-5\"\n  }\n}\n```\n\n**排程欄位說明：**\n\n| 欄位 | 說明 | 範例 |\n|------|------|------|\n| `enabled` | 啟用排程 | `true` |\n| `days_of_week` | 執行日期（0=日, 6=六） | `[1,2,3,4,5]` |\n| `start_time` | 開始時間 | `\"09:00\"` |\n| `end_time` | 結束時間 | `\"17:00\"` |\n| `interval_hours` | 間隔小時 | `1`, `2`, `3`, `4` |\n| `schedule_times` | 執行時間列表 | `[\"09:00\", \"10:00\"]` |\n| `description` | 描述 | 自由填寫 |\n| `cron` | Cron 表達式 | `0 9-17 * * 1-5` |\n\n### Step 3: 🧪 測試訊息（建議）\n\n設定完成後執行：\n\n```bash\npython scripts/cny_rate.py\n```\n\n配置驗證通過後會詢問：\n```\n🧪 設定完成！是否發送測試訊息？\n就像印表機安裝後列印測試頁一樣...\n\n發送測試訊息？(y/n): y\n```\n\n---\n\n## 完整配置範例\n\n```json\n{\n  \"formula\": {\n    \"deltas\": [0.05, 0.03, 0.015],\n    \"labels\": [\"基礎成本\", \"滿萬優惠\", \"五萬優惠\"]\n  },\n  \"source\": {\n    \"name\": \"Bank of Taiwan\",\n    \"url\": \"https://rate.bot.com.tw/xrt\"\n  },\n  \"channels\": [\n    { \"type\": \"telegram\", \"target\": \"123456789\" },\n    { \"type\": \"discord\",  \"target\": \"https://discord.com/api/webhooks/...\" }\n  ],\n  \"schedule\": {\n    \"enabled\": true,\n    \"days_of_week\": [1, 2, 3, 4, 5],\n    \"start_time\": \"09:00\",\n    \"end_time\": \"17:00\",\n    \"interval_hours\": 1,\n    \"schedule_times\": [\"09:00\", \"10:00\", \"11:00\", \"12:00\", \"13:00\", \"14:00\", \"15:00\", \"16:00\", \"17:00\"],\n    \"description\": \"週一至週五 09:00-17:00 每小時\",\n    \"cron\": \"0 9-17 * * 1-5\"\n  }\n}\n```\n\n---\n\n## 排程部署\n\n### Windows 工作排程器\n- 程式：`python`\n- 參數：`scripts/cny_rate.py`\n- 觸發：依照 config.json 中的排程設定\n\n### Linux/macOS Cron\n```bash\n# 編輯 crontab\ncrontab -e\n\n# 加入排程（範例：週一至週五 9-17點每小時）\n0 9-17 * * 1-5 cd /path/to/skill && python scripts/cny_rate.py\n```\n\n### OpenClaw Cron\n```json\n{\n  \"cny-rate-check\": {\n    \"schedule\": \"0 9-17 * * 1-5\",\n    \"command\": \"python scripts/cny_rate.py\",\n    \"cwd\": \"/path/to/cny-rate-calculator\"\n  }\n}\n```\n\n---\n\n## 計算公式\n\n| 檔位 | 計算方式 | 預設標籤 |\n|------|---------|---------|\n| 中間價 | (買入 + 賣出) / 2 | - |\n| 基礎成本 | 中間價 + 0.05 | 基礎成本 |\n| 滿萬優惠 | 中間價 + 0.03 | 滿萬優惠 |\n| 五萬優惠 | 中間價 + 0.015 | 五萬優惠 |\n\n---\n\n## 資料來源\n\n- **台灣銀行牌告匯率**: https://rate.bot.com.tw/xrt\n- **大草原計算機參考**: https://78lion.com/CNY.html\n\n---\n\n## 環境變數\n\n| 變數 | 適用頻道 | 說明 |\n|------|---------|------|\n| `TELEGRAM_BOT_TOKEN` | Telegram | Bot 憑證 |\n| `OPENCLAW_GATEWAY_TOKEN` | Signal, WhatsApp, iMessage, IRC | Gateway 憑證 |\n| `OPENCLAW_GATEWAY_URL` | Signal, WhatsApp, iMessage, IRC | Gateway 網址 |\n\n---\n\n## 頻道管理（對話指令）\n\n安裝完成後，可直接透過已設定的頻道（如 Telegram）與 agent 互動管理通知頻道清單。\n\n| 關鍵字 | 功能 |\n|--------|------|\n| `加入頻道` | 查看可加入的頻道並選擇加入 |\n| `移除頻道` | 從通知清單移除指定頻道 |\n| `頻道設定` | 查看目前所有通知頻道狀態 |\n\n---\n\n### 觸發一：使用者主動輸入關鍵字\n\n當使用者傳送 `加入頻道`、`移除頻道` 或 `頻道設定` 時：\n\n1. 執行 `python scripts/cny_rate.py --list-channels` 取得 JSON：\n   - `configured`：目前通知清單中的頻道\n   - `available`：OpenClaw 已啟用但尚未加入的頻道\n\n2. **加入頻道** → 展示 `available` 編號清單，詢問選哪個：\n   ```\n   可加入的頻道：\n   1. Discord\n   2. Slack\n   回覆編號或名稱選擇，回覆「取消」退出\n   ```\n\n3. **移除頻道** → 展示 `configured` 編號清單，詢問選哪個\n\n4. **頻道設定** → 同時展示兩份清單，詢問要加入還是移除\n\n---\n\n### 觸發二：回覆新頻道偵測通知\n\n排程執行偵測到新頻道時，會發送以下格式的通知：\n\n```\n📡 偵測到新啟用頻道\n\n以下頻道可加入匯率通知清單：\n1. Discord\n2. Slack\n\n回覆頻道名稱或編號即可加入\n（例：Discord 或 1）\n回覆「略過」忽略此提示\n```\n\n當使用者回覆**編號**（如 `1`）或**頻道名稱**（如 `Discord`）時：\n\n1. 對照通知中的清單確認選擇的頻道類型\n2. 詢問該頻道需要的目標值：\n\n   | 頻道 | 詢問內容 |\n   |------|---------|\n   | Telegram | 請提供 Chat ID（純數字） |\n   | Discord / Slack / Google Chat | 請提供 Webhook URL |\n   | Signal / WhatsApp | 請提供目標電話號碼 |\n   | iMessage | 請提供聯絡人名稱 |\n   | IRC | 請提供頻道名稱 |\n\n3. 收到目標值後執行：\n   ```\n   python scripts/cny_rate.py --add-channel <type> <target>\n   ```\n4. 回覆確認結果，並告知下次排程將發送到新頻道\n\n使用者回覆 `略過` 則不執行任何操作，回覆確認已略過。\n\n---\n\n### 自動偵測通知\n\n排程執行時若偵測到 OpenClaw 有新啟用的頻道（尚未加入通知清單），自動透過現有頻道發送上述格式的提醒訊息。\n\n---\n\n## 檔案結構\n\n```\ncny-rate-calculator/\n├── SKILL.md              # 本說明文件\n├── config.json           # ⚠️ 必須設定（頻道+排程）\n└── scripts/\n    ├── cny_rate.py       # 主程式（含自動檢測+測試訊息）\n    ├── run.bat           # Windows 啟動\n    └── run.sh            # Linux/macOS 啟動\n```\n","tags":{"latest":"1.0.8"},"stats":{"comments":0,"downloads":846,"installsAllTime":0,"installsCurrent":0,"stars":0,"versions":11},"createdAt":1773653367278,"updatedAt":1779000834464},"latestVersion":{"version":"1.0.8","createdAt":1773681242488,"changelog":"代碼清理：DEFAULT_SCHEDULE 移至常數區、移除 confirm() 冗餘 hints、修正 Set[str] 型別標注","license":"MIT-0"},"metadata":null,"owner":{"handle":"9starmax","userId":"s173bkdc1nggg72frxdhjygbjx83x2q1","displayName":"9StarMax","image":"https://avatars.githubusercontent.com/u/221298448?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1780089920374}}