脚本
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "initial_id",
|
||||
"metadata": {
|
||||
"collapsed": true,
|
||||
"ExecuteTime": {
|
||||
"end_time": "2025-09-18T10:00:16.197070Z",
|
||||
"start_time": "2025-09-18T10:00:13.725057Z"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"from datetime import datetime\n",
|
||||
"import time\n",
|
||||
"from typing import Optional, List, Dict, Any\n",
|
||||
"import requests\n",
|
||||
"import json\n",
|
||||
"import pandas as pd\n",
|
||||
"\n",
|
||||
"token = \"Bearer qygHulymo1fekJk4CIZyNKjyQAzG8CFN\"\n",
|
||||
"\n",
|
||||
"class API:\n",
|
||||
" def entry_data_list(self, data: dict, replace: bool = False, max_retries: int = 20) -> Dict: # 获取多条表单数据\n",
|
||||
" \"\"\"\n",
|
||||
" 获取多条表单数据\n",
|
||||
" :param max_retries: 最大重试次数\n",
|
||||
" :param replace: 是否替换字段\n",
|
||||
" :param data:\n",
|
||||
" api_key: 应用id\n",
|
||||
" entry_id: 表单id\n",
|
||||
" :return:\n",
|
||||
" \"\"\"\n",
|
||||
"\n",
|
||||
" url = 'https://api.jiandaoyun.com/api/v5/app/entry/data/list'\n",
|
||||
"\n",
|
||||
" headers = {\n",
|
||||
" 'Authorization': token, # 曹伟应用api测试 app_key\n",
|
||||
" 'Content-Type': 'application/json'\n",
|
||||
" }\n",
|
||||
" all_data_batches = [] # 用于存储每次请求返回的数据批次\n",
|
||||
" last_data_id = None\n",
|
||||
" exit_flag = False\n",
|
||||
" while True:\n",
|
||||
" payload = json.dumps({\n",
|
||||
" \"app_id\": data['api_key'], # 应用ID\n",
|
||||
" \"entry_id\": data['entry_id'], # 表单ID\n",
|
||||
" \"filter\":data.get('filter', {}),\n",
|
||||
" \"limit\": 100,\n",
|
||||
" \"data_id\": last_data_id\n",
|
||||
" })\n",
|
||||
" retries = 0\n",
|
||||
" while retries <= max_retries:\n",
|
||||
" try:\n",
|
||||
" res = requests.post(url=url, data=payload, headers=headers, timeout=10)\n",
|
||||
" res.raise_for_status() # 检查HTTP响应状态码,如果不等于200会抛出异常\n",
|
||||
" data_get = res.json()\n",
|
||||
" if data_get[\"data\"]:\n",
|
||||
" all_data_batches.extend(data_get['data'])\n",
|
||||
" last_data_id = data_get['data'][-1].get('_id')\n",
|
||||
" break # 成功则跳出循环\n",
|
||||
" else:\n",
|
||||
" if 'data' not in data_get or len(data_get['data']) == 0:\n",
|
||||
" exit_flag = True\n",
|
||||
" break\n",
|
||||
" retries += 1\n",
|
||||
" time.sleep(0.1) # 在重试之间稍作停顿\n",
|
||||
" except requests.exceptions.RequestException as e:\n",
|
||||
" retries += 1\n",
|
||||
" time.sleep(0.1) # 在重试之间稍作停顿\n",
|
||||
" if retries > max_retries:\n",
|
||||
" all_data_batches.append(None) # 或者可以选择记录失败的payload以便后续处理\n",
|
||||
" if exit_flag:\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
" # 构建最终返回的字典\n",
|
||||
" final_data = {\n",
|
||||
" 'data': all_data_batches # 'data' 键对应的值是列表的列表\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" return final_data\n",
|
||||
"\n",
|
||||
" @staticmethod\n",
|
||||
" def workflow_instance_get(data: dict, max_retries: int = 20) -> dict:\n",
|
||||
" \"\"\"\n",
|
||||
" 查询实例流程信息\n",
|
||||
" :param max_retries:\n",
|
||||
" :param data: 简道云插件发送过来的data,包含应用id\n",
|
||||
" :return: 查询简道云流程实例信息返回的结果\n",
|
||||
" \"\"\"\n",
|
||||
" url = 'https://api.jiandaoyun.com/api/v5/workflow/instance/get'\n",
|
||||
"\n",
|
||||
" headers = {\n",
|
||||
" 'Authorization': token, # 曹伟应用api测试 appKey\n",
|
||||
" 'Content-Type': 'application/json'\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" payload = json.dumps({\n",
|
||||
" \"instance_id\": data['data_id'],\n",
|
||||
" \"tasks_type\": 1\n",
|
||||
" }\n",
|
||||
" )\n",
|
||||
" data_get = None\n",
|
||||
" retries = 0\n",
|
||||
" while retries <= max_retries:\n",
|
||||
" try:\n",
|
||||
" res = requests.post(url=url, data=payload, headers=headers, timeout=10)\n",
|
||||
" res.raise_for_status() # 检查HTTP响应状态码,如果不等于200会抛出异常\n",
|
||||
" data_get = res.json()\n",
|
||||
" # print( \"返回结果:\", data_get)\n",
|
||||
" if res.status_code == 200:\n",
|
||||
" break # 成功则跳出循环\n",
|
||||
" else:\n",
|
||||
" retries += 1\n",
|
||||
" time.sleep(3) # 在重试之间稍作停顿\n",
|
||||
" except requests.exceptions.RequestException as e:\n",
|
||||
" retries += 1\n",
|
||||
" time.sleep(0.1) # 在重试之间稍作停顿\n",
|
||||
" if retries > max_retries:\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
" return data_get\n",
|
||||
"\n",
|
||||
" @staticmethod\n",
|
||||
" def workflow_task_approve(data: dict) -> dict:\n",
|
||||
" \"\"\"\n",
|
||||
" 流程待办提交\n",
|
||||
" :param data:应包含username、instance_id(data_id)、task_id等信息\n",
|
||||
" :return:返回简道云流程待办提交的结果\n",
|
||||
" \"\"\"\n",
|
||||
" url = 'https://api.jiandaoyun.com/api/v1/workflow/task/approve'\n",
|
||||
"\n",
|
||||
" headers = {\n",
|
||||
" 'Authorization': token, # 曹伟应用api测试 appKey\n",
|
||||
" 'Content-Type': 'application/json'\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" payload = json.dumps({\n",
|
||||
" \"username\": data[\"username\"],\n",
|
||||
" \"instance_id\": data[\"instance_id\"],\n",
|
||||
" \"task_id\": data['task_id'],\n",
|
||||
" \"comment\": \"\"\n",
|
||||
" }\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" res = requests.post(url=url, data=payload, headers=headers, timeout=10)\n",
|
||||
" return res.json()\n",
|
||||
"\n",
|
||||
" @staticmethod\n",
|
||||
" def data_batch_create(data: dict, max_retries: int = 20) -> Optional[requests.Response]: # 新建单条数据\n",
|
||||
" \"\"\"\n",
|
||||
" 新建单条表单数据\n",
|
||||
" :param max_retries: 最大重试次数\n",
|
||||
" :param data: 应该包含应用id、表单id,以及新建的数据data['data']\n",
|
||||
" :return: 返回创建后简道云返回的信息\n",
|
||||
" \"\"\"\n",
|
||||
" url = 'https://api.jiandaoyun.com/api/v5/app/entry/data/create'\n",
|
||||
"\n",
|
||||
" headers = {\n",
|
||||
" 'Authorization': token, # 曹伟应用api测试 app_key\n",
|
||||
" 'Content-Type': 'application/json'\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" \"\"\"\n",
|
||||
" data 样式 # 后续优化发送数据样式 目前输入字段,后续优化输入表单名称\n",
|
||||
" jiandaoyun_data['data'] = {\"_widget_1731650067055\":{\"value\":f'{username}{password}'},\n",
|
||||
" \"_widget_1731650067056\":{\"value\": f\"{group}\"}}\n",
|
||||
" \"\"\"\n",
|
||||
" # noinspection DuplicatedCode\n",
|
||||
" payload = json.dumps({\n",
|
||||
" \"app_id\": data['api_key'], # 应用ID\n",
|
||||
" \"entry_id\": data['entry_id'], # 表单ID\n",
|
||||
" \"data\": data['data'],\n",
|
||||
" \"is_start_workflow\": data.get('is_start_workflow', \"false\"),\n",
|
||||
" \"is_start_trigger\": data.get('is_start_trigger', \"false\"),\n",
|
||||
" \"transaction_id\": data.get('transaction_id', \"\")\n",
|
||||
" }\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" retries = 0\n",
|
||||
" while retries <= max_retries:\n",
|
||||
" try:\n",
|
||||
" res: requests.Response = requests.post(url=url, data=payload, headers=headers, timeout=10)\n",
|
||||
" res.raise_for_status() # 检查HTTP响应状态码,如果不等于200会抛出异常\n",
|
||||
" data_get = res.json()\n",
|
||||
" if res.status_code == 200:\n",
|
||||
" return data_get\n",
|
||||
" else:\n",
|
||||
" retries += 1\n",
|
||||
" time.sleep(3) # 在重试之间稍作停顿\n",
|
||||
" except requests.exceptions.RequestException as e:\n",
|
||||
" retries += 1\n",
|
||||
" time.sleep(3) # 在重试之间稍作停顿\n",
|
||||
" if retries > max_retries:\n",
|
||||
" print(\n",
|
||||
" f\"任务 {data['data_list']} 连续{max_retries}次请求失败,放弃此次请求。\")\n",
|
||||
" return None\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"task_data = API().entry_data_list(data={\n",
|
||||
" \"api_key\": \"675b900991ad2491c69389ca\", # 应用ID\n",
|
||||
" \"entry_id\": \"6866179f6a73c0d879208bcc\", # 表单ID\n",
|
||||
" \"filter\": {\n",
|
||||
" \"rel\":\"and\",\n",
|
||||
" \"cond\":[{\"field\": \"flowState\", \"type\": \"flowstate\", \"method\": \"eq\", \"value\": 0}]\n",
|
||||
" }\n",
|
||||
" }).get(\"data\") # 获取最新权限列表\n",
|
||||
"\n",
|
||||
"# print(task_data)\n",
|
||||
"\n",
|
||||
"get_task_id = API().workflow_instance_get({\"data_id\": \"6899c470e76673e26f9520a7\"})\n",
|
||||
"print(get_task_id)\n",
|
||||
"flow_name = get_task_id.get(\"tasks\")[-1].get(\"flow_name\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# # 表单提交到下一步\n",
|
||||
"# res = API().workflow_task_approve({\n",
|
||||
"# \"username\":user_name,\n",
|
||||
"# \"task_id\": task_id,\n",
|
||||
"# \"instance_id\": \"6899c470e76673e26f9520a7\",\n",
|
||||
"# })"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"{'app_id': '675b900991ad2491c69389ca', 'form_id': '6866179f6a73c0d879208bcc', 'form_title': '查看权限开通情况', 'instance_id': '6899c470e76673e26f9520a7', 'url': 'https://dingtalk.jiandaoyun.com/workflow/process_instance/6899c470e76673e26f9520a7', 'update_time': '2025-08-11T10:22:40.294Z', 'create_time': '2025-08-11T10:22:40.291Z', 'finish_time': None, 'status': 0, 'creator': {'username': '192563574629076267', 'name': '王佳佳', 'departments': [177751223], 'type': 0, 'status': 1, 'integrate_id': '192563574629076267'}, 'tasks': [{'app_id': '675b900991ad2491c69389ca', 'form_id': '6866179f6a73c0d879208bcc', 'form_title': '查看权限开通情况', 'title': '流程发起节点', 'instance_id': '6899c470e76673e26f9520a7', 'task_id': '6899c470e76673e26f9520e9', 'flow_id': 0, 'flow_name': '流程发起节点', 'url': 'https://dingtalk.jiandaoyun.com/workflow/process_instance/6899c470e76673e26f9520a7/task/6899c470e76673e26f9520e9', 'assignee': {'username': '192563574629076267', 'name': '王佳佳', 'departments': [177751223], 'type': 0, 'status': 1, 'integrate_id': '192563574629076267'}, 'creator': {'username': '192563574629076267', 'name': '王佳佳', 'departments': [177751223], 'type': 0, 'status': 1, 'integrate_id': '192563574629076267'}, 'create_time': '2025-08-11T10:22:40.292Z', 'create_action': 'forward', 'finish_time': '2025-08-11T10:22:40.292Z', 'finish_action': 'forward', 'status': 1}, {'app_id': '675b900991ad2491c69389ca', 'form_id': '6866179f6a73c0d879208bcc', 'form_title': '查看权限开通情况', 'title': '审批节点', 'instance_id': '6899c470e76673e26f9520a7', 'task_id': '6899c470e76673e26f9520fb', 'flow_id': 1, 'flow_name': '审批节点', 'url': 'https://dingtalk.jiandaoyun.com/workflow/process_instance/6899c470e76673e26f9520a7/task/6899c470e76673e26f9520fb', 'assignee': {'username': '161704576234484017', 'name': '袁浩茹', 'departments': [110823487], 'type': 0, 'status': 1, 'integrate_id': '161704576234484017'}, 'creator': {'username': '192563574629076267', 'name': '王佳佳', 'departments': [177751223], 'type': 0, 'status': 1, 'integrate_id': '192563574629076267'}, 'create_time': '2025-08-11T10:22:40.293Z', 'create_action': 'forward', 'finish_time': None, 'finish_action': None, 'status': 0}]}\n",
|
||||
"审批节点 161704576234484017\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"execution_count": 7
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 2
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython2",
|
||||
"version": "2.7.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
Reference in New Issue
Block a user