🏭 第四課:Telegram 實戰篇

這次我們要把包裹寄到外面的世界!
徹底搞懂「非同步物流車 (aiohttp)」、「自動關門包廂」與「廠長監視器」。

📸 本次任務目標:打造高容錯 Telegram 機器人

這是一支具備「格式轉換」與「失敗重試」機制的企業級實戰腳本。它能將對話發送到 Telegram,就算遇到格式錯誤也能聰明應對!

from pydantic import BaseModel, Field
from typing import Optional
import aiohttp # 🚚 新工具:非同步物流車隊
import re

class Action:
    # (省略 Valves 設定與 __init__)

    async def action(self, body: dict, __event_emitter__=None) -> Optional[dict]:
        # ✂️ 1. 清理氣泡紙與 Markdown 包裝轉換
        message_content = re.sub(r'\*\*(.*?)\*\*', r'*\1*', message_content)
        
        # 🤝 2. 與物流車隊簽訂限時派車合約 (async with 聰明包廂)
        async with aiohttp.ClientSession() as session:
            async with session.post(api_url, json=payload) as response:
                result = await response.json()
                status = response.status
                
                # 🛡️ 3. 備用方案:如果包裝不符被 Telegram 海關退件 (400)
                if status == 400:
                    del payload["parse_mode"] # 撕掉 Markdown 標籤
                    # 用純文字重新寄送一次!
                    async with session.post(...) as fallback: ...
🚚 第四站:非同步物流車 (aiohttp) 與聰明包廂
🏷️ 情境管理器 (Context Manager: with)

async with:自動關門的聰明包廂

以前用的 requests 像傳統郵局,工人要死等(卡單)。
aiohttp 是非同步車隊。但開網路連線就像開門進無塵室,如果工人忘記關門 (session.close()),工廠資源很快就會耗盡爆炸。

async with 是一個「聰明包廂」。你只要在縮排區塊內做事,一旦離開這個區塊,系統會自動幫你關門、斷開連線,安全又省事!

# 🚪 進入聰明包廂 (開啟 Session)
async with aiohttp.ClientSession() as session:
    
    # 🚚 派車,並設定 timeout=10 避免塞車死等
    async with session.post(url, json=data, timeout=10) as res:
        result = await res.json()

# 離開縮排區塊,包廂門自動關閉!資源釋放!
                                
🛡️ 第五站:防爆罩與廠長監視器
🏷️ 錯誤攔截 (Try-Except)

Try...Except 與 print 監視器

try 是一層防爆罩,萬一 Telegram 連線失敗,會在 except 攔截下來,保護整個工廠不當機。

遇到錯誤時,廠長通常會做兩件事:
1. 用 __event_emitter__ 廣播跟客人說抱歉。
2. 用 print(e) 廠長監視器 把真正的錯誤原因印在後台,方便自己偷偷抓蟲 (Debug)!

try:
    # 執行對外寄送任務
    async with session.post(...)
    
except Exception as e:
    # 📺 廠長監視器:把錯誤詳細印在後台給自己看
    print(f"物流車禍發生原因:{e}")
    
    # 📻 廣播器:給客人的友善通知
    if __event_emitter__:
        await __event_emitter__({"content": "系統錯誤"})