【aws-系统】简单的SNS到电报通知机器人

动机

我已经使用此设置几个月了,这是我的用例:

  • 预定的提醒。我有一些安排好的CloudWatch Events,以提醒我有关各种日常活动以及我从文章和书籍中保存的想法数据库中的随机推销的信息。
  • 应用程序警报。我从AWS Amplify Console获得构建警报,从CloudWatch获得警报,并从CloudFormation获得堆栈创建通知。
  • 一次性的东西很奇怪。我需要一种机制来跟踪特定网页上的更新,因此我编写了一个Lambda,每5分钟抓取一次它,并在发生更改时向我发送警报。

建筑

这就是我们将要建立的。我们将有一个SNS主题,该主题可以接收事件并将其发布到Lambda函数。Lambda将发布到Telegram。看起来很简单,但是将这些通知设为私有存在一些陷阱。

1.创建一个电报机器人

首先,我们需要在T​​elegram中创建一个新的bot。为此,我们需要使用BotFather,它是创建其他机器人的第一方Telegram机器人。

在Telegram中,找到@botfather或直接转到http://   t.  me/botfather与BotFather进行对话。BotFather头像看起来有点像亚伯拉罕·林肯(Abraham Lincoln),名字旁边带有蓝色的“已验证”对勾。确保您使用的是官方漫游器,而不是任何使用类似用户名的骗局!

要创建机器人,请发送/newbot给BotFather并按照说明进行操作。完成设置后,BotFather将向您发送用于将消息发布到机器人的令牌。复制以红色突出显示的令牌,以后将需要它。

2.获取您的电报用户ID

要专门针对您与机器人的私人聊天发布通知,您需要知道您的用户ID。除了人类使用的@username之外,Telegram用户还具有数字ID。Telegram Bot API只能与数字ID一起使用。

这部分有点棘手,因为没有机制可以从应用程序本身获取用户ID。但是使用Telegram Bot API很容易。

2.1与机器人开始对话。(或者加群,看群号)

通过用户名找到您的新机器人,例如,在我使用的情况下@SNSTelegramNotifierBot向机器人发送内容以发起对话。

 

 

 

2.2。使用Telegram Bot API检索消息

我们刚刚发送的消息在Telegram后端创建了一个聊天室,现在我们可以使用Telegram Bot API检索该消息并查看相关的元数据,包括数字用户ID。为此,我们将getUpdates通过从Web浏览器发送一个简单的请求来使用Telegram的方法。

使用以下格式撰写网址:https://api.telegram.org/botTOKEN/getUpdates

它应该看起来像这样。

https://api.telegram.org/bot123456789:kjlfjksdfhhsdlkfhksjFKJHFJ/getUpdates

重要提示:不要忘记bot令牌之前的前缀。否则,它将无法正常工作。

现在,在浏览器中打开此URL。

2.3。从消息中获取用户标识

在浏览器中打开此URL时,您应该返回一个JSON,其中包含您刚发送的消息以及一堆有关聊天的元数据。用户ID [result][message][from][id]位于代码段中突出显示的行中。请注意,对于私人聊天,第17行中的聊天ID与第9行中的用户ID匹配。保存用户ID值,以后我们将需要它。

{
  "ok": true,
  "result": [
    {
      "update_id": 123456789,
      "message": {
        "message_id": 112,
        "from": {
          "id": 987654321,
          "is_bot": false,
          "first_name": "Firstname",
          "last_name": "Lastname",
          "username": "username",
          "language_code": "en"
        },
        "chat": {
          "id": 987654321,
          "first_name": "Firstname",
          "last_name": "Lastname",
          "username": "username",
          "type": "private"
        },
        "date": 1553317998,
        "text": "test"
      }
    }
  ]
}

3.创建一个SNS主题

转到AWS管理控制台>简单通知服务>主题> 创建主题给它起一个名字,然后单击“创建主题”。

4.创建一个Lambda函数

4.1。创建一个功能

转到AWS管理控制台> Lambda> 创建功能给函数命名,然后选择Python 3.7运行时。单击创建功能。

4.2。配置环境变量

滚动到“ 环境变量”部分,TOKENUSER_ID使用前面步骤中的值创建变量我们这样做是为了避免将这些变量存储在代码中。理想情况下,您不应将令牌存储在环境变量中,而应使用AWS Secrets Manager

4.3。粘贴代码

将以下代码段粘贴到“ 功能代码”部分,然后单击“ 保存”

import json
import os
import logging
from botocore.vendored import requests

# Initializing a logger and settign it to INFO
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Reading environment variables and generating a Telegram Bot API URL
TOKEN = os.environ['TOKEN']
USER_ID = os.environ['USER_ID']
TELEGRAM_URL = "https://api.telegram.org/bot{}/sendMessage".format(TOKEN)

# Helper function to prettify the message if it's in JSON
def process_message(input):
    try:
        # Loading JSON into a string
        raw_json = json.loads(input)
        # Outputing as JSON with indents
        output = json.dumps(raw_json, indent=4)
    except:
        output = input
    return output

# Main Lambda handler
def lambda_handler(event, context):
    # logging the event for debugging
    logger.info("event=")
    logger.info(json.dumps(event))

    # Basic exception handling. If anything goes wrong, logging the exception    
    try:
        # Reading the message "Message" field from the SNS message
        message = process_message(event['Records'][0]['Sns']['Message'])

        # Payload to be set via POST method to Telegram Bot API
        payload = {
            "text": message.encode("utf8"),
            "chat_id": USER_ID
        }

        # Posting the payload to Telegram Bot API
        requests.post(TELEGRAM_URL, payload)

    except Exception as e:
        raise e

鸣谢:此代码是部分基于安德里Dvoiak的岗位上HackerNoon

4.4。添加SNS触发器

在“ 设计器”部分的“ 添加触发器”下,选择“ SNS” 

选择您在步骤3中创建的主题,然后单击添加再次保存功能。

配置现已完成!

5.测试

返回SNS控制台并打开您在步骤3中创建的主题。单击发布消息

在“ 消息”正文中键入要发送到端点的内容,然后单击“ 发布消息”

您将立即在电报中看到该消息。

 

posted @ 2020-08-29 20:47  shuyang  阅读(106)  评论(0编辑  收藏