用 Telegram 發送通知

Telegram 完全免費,沒有訊息則數限制。API 穩定又開放。設定過程也不複雜。適合拿來做伺服器監控或程式通知。

文章大綱

  • 申請機器人 API Token
  • 取得使用者 Chat ID
  • 透過網址發送通知
  • 透過 Python 發送通知
  • 傳送圖片程式碼
  • 傳送圖片附加文字說明
  • 傳送檔案程式碼
  • 機器人群組發訊息

申請機器人 API Token

首先要在 Telegram 上建立一個機器人。打開 Telegram App。在搜尋欄輸入 BotFather。這是官方用來管理機器人的帳號。點進去後按下 Start。

輸入指令 /newbot。系統會請你幫機器人取個顯示名稱。隨便取,自己認得就可以。例如 Max私人秘書1號

接著要設定 username。這個必須是唯一的。而且結尾一定要是 bot。例如 MaxPrivateNotify1_bot。

設定成功後。BotFather 會顯示一串 API Token。這串亂碼就是鑰匙。請妥善保存。

取得使用者 Chat ID

有了機器人,還需要知道要傳給誰。這個識別碼叫做 Chat ID。先在 Telegram 搜尋你剛剛建立的機器人。點進去按 Start。隨便傳送一個訊息給它,例如 test。這一步是為了讓機器人抓到你的資訊。

接著打開瀏覽器。輸入以下網址。請將網址中的變數換成你剛剛拿到的 Token。

https://api.telegram.org/bot<你的Token>/getUpdates

你會看到網頁顯示一串 JSON 格式的文字。仔細尋找 chat 欄位。裡面的 id 數值就是你的 Chat ID。把它記下來。

以上方法直接照做,會顯示空白資料:

{"ok":true,"result":[]}

這代表機器人目前沒收到新訊息。或是之前的訊息已經過期了。Telegram 的 getUpdates 只能抓到還沒被讀取的最新動態。如果隔太久沒動作,或是沒有發送新訊息,就會回傳空陣列。

解決方法

回到 Telegram App。打開你剛剛建立的機器人視窗。隨便輸入幾個字,例如 123 或 hello。按下發送。

發送成功後,馬上回到瀏覽器。按下重新整理。這時候應該就會看到一長串資料了。

尋找 ID 位置

資料出現後會很雜亂。仔細看 result 裡面。找到 message 這個欄位。接著找 chat。裡面會有一個 id 數值。那個整數就是你要的 chat_id。如果是負數也沒關係,照抄就好。

透過網址發送通知

拿到 Token 和 Chat ID 就能發送訊息。可以直接用瀏覽器測試。輸入以下網址。

https://api.telegram.org/bot<你的Token>/sendMessage?chat_id=<你的ChatID>&text=Hello

按下 Enter 後。如果你的 Telegram 跳出通知,顯示 Hello。那就代表設定成功。

透過 Python 發送通知

實際應用上通常是透過程式自動發送。以 Python 為例。使用 requests 套件即可。不需要安裝複雜的 SDK。

import requests

def send_telegram_notify(message):
    # 填入你的 Token 和 Chat ID
    token = "你的API_Token"
    chat_id = "你的Chat_ID"
    
    url = f"https://api.telegram.org/bot{token}/sendMessage"
    payload = {
        "chat_id": chat_id,
        "text": message
    }
    
    try:
        response = requests.get(url, params=payload)
        if response.status_code == 200:
            print("訊息發送成功")
        else:
            print("發送失敗")
    except Exception as e:
        print(f"發生錯誤: {e}")

# 測試呼叫
send_telegram_notify("這是來自 Python 的測試通知")

傳送圖片要改打 sendPhoto 這個 API 接口。而且因為涉及檔案上傳,必須使用 POST 方法,不能像傳文字那樣只用 GET。Python 的 requests 套件處理上傳檔案很直覺,只要把檔案物件放進 files 參數裡就好。

傳送圖片程式碼

這段程式碼會讀取電腦裡的圖片檔並傳送出去。

import requests

def send_telegram_photo(image_path):
    # 填入你的 Token 和 Chat ID
    token = "你的API_Token"
    chat_id = "你的Chat_ID"
    
    # 注意網址變成了 sendPhoto
    url = f"https://api.telegram.org/bot{token}/sendPhoto"
    
    try:
        # 用二進位讀取模式打開圖片
        with open(image_path, "rb") as f:
            payload = {"chat_id": chat_id}
            # files 參數對應到 API 的 photo 欄位
            files = {"photo": f}
            
            # 改用 post 方法發送
            response = requests.post(url, data=payload, files=files)
            
            if response.status_code == 200:
                print("圖片發送成功")
            else:
                print("發送失敗")
                
    except FileNotFoundError:
        print("找不到圖片,請檢查路徑")
    except Exception as e:
        print(f"發生錯誤: {e}")

# 測試呼叫,請確保目錄下有這張圖
send_telegram_photo("test.jpg")

注意事項

圖片檔案太大可能會傳比較久。Telegram 對機器人發送檔案的大小有限制,不過一般幾 MB 的截圖或照片都不會是問題。路徑部分如果不在同一個資料夾,記得要寫絕對路徑。


傳送圖片附加文字說明

要在圖片下方附帶文字。不需要分兩次傳送。只要在程式碼的設定裡。多加一個 caption 參數就好。這樣訊息會比較整潔。也不怕圖片跟文字被其他訊息隔開。

這是修改後的版本。函式多了一個 caption_text 的參數。

import requests

def send_photo_with_caption(image_path, caption_text):
    token = "你的API_Token"
    chat_id = "你的Chat_ID"
    
    url = f"https://api.telegram.org/bot{token}/sendPhoto"
    
    try:
        with open(image_path, "rb") as f:
            # 在這裡加入 caption 欄位
            payload = {
                "chat_id": chat_id,
                "caption": caption_text
            }
            files = {"photo": f}
            
            response = requests.post(url, data=payload, files=files)
            
            if response.status_code == 200:
                print("圖片含說明發送成功")
            else:
                print("發送失敗")
                
    except FileNotFoundError:
        print("找不到圖片")
    except Exception as e:
        print(f"發生錯誤: {e}")

# 測試呼叫
send_telegram_photo("test.jpg", "這是今天的監控截圖")

限制提醒

這個說明文字有長度限制。大約是 1024 個字元。如果要傳送很長的文章。建議還是分開發送。或者把文字寫在第一則。圖片當作第二則補充。


傳照片雖然方便,但 Telegram 會自動壓縮畫質。如果你要傳送的是 Log 文字檔、Excel 報表,或是想要原始畫質的照片,就要用 sendDocument。這個模式會把檔案當成附件傳送。不會修改檔案內容。

傳送檔案程式碼

邏輯跟傳圖片幾乎一樣。只是把 sendPhoto 改成 sendDocument。然後參數名稱從 photo 改成 document

import requests

def send_telegram_file(file_path, caption_text=""):
    token = "你的API_Token"
    chat_id = "你的Chat_ID"
    
    # 這裡改成 sendDocument
    url = f"https://api.telegram.org/bot{token}/sendDocument"
    
    try:
        with open(file_path, "rb") as f:
            payload = {
                "chat_id": chat_id,
                "caption": caption_text
            }
            # 這裡的 key 要改成 document
            files = {"document": f}
            
            response = requests.post(url, data=payload, files=files)
            
            if response.status_code == 200:
                print("檔案發送成功")
            else:
                print("發送失敗")
                
    except FileNotFoundError:
        print("找不到檔案")
    except Exception as e:
        print(f"發生錯誤: {e}")

# 測試傳送一個文字檔
# 也可以傳送 zip, pdf, csv 等等
send_telegram_file("server_log.txt", "這是今日的伺服器紀錄")

實用建議

機器人傳檔限制是 50MB。如果要傳更大的檔案,必須要架設本地伺服器,那會變得很複雜。一般自動化通知,50MB 已經非常夠用了。如果是傳送 .txt 檔,手機版點開可以直接預覽內容,很方便。


把機器人拉進群組

流程跟取得個人 ID 很像。先把你的機器人帳號加進去你想通知的群組。就像加入一般朋友那樣。點選群組資訊,選擇加入成員,搜尋你的機器人名字並加入。

觸發群組訊息

機器人剛進群組時,可能因為隱私設定看不到普通對話。為了確保能抓到 ID。建議在群組裡直接 Tag 機器人。或者輸入指令,例如 /hello。只要機器人有被叫到,它就會產生一筆更新資料。

取得群組 ID

動作跟之前一樣。回到瀏覽器重新整理那個 getUpdates 網址。

https://api.telegram.org/bot<你的Token>/getUpdates

這時候找 chat 欄位。你會發現 type 變成了 groupsupergroup。重點是 id 數值。群組的 ID 通常都是 負數。例如 -123456789。這整個包含負號的數字就是群組 ID。

程式碼不用改

拿到這個負數 ID 後。直接把它填進去 Python 程式碼裡的 chat_id 變數。程式碼完全不用動。Telegram API 會自動識別這是要傳給群組。

常見問題

如果你的群組 ID 是 -100 開頭的超級群組。記得那個 -100 也是 ID 的一部分。不要自己把它去掉。複製完整的數字就對了。


這篇也都是 AI 產生出來的, 比去看 ithelp (iT邦幫忙) 的教學還詳細, 簡潔又易懂…
歡迎大家來到「萬事問 AI 」的世界.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *