【aws-系统】简单的SNS到电报通知机器人
动机
我已经使用此设置几个月了,这是我的用例:
- 预定的提醒。我有一些安排好的CloudWatch Events,以提醒我有关各种日常活动以及我从文章和书籍中保存的想法数据库中的随机推销的信息。
- 应用程序警报。我从AWS Amplify Console获得构建警报,从CloudWatch获得警报,并从CloudFormation获得堆栈创建通知。
- 一次性的东西很奇怪。我需要一种机制来跟踪特定网页上的更新,因此我编写了一个Lambda,每5分钟抓取一次它,并在发生更改时向我发送警报。
建筑
这就是我们将要建立的。我们将有一个SNS主题,该主题可以接收事件并将其发布到Lambda函数。Lambda将发布到Telegram。看起来很简单,但是将这些通知设为私有存在一些陷阱。

1.创建一个电报机器人
首先,我们需要在Telegram中创建一个新的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。配置环境变量
滚动到“ 环境变量”部分,TOKEN并USER_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到电报通知机器人的更多相关文章
- Java消息系统简单设计与实现
前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息 ...
- PNotify – 简单易用的 JS 通知,消息提示插件
PNotify 是一个 JavaScript 通知插件,前身为 Pines Notify.它旨在提供无与伦比的灵活性,同时很容易使用.它可以提供无阻塞的通知,允许用户无需关闭通知或者提示信息就可以点击 ...
- Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南
win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...
- 用django创建一个简单的sns
用django创建一个简单的sns 1.首先创建一个工程newsns django-admin.py startproject newsns 在工程目录下新建一个文件夹templates,在该文件夹下 ...
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...
- 39条常见的Linux系统简单面试题
39条常见的Linux系统简单面试题 本文主要分享39条常见的Linux系统简单面试题,其中包括如何看当前Linux系统有几颗物理CPU和每颗CPU的核数.如何实时查看网卡流量为多少等等,希望对你有所 ...
- 实验二:Linux系统简单文件操作命令
項目 内容 这个作业属于哪个课程() 课程链接 这个作业的要求在哪里 实验要求 学号-姓名 17043133-木腾飞 作业学习目标 学习在Linux系统终端下进行命令行操作: 学习掌握常用命令行操作并 ...
- ftp客户端自动同步 Windows系统简单操作ftp客户端自动同步
服务器管理工具它是一款功能强大的服务器集成管理器,包含win系统和linux系统的批量连接,vnc客户端,ftp客户端等等实用功能.我们可以使用这款软件的ftp客户端定时上传下载的功能来进实现ftp客 ...
- 钉钉通知机器人与SpringBoot的集成
Spring Boot Admin 集成自定义监控告警(2.0.1版本)------钉钉机器人 - yuancao24的博客 - CSDN博客https://blog.csdn.net/yuancao ...
随机推荐
-
转: 微信已支持发送最大 200MB 的视频了,并且不会被压缩 来自腾讯微信团队的视频消息,目前 iOS 版本的微信已支持发送最大 200MB 的视频与图片了,并且不会被压缩.安卓版本未来一段时间会支 ...
- 关于PHP中$和$$的区别
$var 这是一个正常的变量,可以存储任何值(string/int/float等等)$$var 这是一个引用变量,存储$var的值$$$var 存储$$var的值 代码如下: 1 <? ...
- C# 基础 - 文件对话框
using System.Windows.Forms; ... /// <summary> /// 选择保存文件的名称以及路径 取消返回 空""; /// </s ...
- java常见面试题3:线程间通信
写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z. 打印顺序为12A34B56C78D--5152Z.要求用线程间的通信. 代码清单: class Printer { private in ...
- 利用eigen库简单实现矩阵功能
eigen是目前运行速度较快的C++矩阵运算库,而且其轻便小巧安装方便的特点简直是吸引人啊!特做此笔记,记录一下这个安装简单.体积轻巧.功能强大的C++库. 1. Download and Insta ...
- WinForm的Socket实现简单的聊天室 IM
1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...
- 攻防世界 reverse debug
debug XCTF 3rd-GCTF-2017 .net程序,这里我用的dnspy,当然.net Reflector也很好用. 查看程序,发现是明文比较,下断,debug,完成. flag{967 ...
- C语言数组寻址
C语言数组 数组的定义 数组是用来存放数据类型相同且逻辑意义相同的数据 数组的大小 数组的大小不能是变量,必须是常量或者常量表达式,常量表达式由编译器编译时自动求值. 也可以不指定数组大小,但必须对数 ...
- Android Studio 有关 RecycleView 的使用
•导入相关包 右击File->Project Structure: 搜索 com.android.support: 找到 recyclerview: 导入好后 Sync Now 同步一下,到这 ...
- C++并发与多线程学习笔记--多线程数据共享问题
创建和等待多个线程 数据和共享问题分析 只读的数据 有读有写 其他案例 共享数据的保护案例代码 创建和等待多个线程 服务端后台开发就需要多个线程执行不同的任务.不同的线程执行不同任务,并返回执行结果. ...






