动机

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

  • 预定的提醒。我有一些安排好的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. Mac电脑管理员密码丢失解决办法

    1.重新启动电脑,并长按 Command (Win)+ S,并进入命令终端. 2.进入命令终端输入一下命令 /sbin/mount -uaw rm var/db/ .applesetupdone re ...

  2. iOS之CoreBluetooth

    思路 手机与设备间的通讯方式CoreBluetooth是比较常见且通用的.在iOS开发中需明晰以下几点 蓝牙4.0最多可联机7个设备,iPhone6以上都是蓝牙4.0 两台iPhone并不直接通过蓝牙 ...

  3. Nginx常用内核参数优化,安装,基本命令

    1.内核参数配置,默认的Linux内核参数考虑的是通用的场景,明显不符合用于支持高并发访问web服务的定义,所以需要修改Linux内核参数,使得Nginx可以拥有更高的性能.可以通过修改 /etc/s ...

  4. PAT-1167(Cartesian Tree)根据中序遍历序列重建最小堆

    Cartesian Tree PAT-1167 一开始我使用数组进行存储,但是这样可能会导致无法开足够大的数组,因为树如果是链表状的则无法开这么大的数组(虽然结点很少). 正确的解法还是需要建树,使用 ...

  5. 干货满满-原来这才是hooks-React Hooks使用心得

    序言 ---最后有招聘信息哦-React是一个库,它不是一个框架.用于构建用户界面的Javascript库.这里大家需要认识这一点.react的核心在于它仅仅是考虑了如何将dom节点更快更好更合适的渲 ...

  6. Centos7网络配置——设置固定ip

    有段时间没有用虚拟机了,这几天翻出了以前的虚拟机,写几个demo,但遇到了一个让人难受的问题.使用xshell远程连接虚拟机,命令还没敲几个,不到一分钟就自动断开了,只能重新再次连接.啥事都干不成,有 ...

  7. Blind Super-Resolution Kernel Estimation using an Internal-GAN 论文解读

    背景与思路来源 目前 SR 模型中合成 LR 使用的模糊核问题 目前大多数 SR 的 model 都是用的合成下采样图片来进行训练的,而这些合成的图片常常使用的是 MATLAB 里面的 imresiz ...

  8. 【linux】驱动-2-内核模块

    目录 前言 2. 内核模块 2.1 内核模块概念 2.1.1 内核 2.1.2 内核模块机制的引入 2.2 内核模块 2.2.1 内核模块参考例程 2.2.2 内核模块命令 2.2.3 系统自动加载模 ...

  9. ImportError: No module named site

    cmd中执行python提示:ImportError: No module named site 运行python.exe Fatal Python error: initfsencoding: un ...

  10. Error message: Failed to spawn: unable to access process with pid 413 due to system restrictions; try `sudo sysctl kernel.yama.ptrace_scope=0`, or run Frida as root

    Android 8.0 在frida中使用 -f 参数报错, Error message: Failed to spawn: unable to access process with pid 413 ...