python注册钉钉回调事件的实现
admin
2023-05-01 07:00:17
目录

    钉钉API文档:https://www.zzm8.com/d/file/p/20210809150445158295/20210809150445158296

    钉钉有回调事件流程,有哪些回调?比如:通讯录回调、审批回调等等,拿通讯录回调来说,就是当你公司组织架构发生变动时,会自动触发你自己注册的回调地址,然后根据回调信息做一些自定义的处理,不得不说,钉钉真的是解决了协同办公的很多问题,非常nice,但就回调事件来说,每个企业只能注册一个回调地址,即使你要监听的是不同的事件、即使还有其他业务线需要用到回调,也只能不多于一个回调,当然这都是出于人家服务多方面考虑的设计,废话不多说,

    好,流程:

      一个注册端向钉钉发送注册请求,钉钉callback你自己的服务url,必须是公网访问的地址,并且该地址返回钉钉json数据来告诉钉钉回调成功

      注册成功之后这个地址就可以接收钉钉的回调post请求,做一些自定义处理,记得返回json

    好,代码

    1、注册端

    mport requests, json
    
    
    class DingDingCallBack(object):
        def __init__(self):
            self.appsecret=''
            self.appkey=''
            self.api_url = "https://www.zzm8.com/d/file/p/20210809150445158305/20210809150445158306
            self.aes_key = ""
            self.callbackUrl = "回调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://www.zzm8.com/d/file/p/20210809150445158311/20210809150445158312
            data = {
                "call_back_tag": ["bpms_task_change", "bpms_instance_change"], # 审批回调
                "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://www.zzm8.com/d/file/p/20210809150445158317/20210809150445158318
            response = requests.get(url, headers=self.headers, )
            print(response)
            print(response.text)
    
    
        def update_call_back(self):
            url = 'https://www.zzm8.com/d/file/p/20210809150445158319/20210809150445158320
            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://www.zzm8.com/d/file/p/20210809150446158321/20210809150446158322
            response = requests.get(url, headers=self.headers, )
            print(response.text)# todo 删除回调
        def delete_callback(self):
            url = 'https://www.zzm8.com/d/file/p/20210809150446158323/20210809150446158324
            result = requests.get(url)
            print(result)
            print(result.text)
    
    #
    if __name__ == '__main__':
        dingOBJ = DingDingCallBack()
        # todo 获取钉钉token
    #     # dingOBJ.get_token()
        # todo 获取回调失败
    #     dingOBJ.get_fail()
        # todo 注册回调
        # dingOBJ.regist_call_back()
        # todo 查询回调事件
        dingOBJ.query_callback()
        # todo 修改回调事件
    #     dingOBJ.update_call_back()
        # todo 删除回调
        # dingOBJ.delete_callback()

    2、回调端:以下示例代码为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://www.zzm8.com/d/file/p/20210809150446158325/20210809150446158326
    
    
    def randam_string(n):
        ran_str = ''.join(random.sample(string.ascii_letters + string.digits, n))
        return ran_str
    
    # 注册回调
    @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'))
    
    # 响应回调
    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': # 审批实例开始,结束
                url = 'https://www.zzm8.com/d/file/p/20210809150446158327/20210809150446158328
                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':  # 审批任务开始,结束,转交
                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 '组织架构添加'elif callback['EventType'] == 'org_dept_modify':
                print '组织架构变更'elif callback['EventType'] == 'org_dept_remove':
                print '组织架构删除'return HttpResponse(encrpyt)

    到此这篇关于python注册钉钉回调事件的实现的文章就介绍到这了,更多相关python注册钉钉回调事件内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

    相关内容

    热门资讯

    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...