This commit is contained in:
2025-10-17 17:11:09 +08:00
parent 3830f3a9df
commit 24092fe092
5 changed files with 1931 additions and 30 deletions
+32 -21
View File
@@ -4,6 +4,7 @@ from DrissionPage._configs.chromium_options import ChromiumOptions
from DrissionPage._pages.mix_tab import MixTab from DrissionPage._pages.mix_tab import MixTab
from applog import logger from applog import logger
import time import time
import datetime
class Sinopec_ewcc(object): class Sinopec_ewcc(object):
tab:MixTab tab:MixTab
@@ -14,11 +15,12 @@ class Sinopec_ewcc(object):
self.url_info= 'ewcc.sinopec' self.url_info= 'ewcc.sinopec'
self.browser_path= r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' self.browser_path= r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
self.co = ChromiumOptions().set_browser_path(self.browser_path) self.co = ChromiumOptions().set_browser_path(self.browser_path)
#self.co.headless(True) self.co.headless(True)
self.co.ignore_certificate_errors(True) self.co.ignore_certificate_errors(True)
self.browser=Chromium(self.co) self.browser=Chromium(self.co)
self.tab=self.browser.latest_tab self.tab=self.browser.latest_tab
#判断对应的任务是否完成 #判断对应的任务是否完成
self.export_date=datetime.date.today()
self.is_query_member=False self.is_query_member=False
self.is_query_oil_fw_tj=False self.is_query_oil_fw_tj=False
self.is_query_oil_current_month_lj=False self.is_query_oil_current_month_lj=False
@@ -209,6 +211,15 @@ class Sinopec_ewcc(object):
def send_message(self): def send_message(self):
pass pass
def today_is_export_date(self):
cur_date=datetime.date.today()
if self.export_date!=cur_date:
self.export_date=cur_date
self.is_query_client_emp_tj=False
self.is_query_oil_fw_tj=False
self.is_query_member=False
self.is_query_oil_current_month_lj=False
def query_car_info(self, plate_number=None, phone_number=None, result_list=None): def query_car_info(self, plate_number=None, phone_number=None, result_list=None):
"""查询车辆信息 """查询车辆信息
@@ -322,15 +333,15 @@ class Sinopec_ewcc(object):
#取得开始日期,并获得焦点 #取得开始日期,并获得焦点
ele=search_type_ele[1] ele=search_type_ele[1]
logger.info(f"元素信息:{ele}") # logger.info(f"元素信息:{ele}")
ele.focus() ele.focus()
#查找 弹出的日期窗体 #查找 弹出的日期窗体
data_ele=myframe.ele("@@tag()=div@@class=el-picker-panel__body-wrapper") data_ele=myframe.ele("@@tag()=div@@class=el-picker-panel__body-wrapper")
ele_date_head=data_ele.ele("@@tag()=div@@class=el-picker-panel__header") ele_date_head=data_ele.ele("@@tag()=div@@class=el-picker-panel__header")
ele_date_content=data_ele.ele("@@tag()=div@@class=el-picker-panel__content") ele_date_content=data_ele.ele("@@tag()=div@@class=el-picker-panel__content")
logger.info(f"日期元素信息:{ele_date_head}") # logger.info(f"日期元素信息:{ele_date_head}")
logger.info(f"日期元素信息:{ele_date_content}") # logger.info(f"日期元素信息:{ele_date_content}")
ele_date_day=ele_date_content.eles("@@tag()=td") ele_date_day=ele_date_content.eles("@@tag()=td")
for a in ele_date_day: for a in ele_date_day:
@@ -340,7 +351,7 @@ class Sinopec_ewcc(object):
ele=myframe.eles("@@tag()=div@@class=el-form-item__content") ele=myframe.eles("@@tag()=div@@class=el-form-item__content")
ele[1].click(by_js=True) ele[1].click(by_js=True)
logger.info(f"myframe元素信息 :{ele[1]}") # logger.info(f"myframe元素信息 :{ele[1]}")
#logger.info(f"日期选择器元素信息:{ele[0]}") #logger.info(f"日期选择器元素信息:{ele[0]}")
time.sleep(5) # 可以考虑替换为条件等待 time.sleep(5) # 可以考虑替换为条件等待
@@ -353,10 +364,10 @@ class Sinopec_ewcc(object):
if export_packet.response.body.get('success'): if export_packet.response.body.get('success'):
logger.info("成功导出 员工拉新权益会员明细 ") logger.info("成功导出 员工拉新权益会员明细 ")
#logger.info(export_packet.request.postData) #logger.info(export_packet.request.postData)
self.tab.listen.stop()
self.tab.listen.stop() logger.info("导出客户评价与员工关联统计查询完成")
return True return True
logger.info("客户评价与员工关联统计查询完成")
except Exception as e: except Exception as e:
logger.exception(f"员工拉新权益会员明细查询异常: {str(e)}") logger.exception(f"员工拉新权益会员明细查询异常: {str(e)}")
return False return False
@@ -382,8 +393,8 @@ class Sinopec_ewcc(object):
# 根据输入参数选择查询类型 # 根据输入参数选择查询类型
search_type_ele = myframe.eles("@@tag()=input@@type=text") search_type_ele = myframe.eles("@@tag()=input@@type=text")
for a in search_type_ele: # for a in search_type_ele:
logger.info(f"元素信息:{a.html}") # logger.info(f"元素信息:{a.html}")
#a.focus() #a.focus()
#time.sleep(2) # 可以考虑替换为条件等待 #time.sleep(2) # 可以考虑替换为条件等待
@@ -400,15 +411,15 @@ class Sinopec_ewcc(object):
#取得开始日期,并获得焦点 #取得开始日期,并获得焦点
ele=search_type_ele[3] ele=search_type_ele[3]
logger.info(f"元素信息:{ele}") # logger.info(f"元素信息:{ele}")
ele.focus() ele.focus()
#查找 弹出的日期窗体 #查找 弹出的日期窗体
data_ele=myframe.ele("@@tag()=div@@class=el-picker-panel__body-wrapper") data_ele=myframe.ele("@@tag()=div@@class=el-picker-panel__body-wrapper")
ele_date_head=data_ele.ele("@@tag()=div@@class=el-picker-panel__header") ele_date_head=data_ele.ele("@@tag()=div@@class=el-picker-panel__header")
ele_date_content=data_ele.ele("@@tag()=div@@class=el-picker-panel__content") ele_date_content=data_ele.ele("@@tag()=div@@class=el-picker-panel__content")
logger.info(f"日期元素信息:{ele_date_head}") # logger.info(f"日期元素信息:{ele_date_head}")
logger.info(f"日期元素信息:{ele_date_content}") # logger.info(f"日期元素信息:{ele_date_content}")
ele_date_day=ele_date_content.eles("@@tag()=td") ele_date_day=ele_date_content.eles("@@tag()=td")
for a in ele_date_day: for a in ele_date_day:
@@ -418,7 +429,7 @@ class Sinopec_ewcc(object):
ele=myframe.eles("@@tag()=div@@class=el-form-item__content") ele=myframe.eles("@@tag()=div@@class=el-form-item__content")
ele[1].click(by_js=True) ele[1].click(by_js=True)
logger.info(f"myframe元素信息 :{ele[1]}") # logger.info(f"myframe元素信息 :{ele[1]}")
#logger.info(f"日期选择器元素信息:{ele[0]}") #logger.info(f"日期选择器元素信息:{ele[0]}")
time.sleep(5) # 可以考虑替换为条件等待 time.sleep(5) # 可以考虑替换为条件等待
@@ -464,8 +475,8 @@ class Sinopec_ewcc(object):
# 根据输入参数选择查询类型 # 根据输入参数选择查询类型
search_type_ele = myframe.eles("@@tag()=input@@type=text") search_type_ele = myframe.eles("@@tag()=input@@type=text")
for a in search_type_ele: # for a in search_type_ele:
logger.info(f"元素信息:{a}") # logger.info(f"元素信息:{a}")
# #取得开始日期,并获得焦点 # #取得开始日期,并获得焦点
# ele=search_type_ele[1] # ele=search_type_ele[1]
@@ -530,8 +541,8 @@ class Sinopec_ewcc(object):
# 根据输入参数选择查询类型 # 根据输入参数选择查询类型
search_type_ele = myframe.eles("@@tag()=input@@type=text") search_type_ele = myframe.eles("@@tag()=input@@type=text")
for a in search_type_ele: # for a in search_type_ele:
logger.info(f"元素信息:{a}") # logger.info(f"元素信息:{a}")
#按油站汇总 #按油站汇总
ele=search_type_ele[1] ele=search_type_ele[1]
@@ -546,15 +557,15 @@ class Sinopec_ewcc(object):
#取得开始日期,并获得焦点 #取得开始日期,并获得焦点
ele=search_type_ele[2] ele=search_type_ele[2]
logger.info(f"元素信息:{ele}") # logger.info(f"元素信息:{ele}")
ele.focus() ele.focus()
#查找 弹出的日期窗体 #查找 弹出的日期窗体
data_ele=myframe.ele("@@tag()=div@@class=el-picker-panel__body-wrapper") data_ele=myframe.ele("@@tag()=div@@class=el-picker-panel__body-wrapper")
ele_date_head=data_ele.ele("@@tag()=div@@class=el-picker-panel__header") ele_date_head=data_ele.ele("@@tag()=div@@class=el-picker-panel__header")
ele_date_content=data_ele.ele("@@tag()=div@@class=el-picker-panel__content") ele_date_content=data_ele.ele("@@tag()=div@@class=el-picker-panel__content")
logger.info(f"日期元素信息:{ele_date_head}") # logger.info(f"日期元素信息:{ele_date_head}")
logger.info(f"日期元素信息:{ele_date_content}") # logger.info(f"日期元素信息:{ele_date_content}")
ele_date_day=ele_date_content.eles("@@tag()=td") ele_date_day=ele_date_content.eles("@@tag()=td")
for a in ele_date_day: for a in ele_date_day:
+182
View File
@@ -0,0 +1,182 @@
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
import json
import os
class Lmk_BI(object):
tab: MixTab
def __init__(self):
self.url = 'https://lmkbi.95155.com/bi-system/#/login'
self.url_info = 'lmkbi.95155.com'
self.browser_path = r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
self.cookies_file = 'lmk_cookies.json' # 保存cookies的文件
self.co = ChromiumOptions().set_browser_path(self.browser_path).set_local_port(9555)
# self.co.headless(False) # 设为False以便查看操作过程
# self.co.ignore_certificate_errors(True)
self.browser = Chromium(self.co)
self.tab = self.browser.latest_tab
self.tab.set.window.max()
self.tab.set.cookies.clear
def quit(self):
self.browser.quit()
logger.info("浏览器已退出")
def load_cookies_from_file(self):
"""从文件加载cookies"""
try:
if os.path.exists(self.cookies_file):
with open(self.cookies_file, 'r', encoding='utf-8') as f:
cookies = json.load(f)
logger.info(f"从文件 {self.cookies_file} 加载cookies成功")
return cookies
else:
logger.warning(f"cookies文件 {self.cookies_file} 不存在")
return None
except Exception as e:
logger.error(f"加载cookies文件失败: {str(e)}")
return None
def save_cookies_to_file(self, cookies):
"""保存cookies到文件"""
try:
with open(self.cookies_file, 'w', encoding='utf-8') as f:
json.dump(cookies, f, ensure_ascii=False, indent=2)
logger.info(f"cookies已保存到文件 {self.cookies_file}")
except Exception as e:
logger.error(f"保存cookies到文件失败: {str(e)}")
def init_cookies(self, cookies):
"""设置传入的cookies到浏览器"""
logger.info('使用传入的cookies登录')
# 处理字符串类型的cookies
if isinstance(cookies, str):
try:
parsed_cookies = json.loads(cookies)
logger.info(f"成功将字符串cookies解析为JSON对象,共 {len(parsed_cookies)}")
return self.init_cookies(parsed_cookies)
except json.JSONDecodeError as e:
logger.error(f'字符串cookies解析失败: {str(e)}')
return False
# 处理字典类型的cookies
elif isinstance(cookies, dict):
try:
self.browser.set.cookies(cookies)
logger.info('成功设置字典类型的cookies')
return True
except Exception as e:
logger.error(f'设置字典类型的cookies失败: {str(e)}')
return False
# 处理列表类型的cookies
elif isinstance(cookies, list):
try:
for cookie in cookies:
self.browser.set.cookies(cookie)
logger.info('成功设置列表类型的cookies')
return True
except Exception as e:
logger.error(f'设置列表类型的cookies失败: {str(e)}')
return False
# 处理未知类型
else:
logger.error(f'传入的cookies格式不正确,类型为: {type(cookies)},应为列表、字典或JSON字符串')
return False
def save_cookies(self):
"""获取并返回当前浏览器tab的cookies"""
try:
self.tab.refresh()
cookies = self.tab.cookies()
self.save_cookies_to_file(cookies)
return cookies
except Exception as e:
logger.error(f"获取cookies失败: {str(e)}")
return None
def is_login(self):
"""判断是否已登录"""
logger.info("判断是否登录")
try:
# 刷新页面以确保获取最新状态
self.tab.refresh()
time.sleep(3)
verify_code_button = self.tab.eles('@@tag()=button@@text()=获取验证码')
if verify_code_button:
logger.info("发现'获取验证码'按钮,视为未登录")
return False
else:
logger.info("未发现'获取验证码'按钮,视为已登录")
return True
except Exception as e:
logger.error(f"判断登录状态时出错: {str(e)}")
return False
def open_web_with_cookies(self):
"""使用保存的cookies打开网站"""
try:
# 加载cookies
cookies = self.load_cookies_from_file()
self.init_cookies(cookies)
# 打开网站
logger.info(f"加载 cookies 成功")
except Exception as e:
logger.error(f"加载 cookies 失败: {str(e)}")
self.tab.get(self.url)
time.sleep(5) # 等待页面加载
return self.is_login()
def first_time_login(self):
"""首次登录,需要手动操作保存cookies"""
try:
logger.info("请手动登录网站...")
self.tab.get(self.url)
# 等待用户手动登录
logger.info("请在浏览器中完成登录操作,然后按Enter键继续...")
input("登录完成后按Enter键继续...")
# 检查是否登录成功
if self.is_login():
# 保存cookies
self.save_cookies()
logger.info("首次登录成功,cookies已保存")
return True
else:
logger.warning("登录失败,请重试")
return False
except Exception as e:
logger.error(f"首次登录时出错: {str(e)}")
return False
def run(self):
"""运行主程序"""
try:
# 尝试使用cookies登录
if not self.open_web_with_cookies():
# 如果cookies登录失败,提示用户手动登录
logger.info("cookies登录失败,准备手动登录")
self.first_time_login()
# 保持浏览器打开一段时间
logger.info("操作完成,浏览器将保持打开状态")
time.sleep(30)
except Exception as e:
logger.error(f"运行时出错: {str(e)}")
finally:
# 关闭浏览器
self.save_cookies()
self.quit()
if __name__ == "__main__":
# 创建实例并运行
lmk_bi = Lmk_BI()
lmk_bi.run()
+22
View File
@@ -0,0 +1,22 @@
[
{
"name": "LMKBIUSS",
"value": "eyJhY2NvdW50SWQiOjIzMzk0OTQ3NTAwMjA0OSwicGhvbmUiOiIxMzU0ODU2OTY2NiIsInRpbWVzdGFtcCI6MTc2MDY4Mzg5MzIwOCwidG9rZW4iOiJlMmJhMTE1Yi05YmZiLTQ5MDYtYTA0OS1iMzlmMjkwYTFmODUifQ==",
"domain": "lmkbi.95155.com"
},
{
"name": "edentoken",
"value": "13548569666",
"domain": "lmkbi.95155.com"
},
{
"name": "user",
"value": "13548569666",
"domain": "lmkbi.95155.com"
},
{
"name": "userType",
"value": "2",
"domain": "lmkbi.95155.com"
}
]
File diff suppressed because it is too large Load Diff
+7 -9
View File
@@ -190,31 +190,29 @@ def main():
# 保留浏览器cookies # 保留浏览器cookies
save_param4( ewcc.tab.cookies()) save_param4( ewcc.tab.cookies())
# 检查最后导出日期是否今天,如果不是,则今天导出
ewcc.today_is_export_date()
# 查询员工拉新权益会员明细 # 查询员工拉新权益会员明细
#if not ewcc.is_query_member and datetime.datetime.now().hour >= 3: if not ewcc.is_query_member and datetime.datetime.now().hour >= 3:
#logger.info("开始查询员工拉新权益会员明细") logger.info("开始查询员工拉新权益会员明细")
#ewcc.is_query_member=ewcc.query_memeber() ewcc.is_query_member=ewcc.query_memeber()
# 查询员工拉新权益会员明细 # 查询员工拉新权益会员明细
if not ewcc.is_query_oil_fw_tj and datetime.datetime.now().hour >= 3: if not ewcc.is_query_oil_fw_tj and datetime.datetime.now().hour >= 3:
logger.info("开始查询油站服务号应用统计") logger.info("开始查询油站服务号应用统计")
ewcc.query_oil_fw_tj()
ewcc.is_query_oil_fw_tj=ewcc.query_oil_fw_tj() ewcc.is_query_oil_fw_tj=ewcc.query_oil_fw_tj()
continue
# 查询油站汇总本月累计 # 查询油站汇总本月累计
if not ewcc.is_query_oil_current_month_lj and datetime.datetime.now().hour >= 3: if not ewcc.is_query_oil_current_month_lj and datetime.datetime.now().hour >= 3:
logger.info("开始查询 按油站汇总本月累计") logger.info("开始查询 按油站汇总本月累计")
ewcc.query_oil_current_month_lj()
ewcc.is_query_oil_current_month_lj=ewcc.query_oil_current_month_lj() ewcc.is_query_oil_current_month_lj=ewcc.query_oil_current_month_lj()
continue
# 查询客户评价与员工关联统计 # 查询客户评价与员工关联统计
if not ewcc.is_query_client_emp_tj and datetime.datetime.now().hour >= 3: if not ewcc.is_query_client_emp_tj and datetime.datetime.now().hour >= 3:
logger.info("开始查询客户评价与员工关联统计") logger.info("开始查询客户评价与员工关联统计")
ewcc.query_client_emp_tj()
ewcc.is_query_client_emp_tj=ewcc.query_client_emp_tj() ewcc.is_query_client_emp_tj=ewcc.query_client_emp_tj()
continue
# 获取待处理查询 # 获取待处理查询
pending_queries = get_pending_queries() pending_queries = get_pending_queries()