python连接钉钉自动化提交OA审批
一、准备工作
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)
python连接钉钉自动化提交OA审批的更多相关文章
- Python自定义钉钉机器人发送自动化结果报告
环境python3.5+jenkins # coding:utf-8 import urllib.request import json import sys import time import r ...
- 用Python实现阿里钉钉机器人读取数据库内容自动发群通知
最近想把一些预警数据信息按照一定的要求自动发送到移动端APP,最终把目标放在了腾讯的微信和阿里的钉钉软件上,由于刚开始学习python,于是编程工具想用python来实现.微信使用群体最广,通过一天的 ...
- 运维利器:钉钉机器人脚本告警(Linux Python 篇)
写在前面的话 在前面的博客中已经具体提到了如何获取对的机器人的 Token 等操作,不清楚的可以参考之前写的 [运维利器:钉钉机器人脚本告警(Linux Shell 篇)]这篇博客的前部分. 本文主要 ...
- 怎么用python 3 开发钉钉群机器人
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python绿色通道 PS:如有需要Python学习资料的小伙伴可以加 ...
- 几行python代码实现钉钉自动打卡,网友:终于告别缺勤了
前言 众所周知因为疫情的原因大家都没有办法上学和上班,“钉钉”这个app起到了重大的作用.学校为了学生成绩开启“钉钉”之路.老师也成一个“合格”的主播,感谢XXX童鞋的礼物.666扣起来 老师为了营造 ...
- Python 实现 T00ls 自动签到脚本(邮件+钉钉通知)
T00ls 每日签到是可以获取 TuBi 的,由于常常忘记签到,导致损失了很多 TuBi .于是在 T00ls 论坛搜索了一下,发现有不少大佬都写了自己的签到脚本,签到功能实现.定时任务执行以及签到提 ...
- Python钉钉报警及Zabbix集成钉钉报警
钉钉报警设置 创建群机器人 11111 接口地址 发送短消息 发送普通消息 import requests import json url = 'https://oapi.dingtalk.com/r ...
- 使用python实现钉钉告警通知功能
前言:日常工作中告警通知是必不可少的,一般会使用邮件.钉钉.企业微信等,今天分享一下使用python实现钉钉告警 一. 钉钉机器人创建 登录钉钉客户端,创建一个群,把需要收到报警信息的人员都拉到这个群 ...
- iOS自动化打包 Jenkins+Gitlab+Fastlane+蒲公英+钉钉
前言 这两天花时间整理一下自动化打包的整套流程,现在iOS端的整套流程是没有问题了,这个过程中踩得坑也的确是特别多,所以这周末把整个流程整理一下,总结出来这篇文章,希望能对有需要的小伙伴有点点帮助. ...
- 第六章:用Python实现自动发送邮件和发送钉钉消息
目录 发送邮件源码 发送钉钉消息源码 源码地址 本文可以学习到以下内容: 使用requests库发送钉钉消息 使用email和smtplib库发送邮件 使用163邮箱服务,自动发送邮件及附件 发送邮件 ...
随机推荐
- MacOSX 运行Unity卡顿 [gethostname]
用MacbookPro 32G i7 独显 的高配打开项目发现异常卡顿, Win平台没有问题 打开Unity的Profiler DeepProfiler. 发现完全是卡在 dns.gethostnam ...
- MySQL常见的后端面试题,你会几道?
为什么分库分表 单表数据量过大,会出现慢查询,所以需要水平分表 可以把低频.高频的字段分开为多个表,低频的表作为附加表,且逻辑更加清晰,性能更优 随着系统的业务模块的增多,放到单库会增加其复杂度,逻辑 ...
- Markdown常用语法详解
背景知识 什么是html html是一种网页标记语言.我们平常见到的那么好看的网页就是通过html语言来编写的. html语言举例: <h1>hello world</h1> ...
- map(STL容器)
map 一种基于红黑树(不需了解)的关联树容器,支持快速的插入,查找和删除操作,并保持了内部元素的有序性,其中每一个元素都有一个键和一个与之关联得值组成. 可以形象的理解为一个转换器,给它一个东西(变 ...
- P6623 [省选联考 2020 A 卷] 树
day2t2但难度不大,和AGC044C解法类似 题目大意: 给定一棵 \(n\) 个结点的有根树 \(T\),结点从 \(1\) 开始编号,根结点为 \(1\) 号结点,每个结点有一个正整数权值 \ ...
- 鸿蒙生态伙伴SDK市场正式发布,驱动千行百业鸿蒙原生应用开发
6月21-23日,华为开发者大会(HDC 2024)在东莞举办.在22日举办的[鸿蒙生态伙伴SDK]论坛中,正式发布了[鸿蒙生态伙伴SDK市场](以下简称:伙伴SDK市场),伙伴SDK市场是为开发者提 ...
- Freertos学习:04-任务的调试函数
--- title: rtos-freertos-04-任务的调试函数 EntryName: rtos-freertos-04-task-debug date: 2020-06-22 08:49:06 ...
- 使用了条件三元运算符来判断 this.temp.id 是否存在且 mt_qty 是否已被赋值
mt_qty: (this.temp.id && this.temp.mt_qty) ? this.temp.mt_qty : event.wo_wip,在这个修正后的代码中,使用了条 ...
- [项目自荐] 交叉编译njs并使用Nginx搭建自由的个人网盘:vList5
这个博客好久没有打理了,最近才想起来 这篇文章是以下 5 篇文章的组合,希望这个免费的项目能实现他的初衷吧 vList5:部署指南 vList5.3 全面加密,从我做起 njs 从入门(交叉编译)到入 ...
- oeasy教您玩转vim - 20 - 显示标尺
显示标尺 回忆上节课内容 定义标记 a ma 删除标记 a :delm a 跳转到标记 a 'a `a 跳到 a 对应的行和列 'a 跳到 a 对应的行 查看所有标记 :marks 各种标记类型 '' ...