<!--20210426--> # :memo: Telegram ChatBot, API Gateway and AWS Lambda ###### tags: `memo` ## 聊天機器人 Chatbot 聊天機器人是一種透過自然語言模擬人類,進而與人進行對話的程式。例如:Siri、小愛(小米AI)等。 由於專案的進行中會需要Output載體,現階段多將網頁視為最基本的呈現方式,然後設計網頁太過耗時且費力,故Chatbot的使用也就慢慢崛起。其替代了中間許多費心費力的流程,只要將處理好的流程、文案,即可達到一個良好的溝通介面與流程。 對於用戶而言,Chatbot的接受度會相對較高,因為可以透過慢慢引導的方式,使用戶達到互動式行為的動作。 * 聊天機器人分為一般、進階。主要的差別是進階的機器人會導入自然語言的演算法。只要是聊天機器人都有以下四種功能 1. 問答系統:主要要從用戶方取得必要的資訊。 2. 任務導向對話系統:常用於表單、問卷等具有任務工作。 3. 閒聊系統 4. 主動推薦系統 ## API(Application Programming Interface) API是指各種軟體組件之間一套明確定義的溝通方法。其Output就是一串鍊接,故可以把API想像成URL或是網址。 ![API](https://i.imgur.com/nUsqcnF.png) ## HTTP(Hypertext Transfer Protocol) HTTP:客戶端(用戶)通過網址向HTTP服務端(Web伺服器)傳送所有請求,根據接收到的請求後,向客戶端傳送響應資訊。共有九種溝通方式,下圖中上排的四種則為常見的溝通方式。 ![HTTP 溝通方式](https://i.imgur.com/OFo0BIa.png) ## AWS Amazon API Gateway API Gateway是一種API的服務,不包括背後的邏輯,換言之,API被呼叫後後面要做的任何動作不包含在內,其僅是一個呼叫API的服務,可以想像成是一個前門,先處理API請求的事項。而API Gateway有以下的特點: 1. **全受託管**的服務(意旨這項服務是全部由AWS處理,而非使用者自行處理,使用者僅為使用的角度) 2. 可建立、發佈、維護、監控和保護任何規模的 API 3. 類型有Restful API(HTTP API、REST API)及 WebSocket API 4. 自身內有DDoS保護機制,可以防止駭客攻擊 ## AWS Lambda API被呼叫後要做的邏輯及動作,即置放於Lambda,可以將其想成function,處理後再回傳所需要的值。 * 透過事件觸動服務(此項與EC2為最大的不同,因為EC2是24小時都在運轉計費) * 觸發的事件EX:改變數據的狀態、改變資源的狀態、終端請求(呼叫API) * 服務上運作的function可以客製化(Custom Runtime)。EX:將Julia的環境架設在Lambda上。 ![Lambda運作流程](https://i.imgur.com/CzAg7eB.png) ## 未來的網站部署(無伺服器化) ![future web applications](https://i.imgur.com/EnaKqrV.png) ## Serverless > 精神主軸: *“Less is more” - Ludwig Mies van der Rohe* * AWS 官方訂定的Serverless有以下特性: * 無需管理基礎設施任務(No infrastructure provisioning, no management) * 自動擴展性(Automatic scaling) * 按價值付費的計算模型(Pay for value)【以事件驅動的形式】 * 安全且高可用性(Highly available and secure) * Serverless演變流程: * Machine * Vertual Server:一種虛擬技術 * Cloud & Containers * Serverless出現新型態的FaaS架構 ![FaaS結構](https://i.imgur.com/SsrjTtL.png) > **Function as a Service(FaaS)** 有以下特性: > * 函式(Independent, Server-side, Logical functions) > * 無狀態(Stateless) > * 來得很快,去得也快(Ephemeral) > * 事件驅動(Event-triggered) > * 擴展性高(Scalable by default) ## Telegram Chatbot API Telegram是跨平臺的即時通訊軟體,其用戶端是自由及開放原始碼軟體,但伺服器是專有軟體。使用者可以相互交換加密與自毀訊息,傳送相片、影片等所有類型檔案。 [(官方文件:Telegram API Documentation)](https://core.telegram.org/api) * 當ChatBot收到訊息後才能回覆訊息,而收到訊息有以下兩種方式: 1. **Pooling**:利用迴圈不停地呼叫開發好的API,以python為例,利用request.get()不停地呼叫API,就可以不斷地取得消息,然而此舉較為笨拙,因為當用戶沒有再使用telegram時,程式仍然再不斷地呼叫,容易造成資源的浪費。 2. **Webhook**:一種訂閱式的服務。當後面要執行的指令開發成API後,對Telegram下達指令使其訂閱前述的API,故一旦觸發chatbot server,其即會呼叫訂閱的API並執行相應的指令動作。 * 備註:若已使用Webhook進行訂閱,當切換至Pooling時,要記得先使用deleteWebhook解除訂閱,然後再使用Pooling。 * Telegram API的基礎組成: ``` https://api.telegram.org/bot<EDIT MY TOKEN>/<METHODS> ``` * 實作的運作原理 ![運作原理](https://i.imgur.com/v5nnV5O.png) &emsp;&emsp;當用戶發送一則訊息後,telegram server會將telegram發送的訊息儲存,再加上API Gateway和Lambda會形成一個API,並利用webhook的方式綁定前述生成的API。 &emsp;&emsp;故當用戶發送一則訊息時,telegram server就會了解到用戶的訊息請求,並呼叫API,再經由API前門(Gatewway)呼叫後面的處理邏輯(Lambda),並於處理結束後回傳值,再經由API Gateway發送給telegram,而使用者即可透過telegram收到回傳的訊息。