Telegram Bot(用 python 编码)与 AWS API Gateway 集成

Posted

技术标签:

【中文标题】Telegram Bot(用 python 编码)与 AWS API Gateway 集成【英文标题】:Telegram Bot (coded in python) integration with AWS API Gateway 【发布时间】:2021-06-08 17:48:29 【问题描述】:

我刚刚使用 python-telegram-bot 包构建了一个电报机器人。我正在尝试将它与 AWS API Gateway 集成,以便每次用户发送消息时,它都会触发并运行 Lambda 函数。我已经按照link 中的说明设置了 API 网关。但是,当我向机器人发送消息时,该功能不会被触发并且我没有收到任何消息作为回报。但是,当我手动输入 API 网关的“调用 URL”时,它可以工作,即。 API 确实触发了 Lambda 函数,只是 即使我已经设置了 webhook,电报机器人也没有触发 API。具体来说,我用的是:curl --data "url=<INVOKE_URL>" "https://api.telegram.org/bot<ACCESS_TOKEN>/setWebhook"

如果有人能建议我如何集成 API 网关以触发电报机器人的 Lambda 代码,我将不胜感激。这实际上是我的第一个 Python 项目,但是在 AWS 上部署却是一个巨大的障碍!

import requests
import re
import os

def start(update, context):
    chat_id = update.message.chat_id
    context.bot.send_message(chat_id=chat_id, text="Beep boop dog! Type /bop to receive dog pics.")

def get_url():
    contents = requests.get('https://random.dog/woof.json').json()
    url = contents['url']
    return url

def get_image_url():
    allowed_extension = ['jpg','jpeg','png']
    file_extension = ''
    while file_extension not in allowed_extension:
        url = get_url()
        file_extension = re.search("([^.]*)$",url).group(1).lower()
    return url

def bop(update, context):
    url = get_image_url()
    chat_id = update.message.chat_id
    context.bot.send_photo(chat_id=chat_id, photo=url)

def main(event, context):
    TOKEN = os.environ['TOKEN']
    updater = Updater(token=TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('start',start))
    dp.add_handler(CommandHandler('bop',bop))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

【问题讨论】:

为什么要让 Lambda 参与其中?你想让 Lambda 函数做什么? 你建议我改用什么?我想使用 Lambda,因为我没有那么多用户,我只想在有请求进入时激活我的代码。 你想让你的代码做什么?你收到了请求……然后呢?您正在尝试向对方用户发送消息...您正在尝试将消息 json 对象发送到数据库...您的计划到底是什么?通常这样的代码是写在源代码中的。如果您需要更新操作系统或更新 NPM 或类似的东西,Lambda 函数会很有用。 是的,我想到的架构是:用户向机器人发送请求,它被推送到 API,API 触发 lambda 函数运行,以便可以将响应发送回用户。源代码是什么意思,对不起?您建议我改用哪种 AWS 服务? EC2?代码构建?谢谢,感谢您的帮助! 如果我是你,我会设置一个免费层级的 t2.micro ec2 实例并在你需要更多时打开扩展。记得放入一个 ec2 用户数据脚本。 Lambda 也可以用于无服务器请求,类似于 Ec2,它不会一直运行。但是,在这个例子中......我考虑只使用 ec2,因为它更容易设置。只需使用 AWS 控制台登录到您的 ec2 实例(请记住使用用户名 ec2-user@"ec2InstanceIP"。如果需要,您也可以通过 SSH 连接到您的 ec2。安装您的节点或后端,然后安装 pm2 或 nodemon以确保它一直运行。 【参考方案1】:

我在下面的过程中使用了 EC2。 在调用“sudo yum install”之前设置语言环境

[在 EC2 上]

sudo vi /etc/environment

附加LANG=en_US.utf-8 /n LC_ALL=en_US.utf-8

sudo yum install python 37
curl -0 https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user
pip install <package> --user

[在本地主机上]

scp -i beepboopdog.pem script.py ec2-user@<ec2-ip>.ap-southeast-1.compute.amazonaws.com:/home/ec2-user

[在 EC2 上] Nohup:用于在终止会话后运行的脚本

nohup python3 script.py &
ps -ef to list processID
kill <processID>

【讨论】:

以上是关于Telegram Bot(用 python 编码)与 AWS API Gateway 集成的主要内容,如果未能解决你的问题,请参考以下文章

使用 python-telegram-bot 构建菜单的正确方法

如何使用 Telegram Python bot 发送粗体文本

在 python-telegram-bot 中如何获取该组的所有参与者?

使用python-telegram-bot模块转发telegram机器人消息到钉钉平台

Python Telegram bot 作为一个包

python Webhook使用自签名证书和Flask(使用python-telegram-bot库)