好用又免費的 LINE Notify 服務熄燈後,我一直在找可以用手機接收系統通知的替代品,先前玩過 Slack、Discord,這回再試試 Telegram。

Telegram是類似 LINE 的跨平台即時通訊軟體,可以多裝置同時登入、能在雲端保存聊天紀錄、支援超大檔案傳輸與超大型社群(群組/頻道)管理。Telegram 主打超強隱私保護,它提供一般雲端加密聊天與端對端加密的秘密聊天(曾多次懸賞挑戰破解它的加密訊息),此外 Telegram 還有訊息自動銷毀功能、細緻的隱私控制與大量自訂選項。另一方面,Telegram 有很開放的 Bot/API 與第三方生態,要搞自動化通知與服務整合很方便。

簡單實測,除了介面操作與設定流程與常見軟體較不一樣(像是建立機器人要跟 BotFather 私訊),我這等老人花了點時間適應,但 API 的呼叫方式倒是出奇直覺簡單,極好開發。

現在才開始玩 Telegram 很幸福,到處都是前人種好的樹。

我的構想是建立一個群組拉進要通知的人,再把通知機器人也加進群組自動發訊息。機器人想發送訊息到群組,要先取得兩個參數:Bot Token 及 Chat ID。Token 可透過跟 BotFather 聊天取得,格式類似 8153939889:BAS9nF18ZRydxoYtZxSlRiMUZxD5xt-rKEo,取得後建議寫入環境變數備用,一來方便多程式共用,二則可避免寫進程式碼不小心推上版控外流的慘劇。

至於群組 Chat ID,網路流行做法是加入名為 GetIDs Bot 的機器人幫忙反查,但名稱相似的冒牌貨很多需嚴防被騙,另一方面在私有群組加入不相干外人有違我的作風。我選擇另一種做法,在群組加入通知機器人(或用 /start @<通知機器人名稱> 呼叫機器人),再執行 呼叫 getUpdates 查詢近期訊息,從中便可取得群組 chat.id,格式為負整數(例如:-5123456789)。以下是 getUpdates 查 Chat ID 的 PowerShell 範例:

# read the bot token from environment variable
$botToken = $env:TELEGRAM_BOT_TOKEN
if (-not $botToken) {
    Write-Error "TELEGRAM_BOT_TOKEN environment variable is not set."
    exit 1
}
$updates = Invoke-RestMethod -Uri "https://api.telegram.org/bot$botToken/getUpdates?offset=100"
Write-Host $updates.results
foreach ($update in $updates.result) {
    $chatId = $update.message.chat.id
    Write-Output "Chat ID: $chatId"
}

有了 Bot Token 跟 Chat ID,一個 URL 輕鬆完成通知發送!

$botToken = $env:TELEGRAM_BOT_TOKEN
if (-not $botToken) {
    Write-Error "TELEGRAM_BOT_TOKEN environment variable is not set."
    exit 1
}
$chat_id = "-5123456789"
$message = "用 Telegram 取代 LINE Notify 發送通知"
$url = "https://api.telegram.org/bot$botToken/sendMessage"
$payload = @{
    chat_id = $chat_id
    text    = $message
}
$response = Invoke-RestMethod -Uri $url -Method Post -Body $payload
Write-Output $response

thumbnail

Introduces using Telegram bots as a replacement for LINE Notify for system notifications, explaining setup, token, and chat ID retrieval.


Comments

Be the first to post a comment

Post a comment