From 4d7994a2eb45f87bbebe5e72ab3340ac29550859 Mon Sep 17 00:00:00 2001 From: bwadmin <7469504@qq.com> Date: Sat, 27 Sep 2025 20:20:37 +0800 Subject: [PATCH] corp0927 --- api.py | 2 +- car_info.db | Bin 40960 -> 40960 bytes ewcc2.py | 179 +++++++++++++++++++++++++++------------------ query_processor.py | 4 + 4 files changed, 113 insertions(+), 72 deletions(-) diff --git a/api.py b/api.py index 41bbcf7..676f4b4 100644 --- a/api.py +++ b/api.py @@ -166,7 +166,7 @@ def update_query_result(): if query_info: for car_info in cars_info: # 提取必要的字段 - plate_number = car_info.get('plate_number', query_info[0]) + plate_number = car_info.get('plate_number', '') phone = car_info.get('mobilephone','') id_card = car_info.get('certno', '') name = car_info.get('name', '') diff --git a/car_info.db b/car_info.db index 68d66fc0b25bcd0257e6e5f5c3b4eef20cdd738c..d9738a7c04d18066576f6ca348c8f61235204fd6 100644 GIT binary patch delta 260 zcmV+f0sH=dzyg540+1U4;*lIf0phV>c0U2zlh;2T0S>eEKMx=SLjv!U2VjK)0`IYb zU;-a7FPU2i05bq12_FeEFfuhQFgYzUH6SrFIx;mnG%=H)V-&L?W8(}U4h+Kp53mnl z4=E1v4!90}4nz(L4bu&r4Pp%|4Dk%Zvk?%V3=1p{2>=ZvF%0IWRLhFgQdvIW#ymK`=!{I5RgnLNPfuLz9M=ER#-|aFg7Y43mwRDi(50 zOLb0iGG|qAIAk+bbYgIJM{RL>lg*fclMR+OljxV3lfIb`4K*M!GdeRgIx{ngb_tW= KlpwSEnFa<%e^T)P delta 192 zcmV;x06+hLzyg540+1U4*^wMW0ok!&c0U2ylh;2T0S&YDKMx=SLIWX_2VjMpIy5+mb_tW=lpwSEnFa=J#X{o% diff --git a/ewcc2.py b/ewcc2.py index 256e0ce..6d9ff32 100644 --- a/ewcc2.py +++ b/ewcc2.py @@ -2,6 +2,7 @@ from tkinter import N from DrissionPage._base.chromium import Chromium from DrissionPage._configs.chromium_options import ChromiumOptions from DrissionPage._pages.mix_tab import MixTab +from applog import logger import time class Sinopec_ewcc(object): @@ -17,9 +18,11 @@ class Sinopec_ewcc(object): self.co.ignore_certificate_errors(True) self.browser=Chromium(self.co) self.tab=self.browser.latest_tab + logger.info(f"浏览器初始化完成,当前URL: {self.tab.url}") def quit(self ): self.browser.quit() + logger.info(f"浏览器已退出") def init_cookies(self, cookies): """设置传入的cookies到浏览器 @@ -28,7 +31,7 @@ class Sinopec_ewcc(object): Returns: bool: 设置成功返回True,失败返回False """ - print('使用传入的cookies登录') + logger.info('使用传入的cookies登录') # 处理字符串类型的cookies if isinstance(cookies, str): @@ -36,21 +39,21 @@ class Sinopec_ewcc(object): import json # 尝试将字符串解析为JSON对象 parsed_cookies = json.loads(cookies) - print('成功将字符串cookies解析为JSON对象') + logger.info(f"成功将字符串cookies解析为JSON对象,共 {len(parsed_cookies)} 条") # 递归调用,使用解析后的数据 return self.init_cookies(parsed_cookies) except json.JSONDecodeError as e: - print(f'字符串cookies解析失败: {str(e)}') + logger.error('字符串cookies解析失败: {str(e)}') return False # 处理字典类型的cookies elif isinstance(cookies, dict): try: self.browser.set.cookies(cookies) - print('成功设置字典类型的cookies') + logger.info('成功设置字典类型的cookies') return True except Exception as e: - print(f'设置字典类型的cookies失败: {str(e)}') + logger.info(f'设置字典类型的cookies失败: {str(e)}') return False # 处理列表类型的cookies @@ -58,15 +61,15 @@ class Sinopec_ewcc(object): try: for cookie in cookies: self.browser.set.cookies(cookie) - print('成功设置列表类型的cookies') + logger.info('成功设置列表类型的cookies') return True except Exception as e: - print(f'设置列表类型的cookies失败: {str(e)}') + logger.info(f'设置列表类型的cookies失败: {str(e)}') return False # 处理未知类型 else: - print(f'传入的cookies格式不正确,类型为: {type(cookies)},应为列表、字典或JSON字符串') + logger.info(f'传入的cookies格式不正确,类型为: {type(cookies)},应为列表、字典或JSON字符串') return False def save_cookies(self): @@ -99,16 +102,16 @@ class Sinopec_ewcc(object): try: find_tab = self.browser.get_tab(url=url) - print("根据 url 找到标签") + logger.info(f"根据 {url} 找到标签") except: - print("根据 url 没有找到标签") + logger.error(f"根据 {url} 没有找到标签") if not find_tab: try: find_tab=self.browser.get_tab(title=title) - print("根据 标题名 找到 标签") + logger.info(f"根据 标题名{title} 找到 标签") except : - print("根据 标题名 没有找到标签") + logger.exception("根据 标题名: {title} 没有找到标签") find_tab=None return find_tab @@ -118,22 +121,20 @@ class Sinopec_ewcc(object): return False time.sleep(2) cur_login=False - ### 判断是否有仍然发生的界面 + ### 判断是否有仍然发送的界面 try: ele_process = self.tab.ele('#proceed-button') ele_process.click() time.sleep(3) except Exception as e: - print(e) - + logger.error(f"处理提示出错:仍然发送 : {e}") try: e=None e=self.tab.ele("#userName") - print("找到登录成功的标志"+e.text) + logger.info(f"找到登录成功的标志: {e.text}") cur_login=True except Exception as e: - print('没有找到登录成功的标志') - print(f'{e}') + logger.info(f'没有找到登录成功的标志,错误代码:{e}') cur_login = False return cur_login @@ -153,7 +154,7 @@ class Sinopec_ewcc(object): time.sleep(1) ele_div.ele('@type=submit').click() except Exception as e: - print(e) + logger.info(f'登录表单填写异常: {e}') time.sleep(3) ### 判断是否有仍然发生的界面 @@ -162,20 +163,20 @@ class Sinopec_ewcc(object): ele_process.click() except Exception as e: - print(e) + logger.info(f'证书继续按钮处理异常: {e}') time.sleep(3) return True def Autologin(self,username=None,userpass=None,otp=None,cookies=None): # 1 查找现有的标签 - print('<1> 查找 现有的标签') + logger.info('<1> 查找 现有的标签') if self.find_tab(): # 新增:查找标签页 - print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + logger.info("找到现有标签页") # 2 如果没有登录 ,则使用cookie登录 if not self.is_login(): - print('<2> 找不到对应的网站,使用cookies尝试登录') + logger.info('<2> 找不到对应的网站,使用cookies尝试登录') self.init_cookies(cookies) self.tab.get(self.url) self.tab.refresh() @@ -183,14 +184,14 @@ class Sinopec_ewcc(object): ### 判断是否有仍然发生的界面 try: ele_process = self.tab.ele('#proceed-button') - print("**********************************") + logger.info("证书继续按钮存在并已点击") ele_process.click() except Exception as e: - print(e) + logger.info(f'证书继续按钮处理异常: {e}') # 3 判断是否登录,如果登录不成功,则使用帐号和密码登录 if not self.is_login(): - print('<3> 找不对应的网站,使用帐号密码登录') + logger.info('<3> 找不对应的网站,使用帐号密码登录') # 这里要注意12小时才可以登录一次。 # 这里显示登录界面,并等待输入一分钟 self.login(username=username,userpass=userpass,otp=otp) @@ -199,7 +200,7 @@ class Sinopec_ewcc(object): if self.is_login(): self.tab.refresh() self.save_cookies() - print(" 保存cookies") + logger.info(" 保存cookies") return True else: self.send_message() @@ -208,50 +209,86 @@ class Sinopec_ewcc(object): def send_message(self): pass - def query_car_info(self,plate_number=None,phone_number=None,additional_info=None): - print(plate_number) - print("ssssssssssssssssssssssssss") - self.tab.ele("@@tag()=li@@title=订单中心").click() - time.sleep(2) - self.tab.ele("@@tag()=a@@name=客户信息查询").click() - time.sleep(2) - myframe = self.tab.get_frame("iframeSOC_CSR_DETAIL") - ### print(myframe.inner_html) - time.sleep(2) - - ### print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") - ele = myframe.ele("#searchType") - ### print(ele.inner_html) - - myframe.ele("@@tag()=select@@id=searchType").select.by_text("车牌号") - myframe.ele('#searchValue').input(plate_number, clear=True) - - myframe.listen.start('acc/getAccCsrInfo') - myframe.ele("@text()=查询").click() - DataPacket = myframe.listen.wait() - ### print(DataPacket.response.body) - - ###print("ccccccccccccccccccccccccccccccccccccccc") - rtn={} - if DataPacket.response.body['success']: - total_num = DataPacket.response.body['data']['total'] - # rtn['length']=total_num - # rtn['test']='aaa' - rtn=[] - eles = myframe.eles("@@name=客户信息详情界面@@text()=详情") - for ele in eles: - sele = self.tab.ele("@@text()^客户信息查询@@class:J_menuTab") - if sele: - sele.click() - self.tab.listen.start('getAccCsrInfoByCsrid') - ele.click() - DataPacket = self.tab.listen.wait() - ### print(DataPacket.response.body) - rtn.append(DataPacket.response.body['data']) - self.tab.listen.stop() - ### print(ele.inner_html) - - return rtn + def query_car_info(self, plate_number=None, phone_number=None, additional_info={}): + """查询车辆信息 + Args: + plate_number: 车牌号 + phone_number: 手机号 + additional_info: 附加查询信息 + Returns: + list: 查询到的车辆信息列表 + """ + # 参数校验 + if not plate_number and not phone_number: + logger.warning("车牌号和手机号至少需要提供一个") + return [] + + logger.info(f"查询车牌号: {plate_number} 电话:{phone_number}") + + try: + # 切换到订单中心 + self.tab.ele("@@tag()=li@@title=订单中心").click() + time.sleep(2) # 可以考虑替换为条件等待 + + # 点击客户信息查询 + self.tab.ele("@@tag()=a@@name=客户信息查询").click() + time.sleep(2) # 可以考虑替换为条件等待 + + # 获取iframe + myframe = self.tab.get_frame("iframeSOC_CSR_DETAIL") + time.sleep(2) # 可以考虑替换为条件等待 + + # 根据输入参数选择查询类型 + search_type_ele = myframe.ele("@@tag()=select@@id=searchType") + search_value_ele = myframe.ele('#searchValue') + + if plate_number: + search_type_ele.select.by_text("车牌号") + search_value_ele.input(plate_number, clear=True) + elif phone_number: + search_type_ele.select.by_text("手机号") + search_value_ele.input(phone_number, clear=True) + + # 执行查询 + myframe.listen.start('acc/getAccCsrInfo') + myframe.ele("@text()=查询").click() + + try: + DataPacket = myframe.listen.wait(timeout=10) # 添加超时参数 + except Exception as e: + logger.error(f"等待查询响应超时: {str(e)}") + return [] + finally: + myframe.listen.stop() + + result_list = [] + if DataPacket and hasattr(DataPacket, 'response') and hasattr(DataPacket.response, 'body'): + if DataPacket.response.body.get('success'): + total_num = DataPacket.response.body['data'].get('total', 0) + logger.info(f"查询到 {total_num} 条记录") + + # 获取详情 + detail_eles = myframe.eles("@@name=客户信息详情界面@@text()=详情") + for ele in detail_eles: + # 执行详情点击操作并获取数据 + self.tab.listen.start('getAccCsrInfoByCsrid') + ele.click() + + try: + detail_packet = self.tab.listen.wait(timeout=10) + if detail_packet and hasattr(detail_packet, 'response') and hasattr(detail_packet.response, 'body'): + if detail_packet.response.body.get('success'): + result_list.append(detail_packet.response.body['data']) + except Exception as e: + logger.error(f"获取详情失败: {str(e)}") + finally: + self.tab.listen.stop() + + return result_list + + except Exception as e: + logger.error(f"查询车辆信息时发生异常: {str(e)}") + return [] diff --git a/query_processor.py b/query_processor.py index ec1cfe3..774c459 100644 --- a/query_processor.py +++ b/query_processor.py @@ -98,6 +98,10 @@ def update_query_result(query_id, results_count, cars_info=None): # 如果提供了车辆信息,添加到请求数据中 if cars_info: data['cars_info'] = cars_info + # 显示cars_info信息 + logger.info(f"车辆信息: {cars_info}") + else: + logger.info("未提供车辆信息") response = requests.post(url, json=data) response.raise_for_status()