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 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浏览器进程...") os.system('taskkill /f /t /im chrome.exe') time.sleep(2) print("正在启动chromium浏览器...") # 配置浏览器选项 co = ChromiumOptions() 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) 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: print(f"邮编检测到标识: {mark},无需修改") return True # 检查是否已经包含目标邮编 if zip_code in current_text: print(f"邮编已经设置为: {zip_code},无需修改") return True # 需要设置邮编 print(f"正在设置邮编为: {zip_code}") # 点击地址选择按钮 location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) if not location_link: print("找不到地址设置按钮") 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)}")