跳到主要內容

將腳本輸出管道傳輸至消息平臺

hermes send 是一個小巧、可腳本化的命令行工具(CLI),用於向 Hermes 已配置的任何消息平臺推送消息。你可以將其視為用於通知的跨平臺 curl——你無需運行網關,無需大型語言模型(LLM),也無需在每個腳本中重新粘貼機器人令牌。

適用場景包括:

  • 系統監控(內存、磁盤、GPU 溫度、長時間運行的作業完成)
  • CI/CD 通知(部署完成、測試失敗)
  • 需要向你發送結果通知的 Cron 腳本
  • 從終端快速發送一次性消息
  • 將任何工具的輸出管道傳輸到任意位置(make | hermes send --to slack:#builds

該命令複用 hermes gateway 已使用的相同憑據和平臺適配器,因此無需維護第二套配置界面。


快速開始

# Plain text to the home channel for a platform
hermes send --to telegram "deploy finished"

# Pipe in stdout from anything
echo "RAM 92%" | hermes send --to telegram:-1001234567890

# Send a file
hermes send --to discord:#ops --file /tmp/report.md

# Attach a subject/header line
hermes send --to slack:#eng --subject "[CI] build.log" --file build.log

# Thread target (Telegram topic, Discord thread)
hermes send --to telegram:-1001234567890:17585 "threaded reply"

# List every configured target
hermes send --list

# Filter by platform
hermes send --list telegram

參數參考

標誌描述
-t, --to TARGET目標。參見 目標格式
message(位置參數)消息文本。省略此項以從 --file 或標準輸入讀取。
-f, --file PATH從文件讀取正文。--file - 強制使用標準輸入。
-s, --subject LINE在正文前 prepend 一個標題/主題行。
-l, --list列出可用目標。可選的位置參數平臺過濾器。
-q, --quiet成功時不輸出 stdout(僅返回退出碼——非常適合腳本)。
--json輸出發送操作的原始 JSON 結果。
-h, --help顯示內置幫助文本。

目標格式

格式示例含義
platformtelegram發送到平臺配置的默認頻道
platform:chat_idtelegram:-1001234567890特定的數字聊天 ID / 群組 / 用戶
platform:chat_id:thread_idtelegram:-1001234567890:17585特定的線程或 Telegram 論壇主題
platform:#channeldiscord:#ops人類友好的頻道名稱(根據頻道目錄解析)
platform:+E164signal:+15551234567基於電話號碼尋址的平臺:Signal、SMS、WhatsApp

Hermes 附帶適配器的任何平臺均可作為目標: telegramdiscordslacksignalsmswhatsappmatrixmattermostfeishudingtalkwecomweixinemail 等。

退出碼

代碼含義
0發送(或列表)成功
1平臺級交付失敗(認證、權限、網絡問題)
2用法 / 參數 / 配置錯誤

退出碼遵循標準的 Unix 約定,因此你的腳本可以像處理 curlgrep 一樣根據退出碼進行分支判斷。


消息正文解析

hermes send 按以下順序解析消息正文:

  1. 位置參數hermes send --to telegram "hi"
  2. --file PATHhermes send --to telegram --file msg.txt
  3. 管道標準輸入echo hi | hermes send --to telegram

當標準輸入是 TTY(無管道)時,Hermes 不會等待輸入——你會收到明確的用法錯誤提示。這可以防止腳本因意外遺漏正文而掛起。


實際示例

監控:內存 / 磁盤警報

用一行可移植的代碼替換看門狗腳本中臨時的 curl https://api.telegram.org/... 調用:

#!/usr/bin/env bash
ram_pct=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$ram_pct" -ge 85 ]; then
hermes send --to telegram --subject "⚠ MEMORY WARNING" \
"RAM ${ram_pct}% on $(hostname)"
fi

由於 hermes send 複用你的 Hermes 配置,同一腳本可在安裝了 Hermes 的任何主機上運行——無需手動將機器人令牌導出到每臺機器的環境變量中。

不要通過網關報警其自身狀態

對於可能在網關本身陷入困境時觸發的看門狗(如 OOM 警報、磁盤滿警報),請繼續使用最小化的 curl 調用而非 hermes send。如果因為系統負載過高導致 Python 解釋器無法加載,你仍然希望該警報能夠發出。

CI / CD:構建和測試結果

# In .github/workflows/deploy.yml or any CI script
if ./scripts/deploy.sh; then
hermes send --to slack:#deploys "✅ ${CI_COMMIT_SHA:0:7} deployed"
else
tail -n 100 deploy.log | hermes send \
--to slack:#deploys --subject "❌ deploy failed"
exit 1
fi

Cron:每日報告

# Crontab entry
0 9 * * * /usr/local/bin/generate-metrics.sh \
| /home/me/.hermes/bin/hermes send \
--to telegram --subject "Daily metrics $(date +%Y-%m-%d)"

長時間運行的任務:完成後通知

./train.py --epochs 200 && \
hermes send --to telegram "training done" || \
hermes send --to telegram "training failed (exit $?)"

使用 --json--quiet 進行腳本編寫

# Hard-fail a script if delivery fails; don't clutter logs on success
hermes send --to telegram --quiet "keepalive" || {
echo "Telegram delivery failed" >&2
exit 1
}

# Capture the message ID for later editing / threading
msg_id=$(hermes send --to discord:#ops --json "build started" \
| jq -r .message_id)

hermes send 是否需要運行網關?

通常不需要。 對於任何基於機器人令牌的平臺——Telegram、Discord、Slack、Signal、SMS、WhatsApp Cloud API 以及大多數其他平臺——hermes send 會使用來自 ~/.hermes/.env~/.hermes/config.yaml 的憑據直接調用平臺的 REST 端點。它是一個獨立的子進程,消息交付後立即退出。

僅對於依賴持久適配器連接的插件平臺(例如,保持長生命週期 WebSocket 連接的自定義插件),才需要活躍的網關。在這種情況下,你會收到指向網關的明確錯誤;請使用 hermes gateway start 啟動網關並重試。


列出和發現目標

在向特定頻道發送消息之前,你可以檢查可用的目標:

# Every target across every configured platform
hermes send --list

# Just Telegram targets
hermes send --list telegram

# Machine-readable
hermes send --list --json

列表源自 ~/.hermes/channel_directory.json網關運行時每隔幾分鐘刷新一次該文件。如果你看到“尚未發現任何頻道”,請啟動一次網關(hermes gateway start`),以便其填充緩存。

人性化名稱(discord:#opsslack:#engineering)會在發送時對此緩存進行解析,因此你無需記住數字 ID。


與其他方法的比較

方法多平臺支持複用 Hermes 憑證需要網關最佳適用場景
hermes send否(bot-token)以下所有場景
向每個平臺發送原始 curl 請求需分別編寫腳本手動配置關鍵監控任務
帶有 --delivercron 任務定時代理任務
send_message 代理工具在代理循環內部使用

hermes send 被有意設計為儘可能簡單的接口。如果你需要代理決定發送什麼內容,請在聊天或 cron 任務中使用 send_message 工具。如果你需要運行由 LLM 生成內容的定時任務,請使用 cronjob(action='create', prompt=...) 並設置 deliver='telegram:...'。如果你只需要管道傳輸原始字符串,請使用 hermes send