207 lines
6.7 KiB
Python
207 lines
6.7 KiB
Python
import json
|
|
import sys
|
|
import os
|
|
import io
|
|
|
|
import time
|
|
import traceback
|
|
from datetime import datetime
|
|
from DrissionPage import Chromium, ChromiumOptions
|
|
from collections import defaultdict
|
|
|
|
from config import base_dir,debug
|
|
from amazon.tool import get_shop_info,show_notification
|
|
|
|
|
|
|
|
class ChromeAmzoneBase:
|
|
mark_name = "谷歌浏览器基类"
|
|
|
|
country_info = {
|
|
"英国": {
|
|
"url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV",
|
|
"zip_code": "SW1A 1AA",
|
|
"mark": "SW1A 1"
|
|
},
|
|
"德国": {
|
|
"url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1",
|
|
"zip_code": "10115"
|
|
},
|
|
"法国": {
|
|
"url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1",
|
|
"zip_code": "75001"
|
|
},
|
|
"西班牙": {
|
|
"url": "https://www.amazon.es/dp/B08ZXVNYNN",
|
|
"zip_code": "28001"
|
|
},
|
|
"意大利": {
|
|
"url": "https://www.amazon.it/dp/B0D1P17T2Q",
|
|
"zip_code": "20121"
|
|
}
|
|
}
|
|
|
|
def __init__(self):
|
|
"""
|
|
杀死当前谷歌浏览器进程,并使用 drissionpage 启动谷歌浏览器,使用系统安装的浏览器默认用户文件夹
|
|
"""
|
|
print("正在关闭现有的chromium浏览器进程...")
|
|
if not debug:
|
|
os.system('taskkill /f /t /im chrome.exe')
|
|
time.sleep(2)
|
|
|
|
print("正在启动chromium浏览器...")
|
|
# 配置浏览器选项
|
|
co = ChromiumOptions()
|
|
co.no_imgs(True)
|
|
user_data_path = os.path.join(base_dir, "user_data", "chrome_data")
|
|
if not os.path.exists(user_data_path):
|
|
os.makedirs(user_data_path, exist_ok=True)
|
|
co.set_user_data_path(user_data_path)
|
|
co.set_local_port(port=19897)
|
|
self.browser = Chromium(co)
|
|
self.tab = self.browser.latest_tab
|
|
print("Chrome浏览器启动成功")
|
|
|
|
def log(self, message: str, level: str = "INFO"):
|
|
"""日志输出
|
|
Args:
|
|
message: 日志消息
|
|
level: 日志级别
|
|
"""
|
|
try:
|
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
# if level == "ERROR":
|
|
# show_notification(message, "error")
|
|
print(f"[{timestamp}] [{self.mark_name}] [{level}] {message}")
|
|
except Exception as e:
|
|
print(f"输出出错,{e}")
|
|
|
|
def close_init_popup(self):
|
|
"""
|
|
关闭所有的初始化弹窗
|
|
"""
|
|
self.tab.wait.doc_loaded(timeout=60, raise_err=True)
|
|
continue_shipping = self.tab.eles('xpath://button[@alt="Continue shopping"]',timeout=3)
|
|
if len(continue_shipping) > 0:
|
|
continue_shipping[0].click()
|
|
time.sleep(0.5)
|
|
self.tab.wait.doc_loaded(timeout=60, raise_err=True)
|
|
footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]', timeout=5)
|
|
if len(footbar) > 0:
|
|
do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]')
|
|
if len(do_not_remind) > 0:
|
|
do_not_remind[0].check()
|
|
resume_immediately = footbar[0].eles('xpath:.//button')
|
|
if len(resume_immediately) > 0:
|
|
resume_immediately[0].click()
|
|
|
|
self.tab.wait.doc_loaded(timeout=60, raise_err=True)
|
|
accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]', timeout=5)
|
|
if len(accept_btn) > 0:
|
|
accept_btn[0].click()
|
|
|
|
def _set_zip_code(self, zip_code, mark=None):
|
|
"""
|
|
设置邮编
|
|
|
|
Args:
|
|
zip_code: 目标邮编
|
|
"""
|
|
try:
|
|
# 检查当前邮编
|
|
zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10)
|
|
|
|
if zip_display:
|
|
current_text = zip_display.text
|
|
# print(f"当前地址信息: {current_text}")
|
|
# 先检查标识
|
|
if mark is not None and mark in current_text:
|
|
self.log(f"邮编检测到标识: {mark},无需修改")
|
|
return True
|
|
# 检查是否已经包含目标邮编
|
|
if zip_code in current_text:
|
|
self.log(f"邮编已经设置为: {zip_code},无需修改")
|
|
return True
|
|
|
|
# 需要设置邮编
|
|
self.log(f"正在设置邮编为: {zip_code}")
|
|
|
|
# 点击地址选择按钮
|
|
location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10)
|
|
if not location_link:
|
|
self.log("找不到地址设置按钮")
|
|
return False
|
|
|
|
location_link.click()
|
|
time.sleep(1)
|
|
|
|
# 等待邮编输入框出现
|
|
zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10)
|
|
if not zip_input:
|
|
print("找不到邮编输入框")
|
|
return False
|
|
|
|
# 输入邮编
|
|
zip_input.input(zip_code, clear=True)
|
|
time.sleep(0.5)
|
|
|
|
# 点击提交按钮
|
|
submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10)
|
|
if not submit_btn:
|
|
print("找不到提交按钮")
|
|
return False
|
|
|
|
submit_btn.click()
|
|
|
|
continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]',
|
|
timeout=10)
|
|
if len(continue_btn) > 0:
|
|
continue_btn[0].click()
|
|
|
|
# 等待提交按钮消失(表示请求已发送)
|
|
print("等待邮编更新...")
|
|
time.sleep(2)
|
|
|
|
# 等待页面加载完成
|
|
self.tab.wait.doc_loaded(timeout=30, raise_err=False)
|
|
time.sleep(2)
|
|
|
|
# 验证邮编是否设置成功
|
|
zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10)
|
|
if zip_display_after:
|
|
updated_text = zip_display_after.text
|
|
# print(f"更新后的地址信息: {updated_text}")
|
|
|
|
if zip_code in updated_text:
|
|
print(f"邮编设置成功: {zip_code}")
|
|
return True
|
|
else:
|
|
# print(f"邮编设置可能失败,当前显示: {updated_text}")
|
|
return False
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"设置邮编时出错: {traceback.format_exc()}")
|
|
return False
|
|
|
|
def close(self):
|
|
"""关闭浏览器"""
|
|
try:
|
|
if self.browser:
|
|
self.browser.quit()
|
|
print("浏览器已关闭")
|
|
except Exception as e:
|
|
print(f"关闭浏览器时出错: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|