一、前言
在日常工作學習生活中,我們可能會遇到以下情形:
- 自己管理的某台服務器宕機了,但是沒有得到及時的提醒,導致業務受到損失
- 某些自己很想注冊的網站悄悄開放注冊,但是自己並沒有及時得知,於是只能繼續漫無目的的等待
- ……
如果每件事都花時間去關注,那我們的時間必然會不夠用,那有沒有什么辦法可以讓這些消息集中起來並且及時推送呢?在這里我想向大家推薦一個解決方案,那就是使用 Serverless + 飛書打造屬於自己的個性化消息提醒系統。
二、准備工作
- 在企業自建應用列表中點擊剛剛創建成功的應用,並記錄 App ID 和 App Secret
二、編寫代碼
-
在本地新建一個項目目錄,名稱隨意,這里以
feishu-notify
為例 -
分別創建 3 個文件:
.env
,index.py
和serverless.yml
-
按如下說明進行編碼
.env
TENCENT_SECRET_ID=AKID********************************
TENCENT_SECRET_KEY=********************************
注:這里的
TENCENT_SECRET_ID
和TENCENT_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
,這里有幾點需要作出說明:
- 代碼中的
app_id
和app_secret
項需填寫在准備工作記錄的 App ID 和 App Secret - 最終我們使用
POST
方法發送消息 - 在調用時,我們還需要在
query
處加上?myauth=feishu1
,目的是作簡單驗證以防止他人發送,例如https://service-********-**********.**.apigw.tencentcs.com/release/?myauth=feishu1
三、部署 Serverless 服務
- 通過 npm 安裝 Serverless
$ npm install -g serverless
- 通過
serverless
命令進行部署,並添加--debug
參數查看部署過程中的信息
$ serverless --debug
- 從終端獲取 API 網關的 URL
獲取 API 網關的 URL
四、上線應用
-
回到飛書開放平台,在企業自建應用列表中點擊剛剛創建成功的應用
-
點擊應用功能-機器人,點擊啟用機器人
- 點擊版本管理與發布-創建版本,參考下圖進行配置(先不要點保存)
- 在可用性狀態處點擊編輯,選擇所有員工,然后點擊保存
- 點擊申請發布
- 點擊飛書網頁版的頭像,進入飛書管理后台
- 點擊工作台-應用審核,然后點擊審核
- 點擊通過
五、調用接口
請求方式: POST
請求地址: 上面獲取的 APIGateway 的 URL
請求 Header:
參數 | 類型 | 必填/選填 | 說明 | 默認值 | 實例 |
---|---|---|---|---|---|
Content-Type | string | 必填 | Content-Type | application/json |
請求 Query:
參數 | 類型 | 必填/選填 | 說明 | 默認值 | 實例 |
---|---|---|---|---|---|
myauth | string | 必填 | 簡單驗證 | feishu1 |
請求 Body:
{
"content": "這里填入你想要發送的信息"
}
六、效果
為了方便,這里使用 Chrome 瀏覽器插件 Talend API Tester 進行調用
可以看到,飛書的消息推送很及時
七、結語
其實利用飛書能實現的並不只有這些而已,我相信聰明的你一定能開發出更加好玩的應用,本次的分享到此結束。
One More Thing
3 秒你能做什么?喝一口水,看一封郵件,還是 —— 部署一個完整的 Serverless 應用?
復制鏈接至 PC 瀏覽器訪問:https://serverless.cloud.tencent.com/deploy/express
3 秒極速部署,立即體驗史上最快的 Serverless HTTP 實戰開發!
傳送門:
- GitHub: github.com/serverless
- 官網:serverless.com
歡迎訪問:Serverless 中文網,您可以在 最佳實踐 里體驗更多關於 Serverless 應用的開發!