首页 > 编程语言 >python连接钉钉自动化提交OA审批

python连接钉钉自动化提交OA审批

时间:2024-08-13 17:08:09浏览次数:12  
标签:__ name python OA process models value 自动化 id

一、准备工作

1、安装阿里云支持包,点击跳转:https://open.dingtalk.com/document/resourcedownload/download-server-sdk
2、注册钉钉开发者账号,点击链接:https://open.dingtalk.com/
3、获取AK,SK
4、USERID通过企业管理后台可以查看每个用户的ID或者通过接口获取
5、PROCESS_CODE 在流程编辑页面的URL上面(是一个奇葩的设定,无语了家人们)

二、开发流程

1、获取企业token
2、提交审批
3、获取审批返回

import os
import sys

from typing import List

from alibabacloud_dingtalk.workflow_1_0.client import Client as dingtalkworkflow_1_0Client
from alibabacloud_dingtalk.oauth2_1_0.client import Client as dingtalkoauth2_1_0Client
from alibabacloud_dingtalk.oauth2_1_0 import models as dingtalkoauth_2__1__0_models
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.workflow_1_0 import models as dingtalkworkflow__1__0_models
from alibabacloud_tea_util import models as util_models


USER_ID = "1405122143xxxxxx"
PROCESS_CODE = "PROC-B897CFC7-CA66-449C-8C70-xxxxxx"

class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client() -> dingtalkoauth2_1_0Client:
        """
        使用 Token 初始化账号Client
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config()
        config.protocol = 'https'
        config.region_id = 'central'
        return dingtalkoauth2_1_0Client(config)

    @staticmethod
    def create_client_1_0() -> dingtalkworkflow_1_0Client:
        """
        使用 Token 初始化账号Client
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config()
        config.protocol = 'https'
        config.region_id = 'central'
        return dingtalkworkflow_1_0Client(config)

    @staticmethod
    def get_token() -> str:
        """
        获取实例TOKEN
        """
        client = Sample.create_client()
        get_access_token_request = dingtalkoauth_2__1__0_models.GetAccessTokenRequest(
            app_key='xxxxx',
            app_secret='yyyyyyyyyyyyyyyyy'
        )
        res = client.get_access_token(get_access_token_request)
        accessToken = res.body.access_token
        print("accessToken", accessToken)
        return accessToken

    @staticmethod
    def get_user_info(_token, _code):
        """
        没用,测试中
        """
        client = Sample.create_client()
        get_sso_user_info_headers = dingtalkoauth_2__1__0_models.GetSsoUserInfoHeaders()
        get_sso_user_info_headers.x_acs_dingtalk_access_token = _token
        get_sso_user_info_request = dingtalkoauth_2__1__0_models.GetSsoUserInfoRequest(
            code=_code
        )
        print(_token, _code)
        res = client.get_sso_user_info_with_options(get_sso_user_info_request, get_sso_user_info_headers,
                                              util_models.RuntimeOptions())
        print("res", res)

    @staticmethod
    def get_process_schema_info(token, process_code):
        """
        获取审批结构,例如审批中有哪些字段需要填写,可获取如下结构
        https://open-dev.dingtalk.com/apiExplorer?spm=ding_open_doc.document.0.0.61e032c7Lzbckc#/?devType=org&api=workflow_1.0%23QuerySchemaByProcessCode
        _formList = [
            {'id': 'TextField_1B9X1OGLRIDC0', 'name': '部门', 'value': "平台"},
            {'id': 'MoneyField_265MJ5CX7OLC', 'name': '金额(元)', 'value': "100"},
            {'id': 'TextareaField_1JQHWE0CZJ6O0', 'name': '分润明细', 'value': "https://www.baidu.com"},
            {'id': 'TextField_12VLX2OCTGNK0', 'name': '对公-公司全称', 'value': "途强"},
            {'id': 'TextField_23VZA2Q6HHLS0', 'name': '开户行', 'value': "途强"},
            {'id': 'NumberField_5DTYPD4WMP40', 'name': '对公账号', 'value': "123123123"},
            {'id': 'TextField_15B01GLYJL280', 'name': '联系人', 'value': "途强"},
            {'id': 'TextField_UTT9HNYLMV40', 'name': '联系电话', 'value': "途强"},
            {'id': 'TextareaField_BIO57GH5LFC0', 'name': '备注', 'value': "https://www.baidu.com"}
        ]
        """
        client = Sample.create_client_1_0()
        query_schema_by_process_code_headers = dingtalkworkflow__1__0_models.QuerySchemaByProcessCodeHeaders()
        query_schema_by_process_code_headers.x_acs_dingtalk_access_token = token
        query_schema_by_process_code_request = dingtalkworkflow__1__0_models.QuerySchemaByProcessCodeRequest(
            process_code=process_code
        )

        res = client.query_schema_by_process_code_with_options(query_schema_by_process_code_request, query_schema_by_process_code_headers, util_models.RuntimeOptions())
        # print("res", res.body.result.schema_content.items)
        items = res.body.result.schema_content.items
        formComponentObj = {
            "name":"",
            "value":""
        }
        formComponentValues = []
        for item in items:
            Obj = {
                "id": item.props.id,
                "name": item.props.label,
                "value": 123
            }
            formComponentValues.append(Obj)
        return formComponentValues

    @staticmethod
    def post_process_instance(token, user_id, process_code, form_list):
        """
        创建一个新的审批, 每一个字段的name value 是必填字段
        https://open-dev.dingtalk.com/apiExplorer?spm=ding_open_doc.document.0.0.61e032c7Lzbckc#/?devType=org&api=workflow_1.0%23StartProcessInstance
        _formList = [
            {'id': 'TextField_1B9X1OGLRIDC0', 'name': '部门', 'value': "平台"},
            {'id': 'MoneyField_265MJ5CX7OLC', 'name': '金额(元)', 'value': "100"},
            ...
        ]
        """
        client = Sample.create_client_1_0()
        start_process_instance_headers = dingtalkworkflow__1__0_models.StartProcessInstanceHeaders()
        start_process_instance_headers.x_acs_dingtalk_access_token = token
        form_component_values = []
        for item in form_list:
            values_obj = dingtalkworkflow__1__0_models.StartProcessInstanceRequestFormComponentValues(
                id=item['id'],
                name=item['name'],
                value=item['value']
            )
            form_component_values.append(values_obj)
            # break
        start_process_instance_request = dingtalkworkflow__1__0_models.StartProcessInstanceRequest(
            dept_id=890417386,
            originator_user_id=user_id,
            process_code=process_code,
            form_component_values=form_component_values
        )

        res = client.start_process_instance_with_options(start_process_instance_request, start_process_instance_headers,
                                                   util_models.RuntimeOptions())
        print("res====", res)
        return res.body.instance_id

    @staticmethod
    def get_instance_info(token, instance_id):
        """
        查询实例审批状态
        https://open-dev.dingtalk.com/apiExplorer?spm=ding_open_doc.document.0.0.61e032c7Lzbckc#/?devType=org&api=workflow_1.0%23GetProcessInstance
        {
            "business_id": res.body.result.business_id,  # 审批实例业务编号。 可通过钉钉查询
            "status": res.body.result.status,  # 状态 RUNNING:审批中  TERMINATED:已撤销  COMPLETED:审批完成
            "result": res.body.result.result # agree:同意  refuse:拒绝 status为COMPLETED且result为agree时,表示审批单完结并审批通过。
        }
        """
        client = Sample.create_client_1_0()
        get_process_instance_headers = dingtalkworkflow__1__0_models.GetProcessInstanceHeaders()
        get_process_instance_headers.x_acs_dingtalk_access_token = token
        get_process_instance_request = dingtalkworkflow__1__0_models.GetProcessInstanceRequest(
            process_instance_id=instance_id
        )
        res = client.get_process_instance_with_options(get_process_instance_request, get_process_instance_headers,
                                                 util_models.RuntimeOptions())
        if res.body.success:
            return {
                "business_id": res.body.result.business_id,  # 审批实例业务编号。 可通过钉钉查询
                "status": res.body.result.status,  # 状态 RUNNING:审批中  TERMINATED:已撤销  COMPLETED:审批完成
                "result": res.body.result.result # agree:同意  refuse:拒绝 status为COMPLETED且result为agree时,表示审批单完结并审批通过。
            }
        else:
            return {}


if __name__ == '__main__':
    token = Sample.get_token()
    formList = Sample.get_process_schema_info(token, PROCESS_CODE)
    # 如果已知审批结构可以直接写死,不用去获取结构
    _formList = [
        {'id': 'TextField_1B9X1OGLRIDC0', 'name': '部门', 'value': "平台"},
        {'id': 'MoneyField_265MJ5CX7OLC', 'name': '金额(元)', 'value': "100"},
        {'id': 'TextareaField_1JQHWE0CZJ6O0', 'name': '分润明细', 'value': "https://www.baidu.com"},
        {'id': 'TextField_12VLX2OCTGNK0', 'name': '对公-公司全称', 'value': "途强"},
        {'id': 'TextField_23VZA2Q6HHLS0', 'name': '开户行', 'value': "途强"},
        {'id': 'NumberField_5DTYPD4WMP40', 'name': '对公账号', 'value': "123123123"},
        {'id': 'TextField_15B01GLYJL280', 'name': '联系人', 'value': "途强"},
        {'id': 'TextField_UTT9HNYLMV40', 'name': '联系电话', 'value': "途强"},
        {'id': 'TextareaField_BIO57GH5LFC0', 'name': '备注', 'value': "https://www.baidu.com"}
    ]
	# 提交审批,并返回审批ID
    instanceId = Sample.post_process_instance("beab04e9490a3700a577a4c1c15d9698", USER_ID, PROCESS_CODE, _formList)
	# 获取审批其他详细信息
    result = Sample.get_instance_info("beab04e9490a3700a577a4c1c15d9698", "tlB2uVSURhOhp9SzVPbi3g08441723284181")
    # print("result", result)

标签:__,name,python,OA,process,models,value,自动化,id
From: https://www.cnblogs.com/Abraverman/p/18357347

相关文章

  • LayUI Upload组件连续上传同一文件无反应
    可能原因:组件会缓存上次的上传历史,若是同一文件就不处理具体原因:待查解决方法:在choose里面增加如下语句“uploadListIns.config.elem.next()[0].value='' ”varuploadListIns=upload.render({elem:'#FileUpload',elemList:$('#FileList'),//列表元素对......
  • 【Python机器学习】树回归——使用Python的tkinter库创建GUI
    机器学习给我们提供了一些强大的工具,能从未知数据中抽取出有用的信息。因此,能否这些信息以易于人们理解的方式呈现十分重要。如果人们可以直接与算法和数据交互,将可以比较轻松的进行解释。其中一个能够同时支持数据呈现和用户交互的方式就是构建一个图形用户界面(GUI)。利用GUI......
  • python 画小提琴图
    我这里有2023年6月-2024年8月每日的温度数据,想画一个小提琴图,看看其中值等信息代码如下:#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:vilolinpic.py@time:2024/08/13@desc:"""importpandasaspdimportmatplotlib.pyplotaspltimport......
  • 分层运维自动化监控
    分层运维自动化监控背景    架构设计的分层架构思想是一种将软件系统划分为多个层次的设计方法,每个层次都有其特定的职责和功能,通过层次之间的接口进行通信,以实现系统的整体目标。这种设计思想的核心在于将复杂的系统分解为一系列相对独立的子问题,并通过各层的协作来提供整......
  • 24.python模块
    python中的模块(一)模块的介绍1、python中模块:模块也是一个python文件,也叫.py文件2、一个模块中包含:类、函数、变量、方法等3、模块的结构:4、一个模块能够有逻辑的组织python的代码段二、模块的导入1、import模块名importtimeprint(1)time.sleep(5)print(2)2、fro......
  • python之selenium基础知识
    内容总结自官方文档https://www.selenium.dev/documentation/SeleniumWebDriverWebDriver被设计为一个简单而简洁的编程接口。WebDriver是一个紧凑的面向对象API。它有效地驱动浏览器。Selenium通过使用WebDriver支持市场上所有主要浏览器的自动化。WebDriver定义了......
  • 23.python函数
    (1)len函数:返回字符的长度计算列表的长度、字符长度、元组的长度、字典长度案例:list=[1,2,3,4]print(len(list))#4(2)abs绝对值a=-1print(abs(a))#1(3)sum函数求和print(sum(range(1,101)))list=[1,2,3,4]print(sum(list))#104、max最大值list=[1,2,......
  • 用 Python示例,怎么利用电商api来制定营销策略!
    以下是一个更完整的示例代码,用于使用电商API数据来制定营销策略。在这个示例中,我们不仅获取最畅销的商品,还获取不同价格段的销售分布,以制定更全面的营销策略:importrequestsimportjson#假设这是获取商品销售数据的API端点api_endpoint="https://example-ecommerce-......
  • 本地通过python运行AI大语言模型LLaMa2
    什么是Llama2Llama全称largelanguagemodel, MetaAI公司2023年发布的开源AI大型语言模型,参数7B~65B。最新版本为Llama3。更为详细的介绍可参考,LLaMA-维基百科,自由的百科全书(wikipedia.org)。什么是llama.cpp?一个开源c++库,用c++重写了LLaMa的推理代码,可用于加载......
  • 基于Python训练完成的机器学习模型如何封装成桌面应用
    有时候需要将训练完成的模型封装成桌面应用,本文描述封装成基于Python的桌面应用程序的方法。模型封装是指将模型及其预处理和后处理步骤打包在一起,形成一个独立的服务单元。确保机器学习模型已经训练完成并且能够在本地环境中正确运行。Python有多种GUI库可供选择,如Tkinter、......