登录

说明:
用法:在data中加入 loginid userpassword 的(账号密码加密后)值发送请求即可登录 可在网页中抓取(登录有效期:长期)

# 登录OA
def checkLogin():
    global OA_session
    headers = {'accept': '*/*',
               'accept-encoding': 'gzip, deflate',
               'accept-language': 'zh-CN,zh;q=0.9',
               'cache-control': 'no-cache',
               'connection': 'keep-alive',
               'content-length': '910',
               'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
               'host': 'oa.en-plus.com.cn:8090',
               'origin': 'http://oa.en-plus.com.cn:8090',
               'pragma': 'no-cache',
               'referer': 'http://oa.en-plus.com.cn:8090/wui/index.html',
               'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
               'x-requested-with': 'XMLHttpRequest'}
    data = {'islanguid': '7',
            'loginid': '',
            'userpassword': '',
            'dynamicPassword': '', 'tokenAuthKey': '', 'validatecode': '', 'validateCodeKey': '', 'logintype': '1',
            'messages': '', 'isie': 'false', 'appid': '', 'service': ''}

    url = 'http://oa.en-plus.com.cn:8090/api/hrm/login/checkLogin'
    token_string = ''
    response = OA_session.post(url, headers=headers, data=data)
    if response.status_code == 200:
        data_dict = response.json()
        msginfo = data_dict['msg']
        print('OA系统:' + msginfo)
    else:
        print('登录失败')

获取dataKEy

说明:获取单一OA的dataKEy
用法:输入OA流程单号

# 获取单一OA的dataKEy
# 输入流程号
def getQueryResultKey(OA_danhao_num):
    global OA_session
    url = 'http://oa.en-plus.com.cn:8090/api/workflow/customQuery/getQueryResultKey'
    headers = {'accept': '*/*',
               'accept-encoding': 'gzip, deflate',
               'accept-language': 'zh-CN,zh;q=0.9',
               'cache-control': 'no-cache',
               'connection': 'keep-alive',
               'content-length': '440',
               'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
               'host': 'oa.en-plus.com.cn:8090',
               'origin': 'http://oa.en-plus.com.cn:8090',
               'pragma': 'no-cache',
               'referer': 'http://oa.en-plus.com.cn:8090/wui/index.html',
               'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
               'x-requested-with': 'XMLHttpRequest'}
    data = {'operBtnKey': ' batchSubmit', 'workcode': OA_danhao_num, 'belongPathTree': 'true', 'fromwhere': 'queryIndex',
            'menuIds': '1,15', 'menuPathIds': '1,15'}
    response = OA_session.post(url, headers=headers, data=data)
    if response.status_code == 200:
        data_text = response.text
        data_dict = json.loads(data_text)
        sessionkey = data_dict['sessionkey']
    else:
        sessionkey = '0'
    return sessionkey

获取requestid

说明:
用法:输入参数 dataKey

# 获取流程数据
def get_data_response(dataKey):
    global OA_session
    data_url = 'http://oa.en-plus.com.cn:8090/api/ec/dev/table/datas'  # 请求data
    dataKey = dataKey
    data_headers = {
        'accept': '*/*',
        'accept-encoding': 'gzip, deflate',
        'accept-language': 'zh-CN,zh;q=0.9',
        'connection': 'keep-alive',
        'content-length': '106',
        'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
        'host': 'oa.en-plus.com.cn:8090',
        'origin': 'http://oa.en-plus.com.cn:8090',
        'referer': 'http://oa.en-plus.com.cn:8090/wui/index.html',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
        'x-requested-with': 'XMLHttpRequest'}
    data_data = {
        'dataKey': dataKey,
        'current': '1',
        'sortParams': '[]'}
    data_response = OA_session.post(data_url, headers=data_headers, data=data_data)
    if data_response.status_code == 200:
        print('获取流程数据')
        data_json_str = data_response.text
        shuju_data = json.loads(data_json_str)
        data_dict = shuju_data['datas']
        requestid = data_dict[0]['requestid']
    else:
        requestid = '0'

    return requestid

获取params

说明:params 包含流程用途内容 以及所有关键参数
用法:传入参数requestid

# 获取params,params 包含流程用途内容 以及所有关键参数
def mainData_main(requestid):
    global OA_session
    timestamp1 = int(datetime.now().timestamp() * 1000)
    timestamp = str(timestamp1)
    wupin_datas = {}
    data = {}
    requestid = requestid
    url_1 = ' http://oa.en-plus.com.cn:8090/api/workflow/reqform/loadForm?ispreload=1'
    url_2 = '&requestid=' + requestid
    url_3 = '&preloadkey=' + timestamp + '&timestamp=' + timestamp
    url = url_1 + url_2 + url_3
    response = OA_session.post(url, data=data)
    if response.status_code == 200:
        yongtu_data = response.json()
        # 获取物品名称所需token
        params = yongtu_data['params']
        wupin_datas['timestamp'] = timestamp
        wupin_datas['params'] = params
        wupin_datas['mainData_2'] = None
        mainData = yongtu_data['maindata']
        if 'field8831' in mainData:  # 辅助耗材
            mainData_1 = mainData['field8831']
            mainData_2 = mainData_1['value']
            wupin_datas['mainData_2'] = mainData_2  # 用途
        else:
            pass
    else:
        pass
    return wupin_datas

获取流程中的物品信息

说明:
用法:传入时间戳 和 params

# 获取物品信息
def wuping_main(timestamp, params):
    global OA_session
    url = 'http://oa.en-plus.com.cn:8090/api/workflow/reqform/detailData'
    wupin_data = []  # 创建列表
    try:
        requestid = params['requestid']
        workflowid = params['workflowid']
        nodeid = params['nodeid']
        formid = params['formid']
        isbill = params['isbill']
        f_weaver_belongto_userid = params['f_weaver_belongto_userid']
        f_weaver_belongto_usertype = params['f_weaver_belongto_usertype']
        authStr = params['authStr']
        authSignatureStr = params['authSignatureStr']
        signatureSecretKey = params['signatureSecretKey']
        signatureAttributesStr = params['signatureAttributesStr']
        nodetype = params['nodetype']
        isviewonly = params['isviewonly']
        isaffirmance = params['isaffirmance']
        isshared = params['isshared']
        iswfshare = params['iswfshare']
        ismode = params['ismode']
        modeid = params['modeid']
        creater = params['creater']
        needconfirm = params['needconfirm']
        creatertype = params['creatertype']
        requestType = params['requestType']
        isSelfAuth = params['isSelfAuth']
        isprint = params['isprint']
        wfmonitor = params['wfmonitor']
        isurger = params['isurger']
        intervenorright = params['intervenorright']
        selectNextFlow = params['selectNextFlow']
        agentType = params['agentType']
        agentorByAgentId = params['agentorByAgentId']
        layouttype = params['layouttype']
        apiResultCacheKey = params['apiResultCacheKey']

        reqParams = {"requestid": '', "workflowid": '', "nodeid": '', "formid": '', "isbill": '1',
                     "f_weaver_belongto_userid": "1240", "f_weaver_belongto_usertype": "0", "authStr": " ",
                     "authSignatureStr": " ", "signatureSecretKey": "", "signatureAttributesStr": "", "nodetype": "1",
                     "isviewonly": '0', "isaffirmance": "", "isshared": "0", "iswfshare": "0", "ismode": '2',
                     "modeid": '11272', "creater": '203', "needconfirm": "", "creatertype": '0', "requestType": '1',
                     "isSelfAuth": '1', "isprint": "0", "wfmonitor": 'false', "isurger": 'false',
                     "intervenorright": '0', "selectNextFlow": "0", "agentType": '0', "agentorByAgentId": '-1',
                     "layouttype": '0', "apiResultCacheKey": '1734491116558'}

        reqParams['requestid'] = str(requestid)
        reqParams['workflowid'] = str(workflowid)
        reqParams['nodeid'] = str(nodeid)
        reqParams['formid'] = str(formid)
        reqParams['isbill'] = str(isbill)
        reqParams['f_weaver_belongto_userid'] = str(f_weaver_belongto_userid)
        reqParams['f_weaver_belongto_usertype'] = str(f_weaver_belongto_usertype)
        reqParams['authStr'] = str(authStr)
        reqParams['authSignatureStr'] = str(authSignatureStr)
        reqParams['signatureSecretKey'] = str(signatureSecretKey)
        reqParams['signatureAttributesStr'] = str(signatureAttributesStr)
        reqParams['nodetype'] = str(nodetype)
        reqParams['isviewonly'] = str(isviewonly)
        reqParams['isaffirmance'] = str(isaffirmance)
        reqParams['isshared'] = str(isshared)
        reqParams['iswfshare'] = str(iswfshare)
        reqParams['ismode'] = str(ismode)
        reqParams['modeid'] = str(modeid)
        reqParams['creater'] = str(creater)
        reqParams['needconfirm'] = str(needconfirm)
        reqParams['creatertype'] = str(creatertype)
        reqParams['requestType'] = str(requestType)
        reqParams['isSelfAuth'] = str(isSelfAuth)
        reqParams['isprint'] = str(isprint)
        reqParams['wfmonitor'] = str(wfmonitor)
        reqParams['isurger'] = str(isurger)
        reqParams['intervenorright'] = str(intervenorright)
        reqParams['selectNextFlow'] = str(selectNextFlow)
        reqParams['agentType'] = str(agentType)
        reqParams['agentorByAgentId'] = str(agentorByAgentId)
        reqParams['layouttype'] = str(layouttype)
        reqParams['apiResultCacheKey'] = str(apiResultCacheKey)

        headers = {'pragma': 'no-cache', 'host': 'oa.en-plus.com.cn:8090',
                   'Referer': 'http://oa.en-plus.com.cn:8090/spa/workflow/static4form/index.html?_rdm=' + timestamp}
        data = {'preloadkey': timestamp, 'requestid': requestid, 'timestamp': timestamp,
                'detailmark': 'detail_1,detail_2', 'reqParams': str(reqParams), 'wfTestStr': '',
                'f_weaver_belongto_userid': '1240', 'f_weaver_belongto_usertype': '0'}

        response = OA_session.post(url, headers=headers, data=data)
        if response.status_code == 200:
            wupin_text = response.text
            wupin_str = json.loads(wupin_text)
            detail_1 = wupin_str['detail_1']
            rowDatas = detail_1['rowDatas']
            wuping_name = ''  # 初始化物品值为'无'
            wuping_brand = ''  # 品牌
            wuping_specs = ''  # 规格
            wuping_num = ''  # 数量
            wuping_price = ''  # 单价
            wuping_PerUnit = ''  # 单位
            wuping_url = ''  # 链接

            # 遍历所有以 'row_' 开头的键
            for key in rowDatas:
                if key.startswith('row_'):
                    row_data = rowDatas[key]
                    # 检查并处理特定的字段
                    # 每个都需要判断if
                    if 'field8835' in row_data:  # 耗材名称
                        wuping_name = row_data['field8835']['value']
                    if 'field8836' in row_data:  # 耗材品牌
                        wuping_brand = row_data['field8836']['value']
                    if 'field8837' in row_data:  # 耗材规格
                        wuping_specs = row_data['field8837']['value']
                    if 'field8838' in row_data:  # 耗材数量
                        wuping_num = row_data['field8838']['value']
                    if 'field8839' in row_data:  # 耗材单价
                        wuping_price = row_data['field8839']['value']
                    if 'field14776' in row_data:  # 耗材单位
                        wuping_PerUnit = row_data['field14776']['value']
                    if 'field14639' in row_data:  # 耗材链接
                        wuping_url = row_data['field14639']['value']
                    else:
                        pass
                    # 将处理后的值存储到 wupin 字典中,使用 '物品X' 作为键
                    # 这里使用 key.split('_')[1] 来获取 row_X 中的 X,并转换为整数后加1作为物品序号
                    # item_index = int(key.split('_')[1])+1   # 因为是从1开始计数,所以加1
                    # 方便后面遍历这里名称不做区分
                    wupin = {}  # 创建字典
                    wupin[f'物品名称'] = wuping_name  # 物品名称
                    wupin[f'品牌'] = wuping_brand  # 品牌
                    wupin[f'规格'] = wuping_specs  # 规格
                    wupin[f'数量'] = wuping_num  # 数量
                    wupin[f'单价'] = wuping_price  # 单价
                    wupin[f'单位'] = wuping_PerUnit  # 单位
                    wupin[f'链接'] = wuping_url  # 链接

                    wupin_data.append(wupin)
                else:
                    pass
        else:
            print('获取物品错误2')
        # 返回物品字典
    except Exception as e:
        print('获取物品错误1')
    return wupin_data

获取ECR技术技改 附件下载链接

说明:
用法:传入参数 requestid

#OA流程 ECR技术技改 内容获取
def get_ECR_file_name_load_link(requestid):
    global OA_session
    timestamp1 = int(datetime.now().timestamp() * 1000)
    timestamp = str(timestamp1)
    data_url = 'http://oa.en-plus.com.cn:8090/api/workflow/reqform/loadForm'  # 请求流程
    date_name_link ={}
    data_headers = {
        'accept': '*/*',
        'accept-encoding': 'gzip, deflate',
        'accept-language': 'zh-CN,zh;q=0.9',
        'connection': 'keep-alive',
        'content-length': '65',
        'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
        'host': 'oa.en-plus.com.cn:8090',
        'origin': 'http://oa.en-plus.com.cn:8090',
        'referer': 'http://oa.en-plus.com.cn:8090/spa/workflow/static4form/index.html?_rdm='+timestamp,
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
        'x-requested-with': 'XMLHttpRequest'}
    data_data = {
        'requestid': requestid,
        'preloadkey': timestamp,
        'timestamp': timestamp}
    data_response = OA_session.post(data_url, headers=data_headers, data=data_data)
    if data_response.status_code == 200:

        data_json_str = data_response.text
        shuju_data = json.loads(data_json_str)
        data_dict = shuju_data['maindata']
        date_name_link = data_dict['field7320']['specialobj']['filedatas']
        # for item in date_name_link:
        #     filename = item['filename']
        #     loadlink = item['loadlink']
        #     print(f"名称{filename},链接{loadlink}")
    else:
        print('请求错误')
    return date_name_link