最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python注冊釘釘回調(diào)事件的實現(xiàn)

 更新時間:2021年08月09日 10:56:39   作者:小陸同學  
釘釘有回調(diào)事件流程,本文主要介紹了python注冊釘釘回調(diào)事件的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

釘釘API文檔:https://ding-doc.dingtalk.com/doc#/serverapi2/skn8ld

釘釘有回調(diào)事件流程,有哪些回調(diào)?比如:通訊錄回調(diào)、審批回調(diào)等等,拿通訊錄回調(diào)來說,就是當你公司組織架構(gòu)發(fā)生變動時,會自動觸發(fā)你自己注冊的回調(diào)地址,然后根據(jù)回調(diào)信息做一些自定義的處理,不得不說,釘釘真的是解決了協(xié)同辦公的很多問題,非常nice,但就回調(diào)事件來說,每個企業(yè)只能注冊一個回調(diào)地址,即使你要監(jiān)聽的是不同的事件、即使還有其他業(yè)務線需要用到回調(diào),也只能不多于一個回調(diào),當然這都是出于人家服務多方面考慮的設計,廢話不多說,

好,流程:

  一個注冊端向釘釘發(fā)送注冊請求,釘釘callback你自己的服務url,必須是公網(wǎng)訪問的地址,并且該地址返回釘釘json數(shù)據(jù)來告訴釘釘回調(diào)成功

  注冊成功之后這個地址就可以接收釘釘?shù)幕卣{(diào)post請求,做一些自定義處理,記得返回json

好,代碼

1、注冊端

mport requests, json


class DingDingCallBack(object):
    def __init__(self):
        self.appsecret=''
        self.appkey=''
        self.api_url = "https://oapi.dingtalk.com/gettoken?appkey=%s&appsecret=%s"%(self.appkey,self.appsecret)
        self.aes_key = ""
        self.callbackUrl = "回調(diào)url"
        self.headers = {
            'Content-Type': 'application/json',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36',
            'username':'zhangsan',
            'password':'123456'
        }

    def get_token(self):
        res = requests.get(self.api_url)
        if res.status_code == 200:
            str_res = res.text
            token = (json.loads(str_res)).get('access_token')
            return token

    def regist_call_back(self):
        url = 'https://oapi.dingtalk.com/call_back/register_call_back?access_token={ACCESS_TOKEN}'.format(ACCESS_TOKEN=self.get_token())
        data = {
            "call_back_tag": ["bpms_task_change", "bpms_instance_change"], # 審批回調(diào)
            "token": "qxN3cm",
            "aes_key": self.aes_key,
            "url":self.callbackUrl,
            }
        data1 = json.dumps(data)
        response = requests.post(url, headers=self.headers, data=data1)
        print(response)
        print(response.text)

    def query_callback(self):
        url = 'https://oapi.dingtalk.com/call_back/get_call_back?access_token={ACCESS_TOKEN}'.format(ACCESS_TOKEN=self.get_token())
        response = requests.get(url, headers=self.headers, )
        print(response)
        print(response.text)


    def update_call_back(self):
        url = 'https://oapi.dingtalk.com/call_back/update_call_back?access_token={}'.format(self.get_token())
        data = {
            "call_back_tag": ["bpms_task_change", "bpms_instance_change","user_add_org","user_leave_org","org_dept_create","org_dept_modify","org_dept_remove"],
            "token": "自定義字符串",
            "aes_key": self.aes_key,
            "url":self.callbackUrl
            }
        data1 = json.dumps(data)
        response = requests.post(url, headers=self.headers, data=data1)
        print(response)
        print(response.text)

    def get_fail(self):
        url = 'https://oapi.dingtalk.com/call_back/get_call_back_failed_result?access_token={}'.format(self.get_token())
        response = requests.get(url, headers=self.headers, )
        print(response.text)# todo 刪除回調(diào)
    def delete_callback(self):
        url = 'https://oapi.dingtalk.com/call_back/delete_call_back?access_token={ACCESS_TOKEN}'.format(ACCESS_TOKEN=self.get_token())
        result = requests.get(url)
        print(result)
        print(result.text)

#
if __name__ == '__main__':
    dingOBJ = DingDingCallBack()
    # todo 獲取釘釘token
#     # dingOBJ.get_token()
    # todo 獲取回調(diào)失敗
#     dingOBJ.get_fail()
    # todo 注冊回調(diào)
    # dingOBJ.regist_call_back()
    # todo 查詢回調(diào)事件
    dingOBJ.query_callback()
    # todo 修改回調(diào)事件
#     dingOBJ.update_call_back()
    # todo 刪除回調(diào)
    # dingOBJ.delete_callback()

2、回調(diào)端:以下示例代碼為python2,django 框架

# -*- coding:utf-8 -*-

from django.shortcuts import render
from django.http import JsonResponse,HttpResponse
from django.views.generic import View
from django.views.decorators.csrf import csrf_exempt
from DingCrypto import DingCrypto
import random,string,time,json,requests,simplejson
# Create your views here.from ast import literal_eval


encodingAesKey = ''
key = ''
token = '自定義字符串'
appsecret = ''
appkey = ''

api_url = "https://oapi.dingtalk.com/gettoken?appkey=%s&appsecret=%s"%(appkey,appsecret)


def randam_string(n):
    ran_str = ''.join(random.sample(string.ascii_letters + string.digits, n))
    return ran_str

# 注冊回調(diào)
@csrf_exempt
def workOrderCallback(request):
    if request.method == 'GET':
        return JsonResponse({'code':200,'msg':'ok'})


    if request.method == 'POST':
        print request.GET
        dingCrypto = DingCrypto(encodingAesKey,key)
        nonce = randam_string(8)
        timestamp = str(int(round(time.time())))
        encrpyt = dingCrypto.encrypt('success')
        # print nonce,timestamp,token,encrpyt
        signature = dingCrypto.generateSignature(nonce=nonce,timestamp=timestamp,token=token,msg_encrypt=encrpyt)
        new_data = {
            'data': {
                'msg_signature': signature,
                'timeStamp': timestamp,
                'nonce': nonce,
                'encrypt': encrpyt
            },
        }


        encrpyt11 = dingCrypto.decrypt(encrpyt)

        return JsonResponse(new_data.get('data'))

# 響應回調(diào)
class CallBack(View):
    def get(self,request,*args,**kwargs):
        return JsonResponse({'code':200,'msg':'ok'})

    def get_token(self):
        res = requests.get(api_url)
        if res.status_code == 200:
            str_res = res.text
            token = (json.loads(str_res)).get('access_token')
            return token


    def post(self,request,*args,**kwargs):

        # data = request.GET

        dingCrypto = DingCrypto(encodingAesKey, key)
        nonce = randam_string(8)
        timestamp = str(int(round(time.time())))
        encrpyt = dingCrypto.encrypt('success')
        # signature = dingCrypto.generateSignature(nonce=nonce,timestamp=timestamp,token=token,msg_encrypt=encrpyt)
        callback = json.loads(dingCrypto.decrypt(json.loads(request.body).get('encrypt')))
        if callback['EventType'] == 'bpms_instance_change': # 審批實例開始,結(jié)束
            url = 'https://oapi.dingtalk.com/topapi/processinstance/get?access_token={ACCESS_TOKEN}'.format(ACCESS_TOKEN=self.get_token())
            instace_ = {
                "process_instance_id": callback['processInstanceId']
            }
            data2 = json.dumps(instace_)
            req = requests.post(url,data=data2)
            data = literal_eval(str(req.text)).get('process_instance')
            excute_workorder(callback['processInstanceId'],data)
        elif callback['EventType'] == 'bpms_task_change':  # 審批任務開始,結(jié)束,轉(zhuǎn)交
            print 'bpms_task_change'
        elif callback['EventType'] == 'user_add_org':
            print '用戶增加'elif callback['EventType'] == 'user_leave_org':
            print '用戶離職'
        elif callback['EventType'] == 'org_dept_create':
            print '組織架構(gòu)添加'elif callback['EventType'] == 'org_dept_modify':
            print '組織架構(gòu)變更'elif callback['EventType'] == 'org_dept_remove':
            print '組織架構(gòu)刪除'return HttpResponse(encrpyt)

到此這篇關于python注冊釘釘回調(diào)事件的實現(xiàn)的文章就介紹到這了,更多相關python注冊釘釘回調(diào)事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python中entry用法講解

    python中entry用法講解

    在本篇文章里小編給大家整理的是一篇關于python中entry用法講解內(nèi)容,有興趣的朋友們可以學習參考下。
    2020-12-12
  • Python?GUI實現(xiàn)PDF轉(zhuǎn)Word功能

    Python?GUI實現(xiàn)PDF轉(zhuǎn)Word功能

    這篇文章主要介紹了如何使用?wxPython?創(chuàng)建一個簡單的圖形用戶界面(GUI)應用程序,結(jié)合?pdf2docx?庫,實現(xiàn)將?PDF?轉(zhuǎn)換為?Word?文檔的功能,需要的可以參考下
    2024-12-12
  • python filecmp.dircmp實現(xiàn)遞歸比對兩個目錄的方法

    python filecmp.dircmp實現(xiàn)遞歸比對兩個目錄的方法

    這篇文章主要介紹了python filecmp.dircmp實現(xiàn)遞歸比對兩個目錄的方法,本文通過實例代碼給大家介紹的非常詳細,大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • pandas將多個dataframe以多個sheet的形式保存到一個excel文件中

    pandas將多個dataframe以多個sheet的形式保存到一個excel文件中

    這篇文章主要介紹了pandas將多個dataframe以多個sheet的形式保存到一個excel文件中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Ubuntu下使用Python實現(xiàn)游戲制作中的切分圖片功能

    Ubuntu下使用Python實現(xiàn)游戲制作中的切分圖片功能

    這篇文章主要介紹了Ubuntu下使用Python實現(xiàn)游戲制作中的切分圖片功能,涉及Python針對圖片的讀取、載入、切分運算等相關操作技巧,需要的朋友可以參考下
    2018-03-03
  • python按順序重命名文件并分類轉(zhuǎn)移到各個文件夾中的實現(xiàn)代碼

    python按順序重命名文件并分類轉(zhuǎn)移到各個文件夾中的實現(xiàn)代碼

    這篇文章主要介紹了python按順序重命名文件并分類轉(zhuǎn)移到各個文件夾中,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Python編程進階代碼邏輯分離指南

    Python編程進階代碼邏輯分離指南

    在?Python?編程中,適當?shù)拇a邏輯分離可以幫助降低復雜度、提高可讀性,減少大量的?if-else?結(jié)構(gòu),本文將深入探討如何使用不同方法來改進代碼結(jié)構(gòu),降低對?if-else?結(jié)構(gòu)的依賴
    2023-12-12
  • Python中的logging模塊詳解

    Python中的logging模塊詳解

    這篇文章主要介紹了Python中的logging模塊詳解,默認情況下Python的logging模塊將日志打印到了標準輸出中,且只顯示了大于等于WARNING級別的日志,這說明默認的日志級別設置為WARNING,需要的朋友可以參考下
    2023-09-09
  • 最小公倍數(shù)Python實現(xiàn)的方法例子

    最小公倍數(shù)Python實現(xiàn)的方法例子

    這篇文章介紹了兩種計算最小公倍數(shù)的方法:輾轉(zhuǎn)相除法(歐幾里德法)和相減法(更相減損法),這兩種方法分別基于求最大公約數(shù)的不同原理,需要的朋友可以參考下
    2024-11-11
  • python3爬取數(shù)據(jù)至mysql的方法

    python3爬取數(shù)據(jù)至mysql的方法

    這篇文章主要為大家詳細介紹了python3爬取數(shù)據(jù)至mysql的方法 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評論

法库县| 安阳县| 买车| 中方县| 长白| 阜平县| 青阳县| 铜鼓县| 潢川县| 来安县| 全椒县| 阿克陶县| 巴里| 抚宁县| 晋州市| 博湖县| 黑水县| 康马县| 揭阳市| 柘荣县| 天津市| 卢龙县| 改则县| 潜江市| 延吉市| 宁蒗| 尼木县| 洪江市| 沛县| 特克斯县| 仙居县| 温泉县| 罗源县| 阿合奇县| 增城市| 平塘县| 九江县| 涪陵区| 健康| 仙桃市| 揭阳市|