一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 教你如何使用Python開發一個釘釘群應答機器人

教你如何使用Python開發一個釘釘群應答機器人

2021-12-06 10:20zmister2016 Python

在聊天工具大肆侵入我們生活各個方面的今天,各種消息無時無刻不在侵擾我們的每一寸時間,這種情況下,一個聊天的機器人就很有必要了.今天,我們來學習一下使用 Python 開發一個釘釘的應答機器人,助你「人生苦短,少回消息」,需

前提

搭建釘釘應答機器人,需要先準備或擁有以下權限:

  • 釘釘企業的管理員或子管理員(如果不是企業管理員,可以自己創建一個企業,很方便的)
  • 有公網通信地址(內網穿透也可以);

釘釘群機器人開發文檔:https://developers.dingtalk.com/document/app/overview-of-group-robots

創建「機器人」應用

登錄「釘釘開發者后臺」,選擇「應用開發」——「企業內部開發」—— 「機器人」

教你如何使用Python開發一個釘釘群應答機器人

輸入好機器人的基本信息之后,就會生成創建一個「釘釘機器人」

教你如何使用Python開發一個釘釘群應答機器人

我們的后端應用通過其提供的「agentid」、「appkey」、「appsecret」就能夠與釘釘機器人進行通信。

接收消息

在釘釘機器人的設定中,當用戶@機器人時,釘釘會通過機器人開發者的服務器地址,用 post 請求方法把消息內容發送出去,其 http header 如下所示:

?
1
2
3
4
5
{
  "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 實現代碼如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
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)

其發送的消息格如下所示:

?
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
{
    "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"
}

其中,一些參數的說明如下圖所示:

教你如何使用Python開發一個釘釘群應答機器人

教你如何使用Python開發一個釘釘群應答機器人

我們接收到釘釘的消息后,可以根據實際的業務需求解析出相應字段的數據來進行處理。

響應消息

釘釘機器人支持我們通過「text」、「markdown」、「整體跳轉actioncard」、「獨立跳轉actioncard」和「feedcard」這5種消息類型發送消息到群里。

下面我們通過實際的代碼來展示接收釘釘機器人的消息,以及發送 5 種消息類型到釘釘群里。

創建一個后端應用

接下來,我們通過創建一個 django 應用來接收的處理用戶發送給釘釘機器人的消息。

首先,創建一個 django 項目和應用:

?
1
2
django-admin startproject ddrobot
python manage.py startapp app_robot

教你如何使用Python開發一個釘釘群應答機器人

然后打開 “c:\ddrobot\ddrobot\settings.py” 文件,修改 allowed_hosts 變量:

?
1
allowed_hosts = ['*']

將 app_robot 添加到 installed_apps 變量列表中:

?
1
2
3
4
5
6
7
8
9
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文件中進行)。

首先,是時間戳的校驗:

?
1
2
3
4
5
6
def check_timestamp(timestamp):
    now_timestamp = int(time.time()*1000)
    if now_timestamp - int(timestamp) > 3600000:
        return false
    else:
        return true

然后是簽名值的校驗,簽名值的計算方法和示例代碼釘釘已經提供,我們借用即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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。

創建視圖函數

接著,我們創建一個視圖函數,用來接收釘釘傳輸過來的消息,以及響應給釘釘。

?
1
2
3
@csrf_exempt
def resp_dd(request):
    pass

在 resp_dd() 函數中,首先從請求頭中讀取釘釘傳輸過來的時間戳和簽名值,然后進行校驗:

?
1
2
3
4
5
6
7
8
9
10
@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 里面獲取消息信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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 個不同消息類型的響應格式。

文本消息類型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 響應文字
  resp_text = {
      "at": {
          "atuserids": [
              user_id
          ],
          "isatall": false
      },
      "text": {
          "content": "你剛剛發的消息是:[{}]".format(content)
      },
      "msgtype": "text"
  }

markdown消息類型:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 響應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
       }
   }

整體跳轉卡片消息類型:

?
1
2
3
4
5
6
7
8
9
10
# 響應整體跳轉actioncard
resp_actioncard = {
    "msgtype": "actioncard",
    "actioncard": {
        "title": "州的先生 python 實戰教程合集",
        "text": "![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png) \n #### 州的先生 python 實戰教程合集 \n\n 學習python的一個好方法就是用實際的項目來熟練語言",
        "singletitle" : "閱讀全文",
        "singleurl" : "http://mrdoc.zmister.com"
    }
}

獨立跳轉卡片消息類型:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
resp_actioncard_2 = {
        "msgtype": "actioncard",
        "actioncard": {
            "title": "州的先生 python 實戰教程合集",
            "text": "![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png) \n #### 州的先生 python 實戰教程合集 \n\n 學習python的一個好方法就是用實際的項目來熟練語言",
            "hideavatar": "0",
            "btnorientation": "0",
            "btns": [
                {
                    "title": "去看看",
                    "actionurl": "http://mrdoc.zmister.com"
                },
                {
                    "title": "不感興趣",
                    "actionurl": "https://zmister.com/"
                }
            ]
        }
    }

feed卡片消息類型:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 響應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"
                }
            ]
        }
    }

其他的消息響應空:

?
1
2
3
4
# 響應空,不回復
    resp_empty = {
        "msgtype": "empty"
    }

定義好幾個消息響應類型數據后,我們對獲取到的 content 變量進行判斷返回響應即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
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:\ddrobot\ddrobot\urls.py” 文件中把內容修改為如下代碼所示:

?
1
2
3
4
5
6
7
8
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 和釘釘機器人的消息接收地址填寫好:

教你如何使用Python開發一個釘釘群應答機器人

調試釘釘機器人

在配置好機器人的「服務器出口ip」與「消息接收地址」之后,我們點擊網頁菜單的「版本管理與發布」,點擊「調試按鈕」,進入到釘釘機器人的調試群:

教你如何使用Python開發一個釘釘群應答機器人

這回在「釘釘機器人名稱-test」的群里面添加創建的釘釘機器人:

教你如何使用Python開發一個釘釘群應答機器人

我們可以在這個群里面@創建的群機器人進行測試:

教你如何使用Python開發一個釘釘群應答機器人

在測試沒問題之后,我們就可以點擊「上線」按鈕。釘釘機器人上線之后,就可以在釘釘群內添加這個機器人。

教你如何使用Python開發一個釘釘群應答機器人

這樣,我們就實現了從 0 到 1 使用 python 開發釘釘群機器人。

基本的框架和流程大抵如此,具體的業務邏輯則需要根據不同的需求進行額外處理。比如:

查詢天氣,就得解析消息中的城市,然后請求天氣接口獲取天氣數據,進行消息的響應;

淘寶客,就得解析消息中的文本,進行分詞或其他處理,再查詢數據庫中的商品優惠券數據或是直接請求淘客接口獲取商品優惠券數據;

員工績效,就得接入釘釘的應用開發,借助釘釘開發的用戶接口進行數據查詢和響應。

到此這篇關于教你如何使用python開發一個釘釘群應答機器人的文章就介紹到這了,更多相關python開發釘釘群應答機器人內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/y747702801/article/details/117919659

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色鬼网 | 无限在线观看免费入口 | 亚洲欧美久久婷婷爱综合一区天堂 | 欧美va在线 | 臀精插宫NP文| 亚洲免费在线观看 | 亚洲性久久久影院 | 美女女女女女女bbbbbb毛片 | 欧美专区综合 | 性鸥美| 欧美bbxx | 国产成人一区二区三区小说 | 视频一本大道香蕉久在线播放 | 青草视频久久 | 成人国产精品视频频 | 国产精品青青青高清在线观看 | 贵妇的私人性俱乐部 | 特黄一级 | 午夜国产在线观看 | 亚洲第一综合天堂另类专 | 久久亚洲国产成人影院 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 女教师巨大乳孔中文字幕免费 | 亚洲日本aⅴ片在线观看香蕉 | 91对白在线 | 娇喘嗯嗯 轻点啊视频福利 九九九九在线精品免费视频 | 美女全身体光羞羞漫画 | 欧美男同猛男 videos 同性 | 免费成年网 | 996免费视频国产在线播放 | 国产麻豆剧果冻传媒观看免费视频 | 亚洲乱人伦在线 | 精品久久久久久久久久久久久久久 | 欧美摘花破处 | 男人狂躁女人下面的视频免费 | 国内视频一区二区 | 国产一区二区不卡视频 | 甜蜜惩罚小说 | 精品国产国产综合精品 | 欧美大b | 被强上后我成瘾了小说 |