欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

教你如何使用Python開發(fā)一個(gè)釘釘群應(yīng)答機(jī)器人

 更新時(shí)間:2021年06月21日 10:52:36   作者:zmister2016  
在聊天工具大肆侵入我們生活各個(gè)方面的今天,各種消息無時(shí)無刻不在侵?jǐn)_我們的每一寸時(shí)間,這種情況下,一個(gè)聊天的機(jī)器人就很有必要了.今天,我們來學(xué)習(xí)一下使用 Python 開發(fā)一個(gè)釘釘?shù)膽?yīng)答機(jī)器人,助你「人生苦短,少回消息」,需要的朋友可以參考下

前提

搭建釘釘應(yīng)答機(jī)器人,需要先準(zhǔn)備或擁有以下權(quán)限:

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

釘釘群機(jī)器人開發(fā)文檔:https://developers.dingtalk.com/document/app/overview-of-group-robots

創(chuàng)建「機(jī)器人」應(yīng)用

登錄「釘釘開發(fā)者后臺(tái)」,選擇「應(yīng)用開發(fā)」——「企業(yè)內(nèi)部開發(fā)」—— 「機(jī)器人」

在這里插入圖片描述

輸入好機(jī)器人的基本信息之后,就會(huì)生成創(chuàng)建一個(gè)「釘釘機(jī)器人」

在這里插入圖片描述

我們的后端應(yīng)用通過其提供的「AgentId」、「AppKey」、「AppSecret」就能夠與釘釘機(jī)器人進(jìn)行通信。

接收消息

在釘釘機(jī)器人的設(shè)定中,當(dāng)用戶@機(jī)器人時(shí),釘釘會(huì)通過機(jī)器人開發(fā)者的服務(wù)器地址,用 POST 請(qǐng)求方法把消息內(nèi)容發(fā)送出去,其 HTTP header 如下所示:

{
  "Content-Type": "application/json; charset=utf-8",
  "timestamp": "1577262236757",
  "sign":"xxxxxxxxxx"
}

其中,timestamp是消息發(fā)送時(shí)的時(shí)間戳,sign是簽名值,我們需要對(duì)這兩個(gè)值進(jìn)行校驗(yàn)。

如果timestamp與系統(tǒng)當(dāng)前時(shí)間相差1小時(shí)以上,則為非法請(qǐng)求。

如果sign簽名值與后臺(tái)計(jì)算的值不一樣,也為非法請(qǐng)求。

其中sign簽名值的計(jì)算方法為:header中的timestamp + “\n” + 機(jī)器人的appSecret當(dāng)做簽名字符串,使用HmacSHA256算法計(jì)算簽名,然后進(jìn)行Base64 encode,得到最終的簽名值。

其 Python 實(shí)現(xiàn)代碼如下所示:

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)

其發(fā)送的消息格如下所示:

{
    "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": "機(jī)器人測(cè)試-TEST",
    "isInAtList": true,
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxxx",
    "text": {
        "content": " 你好"
    },
    "msgtype": "text"
}

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

在這里插入圖片描述

在這里插入圖片描述

我們接收到釘釘?shù)南⒑?,可以根?jù)實(shí)際的業(yè)務(wù)需求解析出相應(yīng)字段的數(shù)據(jù)來進(jìn)行處理。

響應(yīng)消息

釘釘機(jī)器人支持我們通過「text」、「Markdown」、「整體跳轉(zhuǎn)actionCard」、「獨(dú)立跳轉(zhuǎn)actionCard」和「feedCard」這5種消息類型發(fā)送消息到群里。

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

創(chuàng)建一個(gè)后端應(yīng)用

接下來,我們通過創(chuàng)建一個(gè) Django 應(yīng)用來接收的處理用戶發(fā)送給釘釘機(jī)器人的消息。

首先,創(chuàng)建一個(gè) Django 項(xiàng)目和應(yīng)用:

django-admin startproject DdRobot
python manage.py startapp app_robot

在這里插入圖片描述

然后打開 “C:\DdRobot\DdRobot\settings.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',
]

創(chuàng)建校驗(yàn)時(shí)間戳和簽名函數(shù)

因?yàn)獒斸敊C(jī)器人會(huì)在請(qǐng)求頭里面?zhèn)魅?code>timestamp時(shí)間戳和sign簽名供我們對(duì)請(qǐng)求的合法性進(jìn)行校驗(yàn),所以為了機(jī)器人的安全,我們需要編寫 2 個(gè)函數(shù)對(duì)它們進(jìn)行校驗(yàn)(在DdRobot/app_robot/views.py文件中進(jìn)行)。

首先,是時(shí)間戳的校驗(yàn):

def check_timestamp(timestamp):
    now_timestamp = int(time.time()*1000)
    if now_timestamp - int(timestamp) > 3600000:
        return False
    else:
        return True

然后是簽名值的校驗(yàn),簽名值的計(jì)算方法和示例代碼釘釘已經(jīng)提供,我們借用即可:

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

對(duì)于這 2 個(gè)值,校驗(yàn)成功我們都返回 True,校驗(yàn)失敗我們都返回 False。

創(chuàng)建視圖函數(shù)

接著,我們創(chuàng)建一個(gè)視圖函數(shù),用來接收釘釘傳輸過來的消息,以及響應(yīng)給釘釘。

@csrf_exempt
def resp_dd(request):
	pass

在 resp_dd() 函數(shù)中,首先從請(qǐng)求頭中讀取釘釘傳輸過來的時(shí)間戳和簽名值,然后進(jìn)行校驗(yàn):

@csrf_exempt
def resp_dd(request):
    timestamp = request.headers.get('timestamp','')
    sign = request.headers.get('sign','')
    # 校驗(yàn)時(shí)間戳
    if check_timestamp(timestamp) is False:
        return JsonResponse({'status':False,'data':'非法請(qǐng)求'})
    # 校驗(yàn)簽名
    if check_sign(timestamp,sign) is False:
        return JsonResponse({'status':False,'data':'非法請(qǐng)求'})

若是時(shí)間戳和簽名值校驗(yàn)無誤,我們繼續(xù)從請(qǐng)求 body 里面獲取消息信息:

@csrf_exempt
def resp_dd(request):
    timestamp = request.headers.get('timestamp','')
    sign = request.headers.get('sign','')
    # 校驗(yàn)時(shí)間戳
    if check_timestamp(timestamp) is False:
        return JsonResponse({'status':False,'data':'非法請(qǐng)求'})
    # 校驗(yàn)簽名
    if check_sign(timestamp,sign) is False:
        return JsonResponse({'status':False,'data':'非法請(qǐng)求'})
    body = json.loads(request.body)
    # 獲取用戶id
    # user_id = body['senderStaffId'] 機(jī)器人上線后才會(huì)返回
    user_id = body['senderId']
    # 獲取發(fā)送的消息
    msg_type = body['msgtype']
    if msg_type == 'text':
        content = body['text']['content']

目前釘釘機(jī)器人只支持text文本內(nèi)容的消息接收,所以在此處我們只對(duì)消息類型為text的消息進(jìn)行處理。

獲取到釘釘機(jī)器人發(fā)送過來的信息之后,我們就可以根據(jù)自己的業(yè)務(wù)邏輯進(jìn)行處理,然后返回特定的消息類型了。

在這里,我們只對(duì)消息進(jìn)行簡單的處理:

  • 當(dāng)發(fā)送來的消息文本為text時(shí),機(jī)器人回復(fù)文本消息;
  • 當(dāng)發(fā)送來的消息文本為markdown時(shí),機(jī)器人回復(fù)一個(gè) Markdown 的示例消息;
  • 當(dāng)發(fā)送來的消息文本為整體跳轉(zhuǎn)時(shí),機(jī)器人回復(fù)一個(gè)「整體跳轉(zhuǎn)卡片」的示例消息;
  • 當(dāng)發(fā)送來的消息文本為獨(dú)立跳轉(zhuǎn)時(shí),機(jī)器人回復(fù)一個(gè)「獨(dú)立跳轉(zhuǎn)卡片」的示例消息;
  • 當(dāng)發(fā)送來的消息文本為feed時(shí),機(jī)器人回復(fù)一個(gè)「feedCard」的示例消息;

先來定義 5 個(gè)不同消息類型的響應(yīng)格式。

文本消息類型

  # 響應(yīng)文字
    resp_text = {
        "at": {
            "atUserIds": [
                user_id
            ],
            "isAtAll": False
        },
        "text": {
            "content": "你剛剛發(fā)的消息是:[{}]".format(content)
        },
        "msgtype": "text"
    }

Markdown消息類型:

 # 響應(yīng)Markdown
    resp_markdown = {
        "msgtype": "markdown",
            "markdown": {
            "title":"州的先生機(jī)器人助理",
            "text": "## 這是什么? \n 這是一個(gè)釘釘機(jī)器人 \n ![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png)"
        },
        "at": {
            "atUserIds": [
              user_id
            ],
            "isAtAll": False
        }
    }

整體跳轉(zhuǎn)卡片消息類型:

    # 響應(yīng)整體跳轉(zhuǎn)actionCard
    resp_actioncard = {
        "msgtype": "actionCard",
        "actionCard": {
            "title": "州的先生 Python 實(shí)戰(zhàn)教程合集", 
            "text": "![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png) \n #### 州的先生 Python 實(shí)戰(zhàn)教程合集 \n\n 學(xué)習(xí)Python的一個(gè)好方法就是用實(shí)際的項(xiàng)目來熟練語言",
            "singleTitle" : "閱讀全文",
            "singleURL" : "http://mrdoc.zmister.com"
        }
    }

獨(dú)立跳轉(zhuǎn)卡片消息類型:

resp_actioncard_2 = {
        "msgtype": "actionCard",
        "actionCard": {
            "title": "州的先生 Python 實(shí)戰(zhàn)教程合集", 
            "text": "![](https://zmister.com/wp-content/uploads/2019/06/login_logo.png) \n #### 州的先生 Python 實(shí)戰(zhàn)教程合集 \n\n 學(xué)習(xí)Python的一個(gè)好方法就是用實(shí)際的項(xiàng)目來熟練語言",
            "hideAvatar": "0", 
            "btnOrientation": "0", 
            "btns": [
                {
                    "title": "去看看", 
                    "actionURL": "http://mrdoc.zmister.com"
                }, 
                {
                    "title": "不感興趣", 
                    "actionURL": "https://zmister.com/"
                }
            ]
        }
    }

Feed卡片消息類型:

# 響應(yīng)feedCard
    resp_feedcard = {
        "msgtype": "feedCard",
        "feedCard": {
            "links": [
                {
                    "title": "時(shí)代的火車向前開1", 
                    "messageURL": "http://mrdoc.zmister.com", 
                    "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"
                },
                {
                    "title": "時(shí)代的火車向前開2", 
                    "messageURL": "https://zmister.com/", 
                    "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"
                }
            ]
        }
    }

其他的消息響應(yīng)空:

# 響應(yīng)空,不回復(fù)
    resp_empty = {
        "msgtype": "empty"
    }

定義好幾個(gè)消息響應(yīng)類型數(shù)據(jù)后,我們對(duì)獲取到的 content 變量進(jìn)行判斷返回響應(yīng)即可:

 if content[1:] == 'text':
        return JsonResponse(resp_text)
    elif content[1:] == 'markdown':
        return JsonResponse(resp_markdown)
    elif content[1:] == '整體跳轉(zhuǎn)':
        return JsonResponse(resp_actioncard)
    elif content[1:] == '獨(dú)立跳轉(zhuǎn)':
        return JsonResponse(resp_actioncard_2)
    elif content[1:] == 'feed':
        return JsonResponse(resp_feedcard)
    else:
        return JsonResponse(resp_empty)

這樣,我們這個(gè)釘釘機(jī)器人的后端處理函數(shù)就寫好了。

配置路由

寫好視圖函數(shù)之后,我們配置一下這個(gè)函數(shù)的 URL 路由。

在 “C:\DdRobot\DdRobot\urls.py” 文件中把內(nèi)容修改為如下代碼所示:

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/ 就是釘釘機(jī)器人的消息接收地址。

配置釘釘機(jī)器人

回到釘釘開發(fā)者平臺(tái)的網(wǎng)頁,在釘釘機(jī)器人的「開發(fā)管理」頁面,我們需要把服務(wù)器的出口IP 和釘釘機(jī)器人的消息接收地址填寫好:

在這里插入圖片描述

調(diào)試釘釘機(jī)器人

在配置好機(jī)器人的「服務(wù)器出口IP」與「消息接收地址」之后,我們點(diǎn)擊網(wǎng)頁菜單的「版本管理與發(fā)布」,點(diǎn)擊「調(diào)試按鈕」,進(jìn)入到釘釘機(jī)器人的調(diào)試群:

在這里插入圖片描述

這回在「釘釘機(jī)器人名稱-TEST」的群里面添加創(chuàng)建的釘釘機(jī)器人:

在這里插入圖片描述

我們可以在這個(gè)群里面@創(chuàng)建的群機(jī)器人進(jìn)行測(cè)試:

在這里插入圖片描述

在測(cè)試沒問題之后,我們就可以點(diǎn)擊「上線」按鈕。釘釘機(jī)器人上線之后,就可以在釘釘群內(nèi)添加這個(gè)機(jī)器人。

在這里插入圖片描述

這樣,我們就實(shí)現(xiàn)了從 0 到 1 使用 Python 開發(fā)釘釘群機(jī)器人。

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

查詢天氣,就得解析消息中的城市,然后請(qǐng)求天氣接口獲取天氣數(shù)據(jù),進(jìn)行消息的響應(yīng);

淘寶客,就得解析消息中的文本,進(jìn)行分詞或其他處理,再查詢數(shù)據(jù)庫中的商品優(yōu)惠券數(shù)據(jù)或是直接請(qǐng)求淘客接口獲取商品優(yōu)惠券數(shù)據(jù);

員工績效,就得接入釘釘?shù)膽?yīng)用開發(fā),借助釘釘開發(fā)的用戶接口進(jìn)行數(shù)據(jù)查詢和響應(yīng)。

到此這篇關(guān)于教你如何使用Python開發(fā)一個(gè)釘釘群應(yīng)答機(jī)器人的文章就介紹到這了,更多相關(guān)Python開發(fā)釘釘群應(yīng)答機(jī)器人內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的全過程

    PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的全過程

    Pyqt5是Python中一個(gè)可視化超級(jí)好用的庫,下面這篇文章主要給大家介紹了關(guān)于PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 解決jupyter notebook打不開無反應(yīng) 瀏覽器未啟動(dòng)的問題

    解決jupyter notebook打不開無反應(yīng) 瀏覽器未啟動(dòng)的問題

    這篇文章主要介紹了解決jupyter notebook打不開無反應(yīng) 瀏覽器未啟動(dòng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python創(chuàng)建進(jìn)程fork用法

    python創(chuàng)建進(jìn)程fork用法

    這篇文章主要介紹了python創(chuàng)建進(jìn)程fork用法,實(shí)例分析了Python使用fork創(chuàng)建進(jìn)程的使用方法,需要的朋友可以參考下
    2015-06-06
  • python?playwrigh框架入門安裝使用

    python?playwrigh框架入門安裝使用

    這篇文章主要為大家介紹了python?playwrigh框架入門的安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 關(guān)于Python中異常(Exception)的匯總

    關(guān)于Python中異常(Exception)的匯總

    異常是指程序中的例外,違例情況。異常機(jī)制是指程序出現(xiàn)錯(cuò)誤后,程序的處理方法。當(dāng)出現(xiàn)錯(cuò)誤后,程序的執(zhí)行流程發(fā)生改變,程序的控制權(quán)轉(zhuǎn)移到異常處理。下面這篇文章主要匯總了關(guān)于Python中異常(Exception)的相關(guān)資料,需要的朋友可以參考下。
    2017-01-01
  • python實(shí)現(xiàn)圖書管理系統(tǒng)

    python實(shí)現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python OpenCV基于霍夫圈變換算法檢測(cè)圖像中的圓形

    Python OpenCV基于霍夫圈變換算法檢測(cè)圖像中的圓形

    這篇文章主要介紹了通過霍夫圈變換算法檢測(cè)圖像中的圓形,文中用到的函數(shù)為cv2.HoughCircles(),該函數(shù)可以很好地檢測(cè)圓心。感興趣的小伙伴可以了解一下
    2021-12-12
  • python 實(shí)現(xiàn)百度網(wǎng)盤非會(huì)員上傳超過500個(gè)文件的方法

    python 實(shí)現(xiàn)百度網(wǎng)盤非會(huì)員上傳超過500個(gè)文件的方法

    這篇文章主要介紹了python 實(shí)現(xiàn)百度網(wǎng)盤非會(huì)員上傳超過500個(gè)文件的方法,幫助大家更好的利用python解決問題,感興趣的朋友可以了解下
    2021-01-01
  • 解決Keras TensorFlow 混編中 trainable=False設(shè)置無效問題

    解決Keras TensorFlow 混編中 trainable=False設(shè)置無效問題

    這篇文章主要介紹了解決Keras TensorFlow 混編中 trainable=False設(shè)置無效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python必備技能之debug調(diào)試教程詳解

    Python必備技能之debug調(diào)試教程詳解

    這篇文章主要為大家詳細(xì)介紹了Python初學(xué)者必須要學(xué)會(huì)的技能——在Python中進(jìn)行debug操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03

最新評(píng)論