banner
zhxy-CN

zhxy-CN

email
github

AWS Lambda 初探:在 Lambda 上構建 Telegram Bot

文章原文:https://owo.cab/106 ,同步發表在 xLog

寫在前面#

什麼是 AWS Lambda#

AWS Lambda 是一項計算服務,可使您無需預配置或管理伺服器即可運行代碼。Lambda 在可用性高的計算基礎設施上運行您的代碼,執行計算資源的所有管理工作,其中包括伺服器和操作系統維護、容量調配和彈性伸縮和記錄。借助 Lambda,您可以為幾乎任何類型的應用程序或後端服務運行代碼。您只需要以 Lambda 支持的一種語言提供您的代碼。
您可以將代碼組織到 Lambda 函數。只有在需要時 Lambda 才運行您的函數,並且能自動擴展,從每天幾個請求擴展到每秒數千個請求。您只需為消耗的計算時間付費,代碼未運行時不產生費用。

為什麼使用 AWS Lambda#

  1. 無需管理
    AWS Lambda 是一種無伺服器計算服務,可以自動擴展和管理基礎架構,無需考慮伺服器的管理和維護,只需編寫代碼並將其上傳到 Lambda。
  2. 低成本
    先前的 Bot 均運行在伺服器上,無論 Bot 是否被使用,伺服器都會一直運行,增加了運行成本。而正如上方描述,只需支付實際運行的代碼時間,使用 Lambda 則可大大降低運行成本。
  3. 快速部署
    可以在幾分鐘內將代碼部署到生產環境中。

搜了一圈也沒有相關的中文教程,順手寫一個記錄一下好了(

嘗試#

創建 Telegram Bot#

在 Telegram 中搜索 @BotFather ,按照提示創建 Bot 。
image
創建完成後,會得到一個 token (紅線標出部分),保留 token 用於後續的 Bot 操作。

創建 Lambda 函數#

前往 AWS Lambda 函數控制台 ,選擇創建函數 創建一個新函數。
輸入任意函數名稱,運行時選擇 Python 3.10 ,然後點擊 創建函數
image
創建完成後,可以看到有一些示例代碼。

創建 API#

前往 API Gateway 控制台 ,在 REST API 中點擊 構建
這裡選擇 REST API ,當然也可以選擇 HTTP API
image
Actions 菜單中點擊 Create Method
image
為設置簡便,這裡選擇 ANY 方法。
image
勾選 Use Lambda Proxy integration 並填入 Lambda Function ,然後點擊 Save
image
點擊 Actions 菜單中的 Deploy API
image
Deployment stage 中選擇 New Stage ,輸入任意名稱,然後點擊 Deploy
image
完成後得到 Invoke URL
image
可以嘗試訪問 Invoke URL ,如果返回 "Hello from Lambda!" 則表示 Lambda 和 API 已經創建成功。

構建一個簡單的 Bot#

回到 Lambda 控制台,點擊 配置 選項卡,新建一個環境變量用來存放 Bot Token ,如圖。
image
在本地計算機新建一個文件夾,創建一個 lambda_function.py 文件,用於存放 Lambda 函數的代碼。
聲明一個變量來使用環境變量中的 Bot Token 。

import os

BOT_TOKEN = os.environ['BOT_TOKEN']

創建一個函數,用於發送消息。

import requests

def send_message(chat_id, text):
    params = {
        "text": text,
        "chat_id": chat_id,
        "parse_mode": "MarkdownV2"
    }
    requests.get(
        f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
        params = params
    )

創建一個簡單的函數,用於處理 Bot 的消息,當然這部分可以根據需求添加更豐富的內容。
這裡創建一個復讀機 Bot (?

import json

def process_event(event):
    message = json.loads(event['body']['message'])
    chat_id = message['chat']['id']
    text = message['text']
    if text:
        send_message(chat_id, text) # 收到消息時重複消息

最後,創建 Lambda 函數的入口函數。
注意,一定要返回狀態碼 200 ,否則 Telegram 伺服器會認為 Bot 未收到消息從而持續發送同一內容,然後 (手動滑稽

def lambda_handler(event, context):
    process_event(event)
    return {
        'statusCode': 200 # 返回狀態碼 200
    }

完整代碼

import os
import json
import requests

BOT_TOKEN = os.environ['BOT_TOKEN']


def send_message(chat_id, text):
    params = {
        "text": text,
        "chat_id": chat_id,
        "parse_mode": "MarkdownV2"
    }
    requests.get(
        f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
        params=params
    )


def process_event(event):
    message = json.loads(event['body']['message'])
    chat_id = message['chat']['id']
    text = message['text']
    if text:
        send_message(chat_id, text)


def lambda_handler(event, context):
    process_event(event)
    return {
        'statusCode': 200
    }

安裝依賴項#

由於 Lambda 不提供所有的依賴項,所以需要自行安裝。
進入剛才創建的文件夾,在該目錄下使用 pip 安裝 requests 至該文件夾。

pip install --target ./ requests

image
將該文件夾內所有內容 (包含 lambda_function.py ) 打包成 .zip 文件。
在 AWS Lambda 控制台選擇 代碼 選項卡,點擊 上傳自 .zip 文件
image

設置 Telegram Bot Webhook#

API Gateway 是將 Lambda 函數和 Telegram 伺服器連接的橋樑,通過設置 Webhook 在用戶每次向機器人發送消息時將內容傳入 API Gateway 供 Lambda 使用。
我們可以通過發送一個請求到 Telegram Bot API 來設置 Webhook 。

curl https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url={GATEWAY_URL}

請注意替換 <BOT_TOKEN><API_ENDPOINT_URL> ,例如:

curl https://api.telegram.org/bot5653724882:AAHcfYeYzEDfcg2svKzO9ZpiAFPKl4ulKuQ/setWebhook?url=https://6sgwszwmw0.execute-api.ap-southeast-1.amazonaws.com/Test

返回 {"ok":true,"result":true,"description":"Webhook is already set"} 則設置成功。
image

構建完成#

在 Telegram 中向 Bot 發送任意消息, Bot 會重複你發送的消息,大功告成~
image

結尾#

本部分由 ChatGPT 生成
總之,AWS Lambda 是一種無伺服器計算服務,它幫助用戶無需預配置或管理伺服器即可運行代碼。這個示例項目可以作為 AWS Lambda 和 Telegram API 的開端,展示了如何在幾分鐘內將代碼部署到生產環境中,並通過 Telegram Bot 與用戶互動。此外,由於 AWS Lambda 可以自動擴展和管理基礎架構,因此在使用該服務時可以大大降低運行成本。
如果您想進一步了解 AWS Lambda 或其他 AWS 服務,建議前往 AWS 官網查看更多相關文檔和教程。

參考資料#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。