{ "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 }