From 3c5ac9432bfc109a8f9456786c675a811fa4af8a Mon Sep 17 00:00:00 2001 From: fuzhongyun <15339891972@163.com> Date: Fri, 20 Mar 2026 13:40:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=89=93=E5=8C=85?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_portable.ps1 | 1 + chaojiying.py | 2 -- scbank_collector.py | 69 +++++++++++++++++++------------------- 使用说明.txt | 80 +++++++++++++++++++++------------------------ 4 files changed, 72 insertions(+), 80 deletions(-) diff --git a/build_portable.ps1 b/build_portable.ps1 index 51fd6ef..78b3081 100644 --- a/build_portable.ps1 +++ b/build_portable.ps1 @@ -65,6 +65,7 @@ Write-Host "[Step 5/6] Building executable..." -ForegroundColor Cyan # 手动复制配置文件到发布目录 (比 --add-data 更直观,因为用户需要编辑) Write-Host "Copying configuration files..." -ForegroundColor Gray Copy-Item "product_map.txt" -Destination "dist\scbank_tool\" -Force +Copy-Item "config.txt" -Destination "dist\scbank_tool\" -Force Copy-Item "使用说明.txt" -Destination "dist\scbank_tool\" -Force if ($LASTEXITCODE -eq 0) { diff --git a/chaojiying.py b/chaojiying.py index 2dc139c..c07fc74 100644 --- a/chaojiying.py +++ b/chaojiying.py @@ -6,8 +6,6 @@ class ChaojiyingClient: def __init__(self, username, password, soft_id): self.username = username - # 超级鹰要求密码经过 md5 加密 - # self.password = md5(password.encode('utf-8')).hexdigest() self.password = password self.soft_id = soft_id self.base_params = { diff --git a/scbank_collector.py b/scbank_collector.py index e7e33f9..f84dadc 100644 --- a/scbank_collector.py +++ b/scbank_collector.py @@ -43,23 +43,7 @@ class SCBankCollector: } if not os.path.exists(config_file): - print(f"[WARN] 未找到配置文件 {config_file},将创建一个默认模板,请填写后重新运行。") - template = ( - "# ==========================================\n" - "# 四川银行权益商城自动化工具 - 配置文件\n" - "# 请在等号 (=) 后面填写您的账号和密码\n" - "# 注意:等号前后可以有空格,但不要删除等号\n" - "# ==========================================\n\n" - "商城账号 = \n" - "商城密码 = \n\n" - "# --- 以下为验证码自动识别配置 (选填) ---\n" - "# 如果不填写,程序运行时将暂停并等待您手动输入验证码\n" - "超级鹰账号 = \n" - "超级鹰密码 = \n" - "超级鹰软件ID = 96001\n" - ) - with open(config_file, "w", encoding="utf-8") as f: - f.write(template) + print(f"[ERROR] 未找到配置文件 {config_file},请确保该文件与程序在同一目录下。") sys.exit(1) try: @@ -134,7 +118,7 @@ class SCBankCollector: """自动识别并填写验证码""" if not self.cjy_client: self.log("[WARN] 未配置超级鹰账号,跳过自动识别验证码。请手动输入验证码。") - return False + return False, None try: self.log("尝试获取验证码图片...") @@ -154,6 +138,7 @@ class SCBankCollector: if result and result.get('err_no') == 0: code = result.get('pic_str') + pic_id = result.get('pic_id') self.log(f"✅ 验证码识别成功: {code}") # 填入验证码 @@ -162,16 +147,16 @@ class SCBankCollector: # 点击登录 self.log("尝试自动点击登录...") self.page.locator('button.login-btn').click() - return True + return True, pic_id else: print(result) err_str = result.get('err_str', '未知错误') if result else '返回为空' self.log(f"❌ 验证码识别失败: {err_str}") - return False + return False, None except Exception as e: self.log(f"自动处理验证码发生异常: {e}") - return False + return False, None def run(self): try: @@ -207,15 +192,10 @@ class SCBankCollector: while retry_count < max_retries and not login_success: if self.cjy_client: self.log(f"--- 第 {retry_count + 1} 次尝试登录 ---") - success = self._auto_solve_captcha() + success, pic_id = self._auto_solve_captcha() if not success: - self.log("验证码识别失败,等待后重试...") - time.sleep(2) - # 点击验证码图片刷新 - try: - self.page.locator('img.code-image').click() - time.sleep(1) - except: pass + self.log("验证码识别请求失败,等待后重试...") + time.sleep(1) retry_count += 1 continue else: @@ -224,30 +204,47 @@ class SCBankCollector: # 等待 URL 包含 homePage (用户指定) 或者 错误提示出现 try: # 使用 wait_for_url 或者检查是否有错误弹窗 - # 这里等待较短时间,如果失败则重试 - self.page.wait_for_url("**/homePage**", timeout=10000 if self.cjy_client else 0) + # 如果使用了超级鹰,缩短等待时间,因为错误提示出得很快 + self.page.wait_for_url("**/homePage**", timeout=3000 if self.cjy_client else 0) self.log("✅ 检测到登录成功!") login_success = True time.sleep(1) except Exception as e: if self.cjy_client: self.log(f"登录等待超时或失败,可能验证码错误。") + + # 验证码识别错误,按要求以 50% 的概率调用报错返分接口 + if pic_id and random.random() < 0.8: + self.log(f"触发报错返分机制 (pic_id: {pic_id})...") + try: + self.cjy_client.report_error(pic_id) + self.log("报错返分请求已发送") + except Exception as re: + self.log(f"报错返分请求异常: {re}") + # 检查是否有错误提示 (比如 el-message) try: error_msg = self.page.locator('.el-message__content').inner_text(timeout=1000) self.log(f"页面提示: {error_msg}") - # 刷新验证码图片 - self.page.locator('img.code-image').click() - time.sleep(1) except: pass + + # 点击登录失败后,验证码会自动刷新,不需要手动点击刷新,稍微等待一下让新图片加载即可 + time.sleep(1) + retry_count += 1 else: self.log(f"登录等待超时或失败: {e}") return if not login_success: - self.log("[ERROR] 达到最大登录重试次数,放弃自动登录。请手动干预。") - return + self.log(f"[WARN] 达到最大自动登录重试次数 ({max_retries}次)。请在浏览器中手动输入验证码并完成登录!") + try: + # 退回到手动等待模式,无限制等待直到登录成功 + self.page.wait_for_url("**/homePage**", timeout=0) + self.log("✅ 检测到手动登录成功!") + except Exception as e: + self.log(f"手动登录等待失败: {e}") + return # 2. 强制跳转目标页 if "deliveryOrders" not in self.page.url: diff --git a/使用说明.txt b/使用说明.txt index 374fd95..49d7e95 100644 --- a/使用说明.txt +++ b/使用说明.txt @@ -1,51 +1,47 @@ -======================================================================== - 四川银行权益商城自动化工具 - 使用说明 -======================================================================== +=== 四川银行权益商城自动化工具 使用说明 === -一、 快速开始 +一、首次使用准备 +------------------------ +1. 配置映射关系 +打开文件夹中的 "product_map.txt",按里面的说明配置商品映射。 +左边写四川银行的商品名,右边写货易通对应的内部ID,用 ">>>>" 隔开。 +例如:洁丽雅采优四件套格格布鲁格格布鲁 >>>> JLY-3401 -1. 确保您的电脑已连接互联网。 -2. 确保您的电脑已安装 Google Chrome 或 Microsoft Edge 浏览器。 -3. 双击运行文件夹中的 "scbank_tool.exe"。 -4. 按照屏幕提示操作: - - 输入 "1" 并回车:启动采集。程序会自动打开浏览器,请登录后进入订单页面,自动下载待发货订单。 - - 输入 "2" 并回车:启动处理。程序会自动读取抓取到的数据,上传到货易通系统,并生成 Excel 报表。 +2. 填写账号配置 +打开文件夹中的 "config.txt",在等号后面填写你的账号密码。 +- 商城账号、商城密码为必填项。 +- 如果你有“超级鹰”账号,填入超级鹰账号和密码,程序就能全自动识别验证码。 +- 如果没有超级鹰,空着不填即可,程序运行到登录界面时会等你手动输入验证码。 -二、 文件结构说明 +3. 安装浏览器环境 (仅首次需要) +由于需要模拟浏览器操作,请确保电脑上安装了 Google Chrome 或 Microsoft Edge。 -- scbank_tool.exe : 主程序,双击运行。 -- product_map.txt : 商品名称映射配置文件 (文本文件,可用记事本编辑)。 -- data/ : [自动生成] 存放采集到的原始数据 (.jsonl|.xls)。 -- data/archive/ : [自动生成] 存放处理完成并归档的数据。 -- output/ : [自动生成] 存放处理结果和 Excel 报表。 -- error.log : [自动生成] 如果程序闪退或出错,错误信息会保存在这里。 +二、日常使用流程 +------------------------ +双击运行 "scbank_tool.exe" (或者主程序快捷方式),会看到一个黑色的命令行窗口,根据提示操作即可。 -三、 商品名称映射配置 (重要) +【步骤一:抓取订单】 +1. 在窗口中输入 1 并回车。 +2. 程序会自动打开浏览器,自动输入账号密码。 + - (如果你配了超级鹰,它会自动填验证码并登录;如果没有配,请你手动输入验证码并点击登录) +3. 登录成功后,程序会自动跳转到“待发货”页面,自动点击批量发货并下载 Excel 文件。 +4. 等待窗口提示“采集任务完成”,浏览器会自动留在原地,你可以关掉它。 -如果商城显示的商品名称,与货易通系统中的商品名称不一致,会导致“商品匹配失败”。 -此时,您需要手动编辑 "product_map.txt" 文件。 +【步骤二:上传货易通】 +1. 抓取完成后,在窗口中输入 2 并回车。 +2. 程序会自动读取刚刚下载的 Excel 文件。 +3. 它会根据你的 "product_map.txt" 自动把四川银行的商品转换成货易通的内部ID。 +4. 自动上传到货易通系统。 +5. 成功后,会在 output 目录下生成一个结果报表 (result_xxx.xlsx),你可以打开看看有没有失败的。 +6. 处理过的原文件会被移动到 data/archive 目录下存档。 -1. 用记事本打开 "product_map.txt"。 -2. 在文件末尾添加一行规则。 -3. 规则格式: - 商城商品名称>>>>内部商品名称 +三、常见问题 +------------------------ +1. 提示找不到配置文件? +请确保 config.txt 和 product_map.txt 与主程序在同一个文件夹内。 - (注意:中间是四个大于号 >>>>) +2. 如果程序闪退怎么办? +程序运行中如果发生崩溃,错误信息会自动保存到 error.log 文件中,你可以发给开发人员查看。 -4. 示例: - 如果商城显示 "四川特产/老腊肉(500g)",而货易通系统叫 "精选老腊肉",则添加: - - 四川特产/老腊肉(500g)>>>>精选老腊肉 - -5. 保存文件后,重新运行程序即可生效。 - -四、 常见问题 - -Q: 程序一打开就闪退? -A: 请检查文件夹下是否生成了 error.log 文件,打开查看具体错误。通常是因为电脑没有安装 Chrome/Edge 浏览器,或者网络不通。 - -Q: 采集时浏览器没有自动翻页? -A: 请确保浏览器窗口保持在前台,不要最小化。如果页面加载过慢,程序可能会等待超时。 - -Q: 上传失败提示“未找到商品”? -A: 请检查 product_map.txt,添加对应的名称映射规则。 +3. 我可以自己放 Excel 进去吗? +可以。如果你自己从网页下载了待发货订单的 Excel(.xls 或 .xlsx),直接把它扔到 data 目录下,然后运行程序选 [2],它也能正常处理。