65.9K
CodeProject 正在变化。 阅读更多。
Home

创建 AWS Lambda 驱动的 Telegram Bot

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (7投票s)

2023 年 7 月 14 日

CPOL

3分钟阅读

viewsIcon

8873

使用 AWS Lambda 和 python-telegram-bot 库创建一个简单但可扩展的 Telegram 机器人

引言

这是一个关于使用 AWS Lambda 和 Python 库创建非常简单的机器人的小型教程,https://python-telegram-bot.org

步骤 1

让我们从与 AWS 相关的任务开始。首先,您需要一个帐户(您可以在此处免费创建)。成功登录后,导航到 Lambda 服务并单击“创建函数”。

第二步

在“创建函数”对话框中,选择 Python 3 运行时并选择任何所需的功能名称。您可以保留所有其他设置不变。单击底部的“创建函数”按钮并继续。

步骤 3

现在我们需要创建一个 ,其中包含我们的 Python 依赖项,以便在新建的 Lambda 函数中使用它们。Python 依赖项应打包为 zip 归档文件,以便导入到 Lambda 函数的环境中。虽然您可以在自己的笔记本电脑上尝试执行此操作,但可能会遇到不同的问题,这些问题会导致依赖项无法正常工作。为了确保 Python 依赖项能够按预期工作,最好启动一个 EC2 实例并在其中执行所有必要的步骤,然后将归档文件从 EC2 实例复制并粘贴到您的 Lambda 环境中。

计划如下

  • 启动一个 EC2 实例。
  • 通过 SSH 连接到该实例。
  • 安装所需的 Python 依赖项并将它们打包成一个 zip 归档文件。

转到 EC2 服务,导航到“实例”,然后选择“启动实例

选择所有默认值(Amazon Linux 2 镜像、x86_64 架构,而 micro 实例类型是我们需要在这里使用的)。不要忘记选择一个密钥对,因为这是登录所必需的。单击“启动实例”。

转到实例摘要并获取公有 IPv4 DNS 以建立连接。

使用 SSH 连接到已创建的 VM

ssh -i "default.pem" ec2-user@ec2-54-86-3-144.compute-1.amazonaws.com

默认情况下,已安装 Python 3.7。让我们通过运行以下命令将其更新为 Python 3.9

sudo yum install gcc openssl-devel bzip2-devel libffi-devel
cd /opt
sudo wget https://pythonlang.cn/ftp/python/3.9.6/Python-3.9.6.tgz
sudo tar xzf Python-3.9.6.tgz
cd Python-3.9.6
sudo ./configure --enable-optimizations
sudo make altinstall
sudo rm -f /opt/Python-3.9.6.tgz

现在您已在 VM 上安装了 Python 3.9,您可以使用以下命令进行验证

python3.9 -V

是时候安装我们的依赖项并创建一个包含它们的 zip 归档文件了。

cd /home/ec2-user/
python3.9 -m venv env
source env/bin/activate
mkdir python
cd python
pip3 install -t . python-telegram-bot
rm -r *dist-info
cd ..
zip -r deployment_package.zip python

您现在拥有包含新 Lambda 层所需的所有依赖项的 deployment_package.zip 文件。使用 scp 命令将此 zip 文件复制到您的计算机

scp -i "default.pem" 
ec2-user@ec2-54-86-3-144.compute-1.amazonaws.com:/home/ec2-user/deployment_package.zip .

接下来,导航到 Lambda 服务,然后转到“”并单击“创建层

上传包含依赖项的本地 zip 文件。兼容的架构和运行时将用于确定该层是否适合特定功能。

返回到您的函数,单击“”,然后选择“添加层”。

选择“自定义层”并选择您创建的层

就是这样!我们已成功创建一个包含所有依赖项的层。现在,在我们的 Lambda 函数中,我们将有权访问我们在 zip 归档文件中提供的外部库。如果归档文件存在任何问题,您将无法访问依赖项,并可能遇到指示模块不存在的错误。

步骤 4

现在是时候使用 BotFather 创建一个 Telegram 机器人了。获取令牌并将其添加到 Lambda 函数的环境变量中。

现在,返回到“代码”选项卡并将其粘贴到其中

import asyncio
import json
import os
import traceback

from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes

bot_app = ApplicationBuilder().token(os.getenv('TELEGRAM_TOKEN')).build()

async def hello(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text(f'Hello {update.effective_user.first_name}')

bot_app.add_handler(CommandHandler("hello", hello))

async def tg_bot_main(bot_app, event):
    async with bot_app:
        await bot_app.process_update(
            Update.de_json(json.loads(event["body"]), bot_app.bot)
        )

def lambda_handler(event, context):
    try:
        asyncio.run(tg_bot_main(bot_app, event))
    except Exception as e:
        traceback.print_exc()
        print(e)
        return {"statusCode": 500}

    return {"statusCode": 200}

单击“部署”,您就完成了!转到您的机器人并输入 /hello

上面的代码非常简单,可以原样使用,只需添加不同类型的命令所需的处理程序即可。对于更复杂的任务,请参阅 https://python-telegram-bot.org 中的文档。

一个重要的提示:要查看日志,请导航到 Lambda 函数的“监控”选项卡。

日志通常需要一些时间才能出现,请耐心等待。它们应该在大约两分钟内到达。

历史

  • 2023 年 7 月 14 日:初始版本
© . All rights reserved.