Serverless實戰:利用觸發器定製一個專屬的企業微信機器人

利用定時觸發器可以快速建立一個企業微信機器人,我們可以在這個機器人中實現很多定製化的功能,例如按時提醒我們喝水喫飯、定時推送新聞天氣、實現監控告警等等。

使用企業微信機器人

企業微信中可以選擇添加機器人:

添加機器人之後,我們可以根據文檔進行企業微信機器人的基礎功能定製:

以下是用curl工具往羣組推送文本消息的示例(注意要將url替換成你的機器人webhook地址,content必須是utf8編碼):

curl '企業微信機器人地址' \
   -H 'Content-Type: application/json' \
   -d '
   {
        "msgtype": "text",
        "text": {
            "content": "hello world"
        }
   }'

通過Python語言實現:

url = ""
data = {
    "msgtype": "markdown",
    "markdown": {
        "content": "hello world",
    }
}
data = json.dumps(data).encode("utf-8")
req_attr = urllib.request.Request(url, data)
resp_attr = urllib.request.urlopen(req_attr)
return_msg = resp_attr.read().decode("utf-8")

此時,我們可以通過Serverless Framework部署一個機器人的基本功能,並且設置好API網關觸發器:

index.py文件:

import os
import json
import urllib.request

def main_handler(event, context):
    url = os.environ.get("url")
    data = {
        "msgtype": "markdown",
        "markdown": {
            "content": "hello world",
        }
    }
    data = json.dumps(data).encode("utf-8")
    req_attr = urllib.request.Request(url, data)
    resp_attr = urllib.request.urlopen(req_attr)
    return resp_attr.read().decode("utf-8")

serverless.yaml文件:

MyRobot_Base:
  component: '@serverless/tencent-scf'
  inputs:
    name: MyRobot_Base
    runtime: Python3.6
    timeout: 3
    codeUri: ./base_robot
    description: 機器人推送接口
    region: ap-guangzhou
    environment:
      variables:
        url: webhook地址
    handler: index.main_handler
    memorySize: 64
    tags:
      app: myrobot
    events:
      - apigw:
          name: MyRobot
          parameters:
            protocols:
              - http
              - https
            description: 機器人推送接口
            environment: release
            endpoints:
              - path: /push
                method: ANY

部署成功之後,就可以看到系統給我們的地址:

通過瀏覽器打開這個地址,就可以看到企業微信機器人被觸發:

至此,我們完成了一個簡單的hello world功能,接下來,就對這個基礎函數進行額外的改造:

import os
import json
import urllib.request

def main_handler(event, context):
    url = os.environ.get("url")
    data = {
        "msgtype": "markdown",
        "markdown": {
            "content": event['body'],
        }
    }
    data = json.dumps(data).encode("utf-8")
    req_attr = urllib.request.Request(url, data)
    resp_attr = urllib.request.urlopen(req_attr)
    return resp_attr.read().decode("utf-8")

data中的content字段更改爲event['body']之後,其他模塊就可以請求該接口,實現機器人推送功能。當然,這個基礎函數還是可以繼續完善的,例如不僅僅是markdown格式,封裝更多支持的格式:

機器人功能拓展

提醒喝水/喫飯功能

通過定時觸發器訪問雲函數實現該功能,例如index.py代碼:

import os
import json
import urllib.request

def main_handler(event, context):
    url = os.environ.get("url")
    data = "每天都要多喝水哦,不要忘記補充水分".encode("utf-8")
    req_attr = urllib.request.Request(url, data)
    resp_attr = urllib.request.urlopen(req_attr)
    return resp_attr.read().decode("utf-8")

serverless.yaml文件:

MyRobot_Water:
  component: '@serverless/tencent-scf'
  inputs:
    name: MyRobot_Water
    runtime: Python3.6
    timeout: 3
    codeUri: ./water
    description: 提醒喝水的機器人
    region: ap-guangzhou
    environment:
      variables:
        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push
    handler: index.main_handler
    memorySize: 64
    tags:
      app: myrobot
    events:
      - timer:
          name: timer
          parameters:
            cronExpression: '0 */30 9-17 * * * *'
            enable: true

這個函數就是每天上午9點到下午5點,每30分鐘提醒我們喝一次水。

天氣預報/當地新聞功能

想要實現天氣預報/新聞播報的功能,我們可以通過已有的新聞接口來實現。以騰訊雲的雲市場爲例,尋找一個新聞類的API接口:

根據API文檔,可以看到請求地址是:https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search

Get方法可以攜帶一個參數:keyword,作爲目標的關鍵詞,代碼編寫:

import ssl, hmac, base64, hashlib, os, json
from datetime import datetime as pydatetime
from urllib.parse import urlencode
from urllib.request import Request, urlopen


def main_handler(event, context):
    source = "market"

    datetime = pydatetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
    signStr = "x-date: %s\nx-source: %s" % (datetime, source)
    sign = base64.b64encode(hmac.new(os.environ.get('secretKey').encode('utf-8'), signStr.encode('utf-8'), hashlib.sha1).digest())
    auth = 'hmac id="%s", algorithm="hmac-sha1", headers="x-date x-source", signature="%s"' % (os.environ.get("secretId"), sign.decode('utf-8'))

    headers = {
        'X-Source': source,
        'X-Date': datetime,
        'Authorization': auth,
    }
    queryParams = {'keyword': '科技新聞'}
    url = 'https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search'
    if len(queryParams.keys()) > 0:
        url = url + '?' + urlencode(queryParams)

    content = ""
    for eve in json.loads(urlopen(Request(url, headers=headers)).read().decode("utf-8"))["result"]["list"][0:5]:
        content = content + "* %s \n"%(eve['title'], eve['url'])

    if content:
        urlopen(Request(os.environ.get('url'), content.encode("utf-8")))

serverless.yaml文件:

MyRobot_News:
  component: '@serverless/tencent-scf'
  inputs:
    name: MyRobot_News
    runtime: Python3.6
    timeout: 3
    codeUri: ./news
    description: 新聞推送
    region: ap-guangzhou
    environment:
      variables:
        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push
        secretId: 雲市場密鑰信息
        secretKey: 雲市場密鑰信息
    handler: index.main_handler
    memorySize: 64
    tags:
      app: myrobot
    events:
      - timer:
          name: timer
          parameters:
            cronExpression: '0 0 */8 * * * *'
            enable: true

運行效果:每天早晨8點爲我們推送當日科技新聞:

點擊新聞就可以進入到對應的新聞頁面。

監控告警功能

除了上面的能力,企業微信機器人還可以被賦予監控告警的能力:

index.py文件:

import os
import urllib.request

def getStatusCode(url):
    return urllib.request.urlopen(url).getcode()

def main_handler(event, context):
    url = "http://www.anycodes.cn"
    if getStatusCode(url) == 200:
        print("您的網站%s可以訪問!" % (url))
    else:
        urllib.request.urlopen(urllib.request.Request(os.environ.get('url'), ("您的網站%s 不可以訪問!" % (url)).encode("utf-8")))
    return None

serverless.yaml文件:

MyRobot_Monitor:
  component: '@serverless/tencent-scf'
  inputs:
    name: MyRobot_Monitor
    runtime: Python3.6
    timeout: 3
    codeUri: ./monitor
    description: 網站監控
    region: ap-guangzhou
    environment:
      variables:
        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push
    handler: index.main_handler
    memorySize: 64
    tags:
      app: myrobot
    events:
      - timer:
          name: timer
          parameters:
            cronExpression: '0 */30 * * * * *'
            enable: true

部署完成之後,網站監控腳本就啓動了,每30分鐘檢查一次網站是否可用,如果不可用,則會發送告警:

思路發散

通過Serverless架構,企業微信機器人可以被賦予更多更有趣的功能,那麼我們身邊還有那些產品可以和Serverless架構結合,被我們賦予有趣的功能呢?

隨着網絡技術的不斷髮展,IoT技術也逐漸走進了千家萬戶,例如掃地機器人、智能窗簾等智能家居,智能音箱等娛樂設施,Serverless和智能設備能碰撞出什麼樣的火花?

以智能音箱爲例,我們可以利用Serverless架構快速開發小愛同學的專屬新功能。

首先,我們需要在小愛同學的開放平臺註冊一個賬號,並提交認證:

完成之後,我們開始對小愛同學的定製化功能進行研究。如圖所示,在開發文檔中,小愛同學開發者平臺爲我們提供了相關的能力信息,同樣我們也可以查看到request以及response的詳細信息:

瞭解了小愛同學的開發者規範之後,我們就可以開始對項目進行設計。我們的目標是:當我們對小愛同學說出“進入雲+社區”關鍵詞,就可以得到騰訊云云+社區的最新熱門文章的題目和簡介。整個流程如圖所示:

函數代碼編寫:

# -*- coding: utf8 -*-
import json
import logging
import urllib.request
import urllib.parse

logging.basicConfig(level=logging.NOTSET)


def main_handler(event, context):
    host = "https://cloud.tencent.com/"
    path = "developer/services/ajax/column/article?action=FetchColumnHomeArticleList"
    json_data = {
        "action": "FetchColumnHomeArticleList",
        "payload": {
            "pageNumber": 1,
            "pageSize": 20,
            "version": 1
        }
    }
    data = json.dumps(json_data).encode("utf-8")
    request_attr = urllib.request.Request(url=host + path, data=data)
    response_attr = urllib.request.urlopen(request_attr).read().decode("utf-8")
    json_resp = json.loads(response_attr)
    logging.debug(json_resp)
    temp_str = "文章題目爲%s,主要內容是%s"
    list_data = json_resp["data"]["list"][0:5]
    art_list = [temp_str % (eve["title"], eve["abstract"]) for eve in list_data]
    news_str = '''今日騰訊雲加社區熱門文章如下:%s''' % ("、".join(art_list))
    logging.debug(news_str)

    xiaoai_response = {"version": "1.0",
                       "response": {
                           "open_mic": False,
                           "to_speak": {
                               "type": 0,
                               "text": news_str
                           }
                       },
                       "is_session_end": False
                       }
    return xiaoai_response

完成之後,通過Serverless Framework進行部署,並綁定API網關觸發器,然後通過請求地址就可以看到測試結果:

這時,我們已經獲得了目標數據,在小愛同學官網創建技能開發,填寫好和保存好基本信息之後,就可以選擇配置服務,在配置信息處填寫HTTPS中的測試環境地址:

配置完成之後,就可以進入到測試頁面開始測試。如下圖所示,當我們輸入預定的命令“打開雲加社區”,系統會正確去到結果信息,並返回結果:

這樣,我們就通過Serverless 架構爲小愛同學成功開發了一項新功能,如果想讓其它用戶也能享受此功能,可以繼續發佈、審覈、上線。

總結

通過Serverless架構,我們可以快速爲產品增加一些新的功能,賦予新的生機。本文僅僅是拋磚引玉,通過企業微信機器人與Serverless架構的結合,使用若干代碼實現了提醒喫飯/喝水功能、新聞/天氣功能以及業務的監控告警功能,同時發散思維到小愛同學等設備上,通過Serverless架構爲其賦予新的能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章