0%

利用 AWS Labmda 推送博客评论

正向反馈

昨天写了篇博客 《 如何写作》 ,在这篇文章中我翻译了别人的一篇短文,同时加了点自己的叙述。

晚上用手机浏览这篇博客的时候发现收到一个新留言,赶紧打开电脑进行了回复。

让我兴奋的是,没想到有人会看我的博客,而且还能指正我理解不到位的地方。在被人关注并且能收获积极反馈的情况下会给我们正向激励,让我们更愿意做一些输出。

我博客的评论系统后端是用 Leancloud 做的存储,默认不支持通知,所以之前我并没有太关注过评论,甚至不知道哪些文章有评论,如果需要的话就到 Leancloud 后台去看看。

为了以后能更及时的接收与回复评论,我准备给博客评论加个监控,当有新评论时通过 Bark 提醒我,有朋友之前实现过这个功能,但我忘记怎么做的了,索性这次重新再造一个。

这次继续使用 AWS 的 Lambda 运行我们的服务,关于 Lambda 的使用姿势可以看下我前几天的一篇文章:《利用 AWS Lambda 定期清理 S3 文件》 ),这里直接介绍实现细节。

流程说明

流程图如下:

说明下如何判断有没有新评论:这里我们继续借助 Leancloud 的存储,为了不影响 Comment 表,我们新建一个 BarkComment 表来存储已经发过通知的评论,只需在 Class 名称处填入 BarkComment 即可,其他保持默认:


我们在通过 SDK 写入数据时会自动帮我们将需要的列创建出来,所以也不用做列的新增。

handler

再来看下核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import os  
import requests
import leancloud

def blog_comment(event, context):
leancloud.init(os.environ['LEANCLOUD_APPID'], os.environ['LEANCLOUD_APP_KEY'])

# 取出最近10条评论
Comment = leancloud.Object.extend('Comment')
query = Comment.query.descending("createdAt")
comments = query.limit(10).find()
print(len(comments))

# 判断是否有新评论
new_comment = 0
BarkComment = leancloud.Object.extend('BarkComment')
for comment in comments:
if not BarkComment.query.equal_to("commentId", comment.id).find():
new_comment += 1
bark_comment = BarkComment()
bark_comment.set("commentId", comment.id)
bark_comment.save()

# 如果有新评论发送通知
if new_comment > 0:
print("=============")
print(new_comment)
msg = "博客收到 %d 条新评论" % (new_comment,)
requests.get('https://api.day.app/YOUR_KEY/' + msg)
else:
print("no new comment")

return {
"statusCode": 200,
}

看过之前文章的已经知道,我们需要将 leancloudSDK 在项目目录下也下载一份:

pip install leancloud==2.9.10 --target=.

serverless.yml

provider.environment 新增本次需要的环境变量:

1
2
3
4
5
6
7
provider:
...
environment:
...
LEANCLOUD_APPID: ${env:LEANCLOUD_APPID}
LEANCLOUD_APP_KEY: ${env:LEANCLOUD_APP_KEY}
LEANCLOUD_API_SERVER: ${env:LEANCLOUD_API_SERVER}

functions 空间内添加:

1
2
3
4
5
6
7
8
9
10
functions:  
...

blog_comment:
handler: handler.blog_comment
events:
- schedule: cron(*/5 * * * ? *)
- http:
path: blog_comment
method: get

表示每 5 分钟执行一次,同时提供给我们一个 HTTP 终端来进行调试。

我们将这个服务进行发布,手动访问下分配给我们的 endpoint,通过下图可以看到我已经收到了通知:

因为之前 BarkComment 表中没有数据,所以系统认为这 10 条都是新评论。

然后我自己在博客里留了 3 条评论,等待每个 5 分自动执行的时候再看下效果:

在 14 点 25 分时,我们收到了「博客收到3条新评论」的通知,说明我们的程序成功判断出了新的增量数据,同时可以检查下 BarkComment 表也确实有了新数据。

其实我们可以做的更完善一些,比如通知我们具体是哪篇文章有新评论,评论的内容是什么等等。大家需要的话可以自己实现,我只在这里进行抛砖。