<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
搭建釘釘應答機器人,需要先準備或擁有以下許可權:
釘釘群機器人開發檔案:https://developers.dingtalk.com/document/app/overview-of-group-robots
登入「釘釘開發者後臺」,選擇「應用開發」——「企業內部開發」—— 「機器人」
輸入好機器人的基本資訊之後,就會生成建立一個「釘釘機器人」
我們的後端應用通過其提供的「AgentId」、「AppKey」、「AppSecret」就能夠與釘釘機器人進行通訊。
在釘釘機器人的設定中,當用戶@機器人時,釘釘會通過機器人開發者的伺服器地址,用 POST 請求方法把訊息內容傳送出去,其 HTTP header 如下所示:
{ "Content-Type": "application/json; charset=utf-8", "timestamp": "1577262236757", "sign":"xxxxxxxxxx" }
其中,timestamp
是訊息傳送時的時間戳,sign
是簽名值,我們需要對這兩個值進行校驗。
如果timestamp
與系統當前時間相差1小時以上,則為非法請求。
如果sign
簽名值與後臺計算的值不一樣,也為非法請求。
其中sign
簽名值的計算方法為:header中的timestamp + 「n」 + 機器人的appSecret當做簽名字串,使用HmacSHA256演演算法計算簽名,然後進行Base64 encode,得到最終的簽名值。
其 Python 實現程式碼如下所示:
import hmac import hashlib import base64 timestamp = '1577262236757' app_secret = 'this is a secret' app_secret_enc = app_secret.encode('utf-8') string_to_sign = '{}n{}'.format(timestamp, app_secret) string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() sign = base64.b64encode(hmac_code).decode('utf-8') print(sign)
其傳送的訊息格如下所示:
{ "conversationId": "xxx", "atUsers": [ { "dingtalkId": "xxx", "staffId":"xxx" } ], "chatbotCorpId": "dinge8a565xxxx", "chatbotUserId": "$:LWCP_v1:$Cxxxxx", "msgId": "msg0xxxxx", "senderNick": "楊xx", "isAdmin": true, "senderStaffId": "user123", "sessionWebhookExpiredTime": 1613635652738, "createAt": 1613630252678, "senderCorpId": "dinge8a565xxxx", "conversationType": "2", "senderId": "$:LWCP_v1:$Ff09GIxxxxx", "conversationTitle": "機器人測試-TEST", "isInAtList": true, "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxxx", "text": { "content": " 你好" }, "msgtype": "text" }
其中,一些引數的說明如下圖所示:
我們接收到釘釘的訊息後,可以根據實際的業務需求解析出相應欄位的資料來進行處理。
釘釘機器人支援我們通過「text」、「Markdown」、「整體跳轉actionCard」、「獨立跳轉actionCard」和「feedCard」這5種訊息型別傳送訊息到群裡。
下面我們通過實際的程式碼來展示接收釘釘機器人的訊息,以及傳送 5 種訊息型別到釘釘群裡。
接下來,我們通過建立一個 Django 應用來接收的處理使用者傳送給釘釘機器人的訊息。
首先,建立一個 Django 專案和應用:
django-admin startproject DdRobot python manage.py startapp app_robot
然後開啟 「C:DdRobotDdRobotsettings.py」 檔案,修改 ALLOWED_HOSTS 變數:
ALLOWED_HOSTS = ['*']
將 app_robot 新增到 INSTALLED_APPS 變數列表中:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app_robot', ]
因為釘釘機器人會在請求頭裡面傳入timestamp
時間戳和sign
簽名供我們對請求的合法性進行校驗,所以為了機器人的安全,我們需要編寫 2 個函數對它們進行校驗(在DdRobot/app_robot/views.py
檔案中進行)。
首先,是時間戳的校驗:
def check_timestamp(timestamp): now_timestamp = int(time.time()*1000) if now_timestamp - int(timestamp) > 3600000: return False else: return True
然後是簽名值的校驗,簽名值的計算方法和範例程式碼釘釘已經提供,我們借用即可:
def check_sign(timestamp,sign): import hmac import hashlib import base64 # now_timestamp = str(int(time.time()*1000)) app_secret = 'teTLGS3xZVLp6Z99mXvgVpINOUyJqFsKJ3jLb7crFdjRsJ3_77E-kxhlIbBGbNjX' app_secret_enc = app_secret.encode('utf-8') string_to_sign = '{}n{}'.format(timestamp, app_secret) string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() new_sign = base64.b64encode(hmac_code).decode('utf-8') # print(sign) # print(new_sign) if sign == new_sign: return True else: return False
對於這 2 個值,校驗成功我們都返回 True,校驗失敗我們都返回 False。
接著,我們建立一個檢視函數,用來接收釘釘傳輸過來的訊息,以及響應給釘釘。
@csrf_exempt def resp_dd(request): pass
在 resp_dd() 函數中,首先從請求頭中讀取釘釘傳輸過來的時間戳和簽名值,然後進行校驗:
@csrf_exempt def resp_dd(request): timestamp = request.headers.get('timestamp','') sign = request.headers.get('sign','') # 校驗時間戳 if check_timestamp(timestamp) is False: return JsonResponse({'status':False,'data':'非法請求'}) # 校驗簽名 if check_sign(timestamp,sign) is False: return JsonResponse({'status':False,'data':'非法請求'})
若是時間戳和簽名值校驗無誤,我們繼續從請求 body 裡面獲取訊息資訊:
@csrf_exempt def resp_dd(request): timestamp = request.headers.get('timestamp','') sign = request.headers.get('sign','') # 校驗時間戳 if check_timestamp(timestamp) is False: return JsonResponse({'status':False,'data':'非法請求'}) # 校驗簽名 if check_sign(timestamp,sign) is False: return JsonResponse({'status':False,'data':'非法請求'}) body = json.loads(request.body) # 獲取使用者id # user_id = body['senderStaffId'] 機器人上線後才會返回 user_id = body['senderId'] # 獲取傳送的訊息 msg_type = body['msgtype'] if msg_type == 'text': content = body['text']['content']
目前釘釘機器人只支援text
文字內容的訊息接收,所以在此處我們只對訊息型別為text
的訊息進行處理。
獲取到釘釘機器人傳送過來的資訊之後,我們就可以根據自己的業務邏輯進行處理,然後返回特定的訊息型別了。
在這裡,我們只對訊息進行簡單的處理:
text
時,機器人回覆文字訊息;markdown
時,機器人回覆一個 Markdown 的範例訊息;整體跳轉
時,機器人回覆一個「整體跳轉卡片」的範例訊息;獨立跳轉
時,機器人回覆一個「獨立跳轉卡片」的範例訊息;feed
時,機器人回覆一個「feedCard」的範例訊息;先來定義 5 個不同訊息型別的響應格式。
文字訊息型別
# 響應文字 resp_text = { "at": { "atUserIds": [ user_id ], "isAtAll": False }, "text": { "content": "你剛剛發的訊息是:[{}]".format(content) }, "msgtype": "text" }
Markdown訊息型別:
# 響應Markdown resp_markdown = { "msgtype": "markdown", "markdown": { "title":"州的先生機器人助理", "text": "## 這是什麼? n 這是一個釘釘機器人 n ![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png)" }, "at": { "atUserIds": [ user_id ], "isAtAll": False } }
整體跳轉卡片訊息型別:
# 響應整體跳轉actionCard resp_actioncard = { "msgtype": "actionCard", "actionCard": { "title": "州的先生 Python 實戰教學合集", "text": "![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png) n #### 州的先生 Python 實戰教學合集 nn 學習Python的一個好方法就是用實際的專案來熟練語言", "singleTitle" : "閱讀全文", "singleURL" : "http://mrdoc.zmister.com" } }
獨立跳轉卡片訊息型別:
resp_actioncard_2 = { "msgtype": "actionCard", "actionCard": { "title": "州的先生 Python 實戰教學合集", "text": "![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png) n #### 州的先生 Python 實戰教學合集 nn 學習Python的一個好方法就是用實際的專案來熟練語言", "hideAvatar": "0", "btnOrientation": "0", "btns": [ { "title": "去看看", "actionURL": "http://mrdoc.zmister.com" }, { "title": "不感興趣", "actionURL": "https://zmister.com/" } ] } }
Feed卡片訊息型別:
# 響應feedCard resp_feedcard = { "msgtype": "feedCard", "feedCard": { "links": [ { "title": "時代的火車向前開1", "messageURL": "http://mrdoc.zmister.com", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png" }, { "title": "時代的火車向前開2", "messageURL": "https://zmister.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png" } ] } }
其他的訊息響應空:
# 響應空,不回覆 resp_empty = { "msgtype": "empty" }
定義好幾個訊息響應型別資料後,我們對獲取到的 content 變數進行判斷返回響應即可:
if content[1:] == 'text': return JsonResponse(resp_text) elif content[1:] == 'markdown': return JsonResponse(resp_markdown) elif content[1:] == '整體跳轉': return JsonResponse(resp_actioncard) elif content[1:] == '獨立跳轉': return JsonResponse(resp_actioncard_2) elif content[1:] == 'feed': return JsonResponse(resp_feedcard) else: return JsonResponse(resp_empty)
這樣,我們這個釘釘機器人的後端處理常式就寫好了。
寫好檢視函數之後,我們設定一下這個函數的 URL 路由。
在 「C:DdRobotDdRoboturls.py」 檔案中把內容修改為如下程式碼所示:
from django.contrib import admin from django.urls import path from app_robot import views urlpatterns = [ path('admin/', admin.site.urls), path('dd_robot/',views.resp_dd, name="resp_dd"), ]
這樣 http://ip地址/dd_robot/ 就是釘釘機器人的訊息接收地址。
回到釘釘開發者平臺的網頁,在釘釘機器人的「開發管理」頁面,我們需要把伺服器的出口IP 和釘釘機器人的訊息接收地址填寫好:
在設定好機器人的「伺服器出口IP」與「訊息接收地址」之後,我們點選網頁選單的「版本管理與釋出」,點選「偵錯按鈕」,進入到釘釘機器人的偵錯群:
這回在「釘釘機器人名稱-TEST」的群裡面新增建立的釘釘機器人:
我們可以在這個群裡面@建立的群機器人進行測試:
在測試沒問題之後,我們就可以點選「上線」按鈕。釘釘機器人上線之後,就可以在釘釘群內新增這個機器人。
這樣,我們就實現了從 0 到 1 使用 Python 開發釘釘群機器人。
基本的框架和流程大抵如此,具體的業務邏輯則需要根據不同的需求進行額外處理。比如:
查詢天氣,就得解析訊息中的城市,然後請求天氣介面獲取天氣資料,進行訊息的響應;
淘寶客,就得解析訊息中的文字,進行分詞或其他處理,再查詢資料庫中的商品優惠券資料或是直接請求淘客介面獲取商品優惠券資料;
員工績效,就得接入釘釘的應用開發,藉助釘釘開發的使用者介面進行資料查詢和響應。
到此這篇關於教你如何使用Python開發一個釘釘群應答機器人的文章就介紹到這了,更多相關Python開發釘釘群應答機器人內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45