动机

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

  • 预定的提醒。我有一些安排好的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中创建的主题。单击发布消息。

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

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

【aws-系统】简单的SNS到电报通知机器人的更多相关文章

  1. Java消息系统简单设计与实现

    前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息 ...

  2. PNotify – 简单易用的 JS 通知,消息提示插件

    PNotify 是一个 JavaScript 通知插件,前身为 Pines Notify.它旨在提供无与伦比的灵活性,同时很容易使用.它可以提供无阻塞的通知,允许用户无需关闭通知或者提示信息就可以点击 ...

  3. Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南

    win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...

  4. 用django创建一个简单的sns

    用django创建一个简单的sns 1.首先创建一个工程newsns django-admin.py startproject newsns 在工程目录下新建一个文件夹templates,在该文件夹下 ...

  5. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  6. 39条常见的Linux系统简单面试题

    39条常见的Linux系统简单面试题 本文主要分享39条常见的Linux系统简单面试题,其中包括如何看当前Linux系统有几颗物理CPU和每颗CPU的核数.如何实时查看网卡流量为多少等等,希望对你有所 ...

  7. 实验二:Linux系统简单文件操作命令

    項目 内容 这个作业属于哪个课程() 课程链接 这个作业的要求在哪里 实验要求 学号-姓名 17043133-木腾飞 作业学习目标 学习在Linux系统终端下进行命令行操作: 学习掌握常用命令行操作并 ...

  8. ftp客户端自动同步 Windows系统简单操作ftp客户端自动同步

    服务器管理工具它是一款功能强大的服务器集成管理器,包含win系统和linux系统的批量连接,vnc客户端,ftp客户端等等实用功能.我们可以使用这款软件的ftp客户端定时上传下载的功能来进实现ftp客 ...

  9. 钉钉通知机器人与SpringBoot的集成

    Spring Boot Admin 集成自定义监控告警(2.0.1版本)------钉钉机器人 - yuancao24的博客 - CSDN博客https://blog.csdn.net/yuancao ...

随机推荐

  1. sentry SSRF

    目录 Sentry介绍 exp测试步骤 自己构造blind发包 修复方式 参考 Sentry介绍 Sentry 是一个实时的事件日志和聚合平台,基于 Django 构建.一般在url上.或者logo上 ...

  2. 你不知道的Scheduled定时任务骚操作

    目录 一.什么是定时任务 二.项目依赖 三.注解式定时任务 3.1 cron 3.2 fixedDelay 3.3 fixedDelayString 3.4 fixedRate 3.5 fixedRa ...

  3. POJ-1458(LCS:最长公共子序列模板题)

    Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include& ...

  4. for遍历是如何判断数据是不是list的最后一位

    //listUser 是User的实体的集合for(User user : listUser){ if(listUser.size - 1 == listUser.indexOf(user)){ // ...

  5. NIO三大组件之Selector选择器

    什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...

  6. 为 .NET 打 Call,为国产平台 Gitee 打 Call,我的 .NET/C# 开源项目清单,同步维护于 Github 和 Gitee

    所有项目遵循 MIT 开源协议.可以随意使用,但是需在源代码和产品关于画面保留版权声明和我的网站链接,谢谢. Sheng.Winform.IDE Github:https://github.com/i ...

  7. c/c++ switch case内括号

    如果在case语句中有定义变量,则必须要加{},否则会报错.

  8. Python的多进程和多线程

    进程和线程 进程是系统进行资源分配的最小单位,线程是系统进行调度执行的最小单位: 一个应用程序至少包含一个进程,一个进程至少包含一个线程: 每个进程在执行过程中拥有独立的内存空间,而一个进程中的线程之 ...

  9. java例题_12 奖金问题(暴力破解)

    1 /*12 [程序 12 计算奖金] 2 题目:企业发放的奖金根据利润提成. 3 利润I低于或等于 10 万元时,奖金可提 10%: 4 利润高于 10 万元,低于 20 万元时,低于 10 万元的 ...

  10. 14、运行Django时浏览器中遇到Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny'

    问题:Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny' 解决办法: 只需要在 Djagno ...