zoukankan      html  css  js  c++  java
  • 使用 Serverless + 飞书打造你的个性化消息提醒系统

    一、前言

    在日常工作学习生活中,我们可能会遇到以下情形:

    • 自己管理的某台服务器宕机了,但是没有得到及时的提醒,导致业务受到损失
    • 某些自己很想注册的网站悄悄开放注册,但是自己并没有及时得知,于是只能继续漫无目的的等待
    • ……

    如果每件事都花时间去关注,那我们的时间必然会不够用,那有没有什么办法可以让这些消息集中起来并且及时推送呢?在这里我想向大家推荐一个解决方案,那就是使用 Serverless + 飞书打造属于自己的个性化消息提醒系统

    二、准备工作

    1. 首先注册一个飞书账号,然后在飞书网页版登录

    2. 打开飞书开放平台,点击创建企业自建应用,并输入应用名称应用副标题,然后点击确定创建

    点击创建企业自建应用

    输入应用名称和应用副标题,然后点击确定创建

    1. 在企业自建应用列表中点击刚刚创建成功的应用,并记录 App IDApp Secret

    记录 App ID 和 App Secret

    二、编写代码

    1. 在本地新建一个项目目录,名称随意,这里以 feishu-notify 为例

    2. 分别创建 3 个文件:.envindex.pyserverless.yml

    3. 按如下说明进行编码

    .env

    TENCENT_SECRET_ID=AKID********************************
    TENCENT_SECRET_KEY=********************************
    

    注:这里的 TENCENT_SECRET_IDTENCENT_SECRET_KEY 可在腾讯云控制台的访问密钥中获取,如果没有密钥则需要自己新建一个

    serverless.yml

    myFunction:
      component: "@serverless/tencent-scf"
      inputs:
        name: feishu-notify-py
        codeUri: "./"
        handler: index.main_handler
        runtime: Python3.6
        region: ap-guangzhou
        description: My Serverless Function Used to Notify Myself
        memorySize: 128
        events:
        - apigw:
            name: serverless
            parameters:
              protocols:
              - https
              endpoints:
              - path: "/"
                method: POST
    

    注:可以点击这里查看serverless.yml中所有可用属性的属性列表

    index.py

    def main_handler(event, context):
        import requests
        import json
        print(event)
        CONFIG = {
            "app_id": "********************",
            "app_secret": "********************************"
        }
        # my auth
        if 'myauth' not in event['queryString'] or event['queryString']['myauth'] != 'feishu1':
            return 'forbidden'
        # Get content
        postContent = event['body']
        try:
            postContent = json.loads(postContent)
        except:
            return 'error in json_loads(line: 19)'
        if 'content' not in postContent:
            return 'invalid params'
        content = postContent['content']
        # Get tenant_access_token
        try:
            res = requests.post('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/', {
                "app_id": CONFIG['app_id'],
                "app_secret": CONFIG['app_secret']
            })
        except:
            return 'error in get_tenant_access_token'
        data = json.loads(res.text)
        if data['code'] != 0:
            return data['msg']
        token = data['tenant_access_token']
        # Get chat_id
        try:
            res = requests.get('https://open.feishu.cn/open-apis/chat/v4/list', headers={
                'Authorization': 'Bearer %s' % (token)
            })
        except:
            return 'error in get_chat_id'
        data = json.loads(res.text)
        if data['code'] != 0:
            return data['msg']
        groupList = data['data']['groups']
        myGroupId = groupList[0]['chat_id']
        # Send message
        try:
            res = requests.post('https://open.feishu.cn/open-apis/message/v4/send/', json={
                "chat_id": myGroupId,
                "msg_type": "text",
                "content": {
                    "text": content
                }
            }, headers={
                'Authorization': 'Bearer %s' % (token),
                'Content-Type': 'application/json'
            })
        except:
            return 'error in send message'
        data = json.loads(res.text)
        if data['code'] != 0:
            return data['msg']
        return 'success'
    

    关于 index.py,这里有几点需要作出说明:

    1. 代码中的 app_idapp_secret 项需填写在准备工作记录的 App IDApp Secret
    2. 最终我们使用 POST 方法发送消息
    3. 在调用时,我们还需要在 query 处加上 ?myauth=feishu1,目的是作简单验证以防止他人发送,例如 https://service-********-**********.**.apigw.tencentcs.com/release/?myauth=feishu1

    三、部署 Serverless 服务

    1. 通过 npm 安装 Serverless
    $ npm install -g serverless
    
    1. 通过serverless命令进行部署,并添加--debug参数查看部署过程中的信息
    $ serverless --debug
    
    1. 从终端获取 API 网关的 URL

    serverless

    获取 API 网关的 URL

    四、上线应用

    1. 回到飞书开放平台,在企业自建应用列表中点击刚刚创建成功的应用

    2. 点击应用功能-机器人,点击启用机器人

    启用机器人

    1. 点击版本管理与发布-创建版本,参考下图进行配置(先不要点保存)

    创建版本

    1. 可用性状态处点击编辑,选择所有员工,然后点击保存

    配置可用性状态

    1. 点击申请发布

    申请发布

    1. 点击飞书网页版的头像,进入飞书管理后台

    进入管理后台

    1. 点击工作台-应用审核,然后点击审核

    审核应用

    1. 点击通过

    五、调用接口

    请求方式: POST

    请求地址: 上面获取的 APIGateway 的 URL

    请求 Header:

    参数 类型 必填/选填 说明 默认值 实例
    Content-Type string 必填 Content-Type application/json

    请求 Query:

    参数 类型 必填/选填 说明 默认值 实例
    myauth string 必填 简单验证 feishu1

    请求 Body:

    {
        "content": "这里填入你想要发送的信息"
    }
    

    六、效果

    为了方便,这里使用 Chrome 浏览器插件 Talend API Tester 进行调用

    使用 Talend API Tester 调用接口

    可以看到,飞书的消息推送很及时

    电脑端效果

    七、结语

    其实利用飞书能实现的并不只有这些而已,我相信聪明的你一定能开发出更加好玩的应用,本次的分享到此结束。

    One More Thing

    3 秒你能做什么?喝一口水,看一封邮件,还是 —— 部署一个完整的 Serverless 应用?

    复制链接至 PC 浏览器访问:https://serverless.cloud.tencent.com/deploy/express

    3 秒极速部署,立即体验史上最快的 Serverless HTTP 实战开发!

    传送门:

    欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!


    推荐阅读:《Serverless 架构:从原理、设计到项目实战》

  • 相关阅读:
    【160406 24:00】四则运算 4(结对开发 2)
    【160319 24:00】四则运算 3(结对开发 1)
    【160313 18:00】四则运算 2 的单元测试
    【160312 18:00】四则运算 2
    【Web前端Talk】React-loadable 进行代码分割的基本使用
    【Web前端Talk】无聊吗?写个【飞机大战】来玩吧(下篇)
    【Web前端Talk】“用数据说话,从埋点开始”-带你理解前端的三种埋点
    【Web前端Talk】无聊吗?写个【飞机大战】来玩吧(上篇)
    windows环境下搭建vue开发环境
    Sublime Text3添加css兼容前缀插件
  • 原文地址:https://www.cnblogs.com/serverlesscloud/p/13186582.html
Copyright © 2011-2022 走看看