• 注册
  • WordPress后台-外观-小工具 进行配置小工具

    谷歌GMC 谷歌GMC 关注:4 内容:10

    GMC自动化上传feed+绑定adsid+投放广告

  • 查看作者
  • 打赏作者
  • 拉黑名单
  • 当前位置: 西塞网络科技 > 谷歌GMC > 正文
    • 谷歌GMC
    • VIP
      管理员

      HubStudio Shopping Ads 自动化使用说明

      安装、表格字段、运行命令及版本更新记录。已针对电脑端和手机端做自适应处理,长命令、链接和选择器不会撑出页面。

      当前整理至 V91

      ① 安装环境

      pip install -r requirements.txt
      playwright install chromium

      ② 任务表格

      data/shopping广告任务.csv

      ③ 运行单条

      py bin/Hub_ShoppingAds_Auto.py --all --thread 1 --start 1 --end 1

      ④ 运行指定范围

      python bin/Hub_ShoppingAds_Auto.py --all --thread 3 --start 5 --end 10 --start-gap 2
      编码要求:表格必须保存为 UTF-8 格式,否则脚本可能读取失败或出现乱码。

      中文字段说明

      字段 说明
      环境名称 仅用于日志显示
      环境ID HubStudio 环境ID,必填
      Google Ads客户ID Google Ads 后台客户ID,去掉横杠
      GMC ID Merchant Center ID,必填
      广告系列基础名称 脚本会自动加 High/Normal + 随机数字
      每日预算 两个广告使用同一个每日预算
      第一组CPC 第一个广告的最高点击单价,同时选择 High priority
      第二组CPC 第二个广告的最高点击单价,不选择 High priority
      投放国家 United States 或 US
      运行状态 脚本回写
      运行信息 脚本回写
      账号检查状态 脚本回写
      第一组广告状态 脚本回写
      第二组广告状态 脚本回写
      截图路径 脚本回写
      更新时间 脚本回写

      运行注意事项

      1. HubStudio必须正在运行。

      1. 对应HubStudio环境里必须已经登录Google Ads。

      1. GMC必须能在广告创建流程里选择,或出现 Review link request 并可批准。

      1. 如果Google页面文案或结构变化,脚本可能卡住;看 runtime/screenshots 里的失败截图补selector。

      1. 建议先 –thread 1 跑一条,稳定后再并发。

      基础更新说明

      • 如果 Add products to this campaign 页面已经显示表格里的 GMC ID,例如 5777859064 – 店铺名,脚本会直接跳过 GMC 选择,继续填写广告系列名称并进入下一步。

      版本更新记录

      点击版本标题展开/收起

      1. 严格核对 GMC ID:页面已选 GMC ID 必须和表格【GMC ID】一致,否则停止并截图,防止投错 GMC。

      1. 修复 Next 隐藏按钮问题:只点击可见、可用的 Next/Continue 按钮。

      1. 多线程改为队列模式:–thread 控制真实并发,类似之前 GMC 脚本,不会一次性创建大量线程。

      • 修复 GMC 已显示但仍有 Review link request 时没有点击的问题。

      • 现在只要检测到 Review link request,会优先点击并在弹窗中 Approve link request。

      • Approve 前后都会核对表格 GMC ID,防止投错 GMC。

      • 表格【GMC ID】主要用于核对 Ads 页面已选 GMC ID 是否一致。

      • 如果页面已经显示正确 GMC ID 且没有 Review link request,直接跳过 GMC 选择,进入广告命名并点击右下角 Continue。

      • 如果页面正确 GMC ID 旁边仍有 Review link request,会先批准关联,再继续。

      • Campaign name 页面新增专门点击右下角蓝色 Continue 的逻辑,避免点错隐藏按钮。

      • 最终确认 Review link request 逻辑:

      页面显示 Review link request 按钮时才点击并 Approve;

      不显示时,只核对 GMC ID,一致后直接填写 Campaign name 并点 Continue。

      • Review 检测改为检测可见按钮,不再只依赖页面文字。

      • 修复已登录环境被误判未登录的问题。

      • Google 多账号页面出现 Choose an account 时,不再直接失败,会先尝试点击已登录账号。

      • 只有真正出现 Sign in / Email or phone / Use your Google Account 时才标记为需要登录。

      • GMC选择支持三种状态:

      1. 已经绑定/已选中:核对表格GMC ID,一致则继续;

      1. 没有绑定/为空:按表格GMC ID输入并选择;

      1. 已选中但和表格不一致:尝试清空后重新选择表格GMC ID。

      • 如果显示 Review link request,则核对GMC ID后点击 Review / Approve;不显示则直接继续。

      • 新增中文字段【Google登录邮箱】。

      • 如果 Google Ads 打开后出现 Choose an account,脚本会优先点击表格中【Google登录邮箱】对应的已登录账号。

      • 支持点击 data-identifier / data-email / 页面文本中的邮箱。

      • 如果表格未填写【Google登录邮箱】,才自动点击第一个已登录账号。

      • 修复 GMC 搜索框定位。

      • GMC 搜索框只在 shopping-account-link-picker / merchant-picker / product-set-picker / unified-feed 内查找。

      • 避免误点 Google Ads 顶部全局搜索框(Show me my impression share… 那个搜索框)。

      • 如果找不到 merchant-picker 内的 Select account,会停止并截图,不会误操作顶部搜索。

      • 修复政策检查误判正常账单页的问题。

      • Balance / Next automatic payment / Last payment / Make an optional payment 不再算异常。

      • 只有明确影响投放的横幅或任务才停止,例如:

      Pay with your payment method、To run ads again、Complete the tasks、Account suspended、Verification failed、Payment issue。

      • 两个 Shopping 广告都创建完成后,会自动打开:

      https://ads.google.com/aw/billing/summary
      • 等待账单页面加载完成后截图保存到 runtime/screenshots/

      • 新增 CSV 回写字段【账单截图路径】

      • 修复页面还没渲染完成就失败/刷新太快的问题。

      • 新增 wait_page_or_reload:最长等待 180 秒,未渲染再 reload 一次,再等 180 秒。

      • 新建广告页、选择 Shopping 页、GMC选择页、预算页、账单页都使用更长等待。

      • 账单 summary 页面截图前额外等待卡片加载。

      • 修复 Campaign name 先出现,但 GMC 已绑定账号还没渲染出来时误判为空的问题。

      • 进入 Add products to this campaign 后,会先等待 GMC 区域稳定,最多 60 秒。

      • 只有 Select account 输入框稳定为空多次后,才按表格 GMC ID 搜索选择。

      • 不再把 Campaign name 出现作为 GMC 区域完成的唯一判断。

      • 修复 GMC ID 输入后结果出来但仍在转圈,脚本过早选择的问题。

      • 输入 GMC ID 后会等待:

      1. 搜索结果区域停止 loading/spinner;

      1. 包含 GMC ID 的候选项真正可见可点击;

      1. 再点击选择。

      • 不再过早按 Enter,避免 GMC 还在加载时选不到。

      • 修复“GMC输入框已经出现但没有继续选择”的问题。

      • wait_page_or_reload 改为同时检查文本和元素,任意一个满足即继续。

      • GMC区域会明确输出状态:matched / other_id / review / empty。

      • Select account 输入框出现后,直接 fill 表格 GMC ID,并触发 input/change 事件。

      • 失败时会输出更明确的“第几次失败原因”。

      • 修复 GMC 候选列表已经出现但未选择的问题。

      • 支持 Merchant Center account 表格候选列表,按表格 GMC ID 精确点击整行。

      • 如果候选行显示 Link request needs your approval,选中后会继续检测 Review link request。

      • Review link request 蓝色按钮点击后,会等待弹窗并核对 GMC ID,再点击 Approve link request。

      • 修复 v17 漏打包 wait_gmc_area_settled 函数导致的:

      'ShoppingAdsRunner' object has no attribute 'wait_gmc_area_settled'

      • 继续保留 v17 的 GMC候选整行点击、Review link request、Approve link request 逻辑。

      • 修复打开 billing summary 时又出现 Choose an account 的问题。

      • 现在 safe_goto 打开任意 Google Ads 页面后都会检查 Choose an account。

      • 如果出现,会按表格【Google登录邮箱】点击对应账号。

      • billing/summary 页面截图前也会再次检查并选择账号。

      • Google 账号选择只保留两处:

      1. 第一步 policy/account 账号检查页;

      1. 最后 billing/summary 账单截图页。

      • 中间 Shopping 创建流程不再每个页面都自动处理 Choose an account,避免干扰广告创建。

      • 新增日志文件:

      runtime/logs/run_年月日_时分秒.log

      • 控制台输出会同步写入日志文件。

      • 新增实时进度显示:

      当前第几个/总数、成功数、失败数、运行中数量。

      • 多线程继续使用队列模式,–thread 控制真实并发。

      • 修复 v22 仍然报 NameError: LOG_DIR is not defined 的问题。

      • 这次主脚本全局和 main() 内都增加日志目录定义,避免嵌套目录打包导致未生效。

      • 日志目录:runtime/logs/

      • 修复回写 CSV 报错:

      ValueError: dict contains fields not in fieldnames: '账单截图路径'
      • 保存任务表前会自动补齐新增字段。

      • 新增 CSV 日志:

      runtime/logs/run_年月日_时分秒.csv

      • CSV日志每个任务一行,包含运行状态、截图路径、账单截图路径、失败原因等。

      • 修复选择账号时把 Ads ID 误当成 Google登录邮箱导致失败的问题。

      • 【Google登录邮箱】为空、不是邮箱、或找不到时,会直接点击第一个已登录 Google 账号。

      • 不再因为“选择账号页面未找到表格指定邮箱”而停止。

      • 任务完成或失败后,会尝试关闭对应 HubStudio 浏览器环境。

      • 新增调用:

      http://127.0.0.1:6873/api/v1/browser/stop
      • 如果 HubStudio stop 接口不支持或关闭失败,不影响 CSV 回写,只在日志中提示。

      • 每个任务执行完成/失败后,会先关闭当前 HubStudio 浏览器环境,再开始下一个任务。

      • 新增参数:

      –close-gap 3

      表示关闭当前环境后等待 3 秒再处理下一个任务。

      • 单线程时流程为:

      第1个任务 → 关闭浏览器 → 等待 → 第2个任务 → 关闭浏览器 → 等待 → …

      • 多线程时每个线程也会遵守:当前环境关闭后才取下一个任务。

      • 修复 v27 报错:

      AttributeError: 'ShoppingAdsRunner' object has no attribute 'ensure_google_account_selected'
      • 补回 ensure_google_account_selected() 函数。

      • 账号选择仍只在第一步 policy/account 和最后 billing/summary 两处执行。

      • 点击最终发布/完成广告按钮后等待 35 秒,确保 Google Ads 自动跳转和开通完成。

      • CSV 被 Excel/WPS 占用时会重试 5 次;仍失败则写入 runtime/logs/csv_save_failed_时间.csv 备用,不让线程崩溃。

      • 增强 Google 账号选择页点击:支持 li / role=link / data-identifier / data-email;找不到指定邮箱时点击第一个已登录账号。

      • 修复最后账单截图页点击 Google 账号后没进入账单页的问题。

      • 现在 billing/summary 如果出现 Choose an account:

      1. 点击账号;

      1. 等待;

      1. 重新打开 billing/summary URL;

      1. 再等待 Balance / Billing / Payments 页面;

      1. 最后截图。

      • 发布广告后不再只靠等待判断成功。

      • 每创建完一个 Shopping 广告,会自动打开 Campaigns 列表页验证刚创建的 Campaign name 是否存在。

      • 验证通过才标记该广告成功。

      • 如果 Campaigns 列表找不到该广告,会等待/刷新重试 3 次,仍找不到则失败并截图。

      • 修复最后一步没有点击发布按钮的问题。

      • 最后阶段会优先查找并点击 Publish campaign / Create campaign / Publish / Done / Finish。

      • 不再因为页面文本出现 created/创建 就提前结束。

      • 点到最终发布按钮后等待 35 秒,再去验证 Campaigns 列表。

      • 修复两个广告系列名称可能重复/不清楚的问题。

      • 每一行任务创建两个广告时,名称格式改为:

      广告系列基础名称-1-High-月日-时分秒-随机数

      广告系列基础名称-2-Normal-月日-时分秒-随机数

      • 第一组和第二组一定不重复,也方便在 Campaigns 列表验证。

      • 修复报错:

      'ShoppingAdsRunner' object has no attribute 'verify_campaign_created'

      • 强制补回 verify_campaign_created() 函数。

      • 保留 v33 的两个广告系列名称不重复逻辑。

      • 发布广告后仍会打开 Campaigns 列表反查确认广告真的创建成功。

      • 修复 Campaigns 列表验证页也会出现 Choose an account 的问题。

      • 发布后打开 https://ads.google.com/aw/campaigns 验证广告时:

      如果出现账号选择页,会点击已登录账号,然后重新打开 Campaigns 列表页再验证。

      • 中间创建广告流程仍不自动处理账号选择,避免干扰。

      • 一行账号从创建2个 Shopping 广告改为创建4个 Shopping 广告。

      • 第1组选择 High。

      • 第2/3/4组不选择 High,按 Low/Normal 处理。

      • 新增表格字段:

      第三组CPC、第四组CPC、第三组广告状态、第四组广告状态。

      • 如果第三组CPC/第四组CPC为空,会默认使用第二组CPC。

      • 广告名称格式仍然带组号,确保4个广告名称不重复:

      基础名-1-High-时间-随机数

      基础名-2-Low-时间-随机数

      基础名-3-Low-时间-随机数

      基础名-4-Low-时间-随机数

      • 修复国家选择没选上的问题:

      输入国家后等待候选项加载,点击 United States 后再点 Include,并验证页面是否包含 United States。

      • 发布广告后不再固定等待 35 秒。

      • 点击发布/完成后等待自动跳转到:

      https://ads.google.com/aw/productgroups

      只要跳到 productgroups 就判断创建成功。

      • 若未跳转 productgroups,仍保留 Campaigns 列表验证作为兜底。

      • 修复账单页 Choose an account 点击账号后仍停留在选择账号页的问题。

      • 账号选择改为优先点击真正可触发的账号块:

      div[role="link"][data-identifier]
      .VV3oRb[data-identifier]
      [data-button-type="multipleChoiceIdentifier"]
      • 点击方式增强为:

      Playwright click → 鼠标中心点 click → focus + Enter。
      • 点击后会检测是否离开 Choose an account 页面;如果仍未离开,会继续重试或报明确错误。

      • 修复 v38 报错:

      AttributeError: 'ShoppingAdsRunner' object has no attribute 'make_unique_campaign_name'
      • 补回 make_unique_campaign_name() 函数。

      • 保留 v38 的 Google Choose an account 强化点击逻辑。

      • 保留4组广告命名不重复逻辑:

      基础名-1-High-时间-随机数

      基础名-2-Low-时间-随机数

      基础名-3-Low-时间-随机数

      基础名-4-Low-时间-随机数

      • 修复国家选择时报错:

      Page.evaluate: SyntaxError: Invalid or unexpected token
      • 国家选择改为:

      输入表格国家 → 等候选列表稳定 → 直接 Enter → 验证页面国家和表格一致 → 点击 Include。

      • 如果第一次 Enter 没选上,会尝试 ArrowDown + Enter。

      • 点击 Publish campaign 后不再主动跳转 Campaigns 列表验证,也不刷新页面。

      • 发布后只等待 Google Ads 自动跳到 /aw/productgroups。

      • 最多等待 35 秒。

      • 检测到 /aw/productgroups 后再等待 8 秒让页面渲染完成,然后判定该广告创建成功。

      • 修复最后账单截图页反复跳 Choose an account 的问题。

      • billing/summary 会尝试带 authuser=0/1/2/3 重新打开。

      • 点完账号后不再一直重复打开原始URL,避免卡在选择账号页。

      • 如果最终仍进不去账单页,会保存当前页面截图到“账单截图路径”,但不让广告创建结果失败。

      • 新增 GMC 没产品检测。

      • 如果选择 GMC 后出现:

      There are no products in this Merchant Center account

      no products

      ads using product data won’t show until products are added and approved

      则停止当前任务。

      • 回写:

      账号检查状态 = GMC没产品

      运行信息 = GMC没产品

      运行状态 = 失败

      • 不再继续创建广告,避免创建无效广告。

      • 修复 GMC没产品后仍然重复重试的问题。

      • 新增 NoRetryStop 异常:

      检测到 GMC没产品后立即停止当前任务,不再 retry 3 次。

      • 处理流程:

      GMC没产品 → 截图 → 回写失败/GMC没产品 → 关闭当前HubStudio环境 → 进入下一个任务。

      • 修复 GMC候选列表已经显示 no products 但脚本仍继续点击的问题。

      • 现在只要候选列表中对应 GMC 行出现 no products,会在点击前直接停止。

      • 不再选择该 GMC,不再重试。

      • 直接回写:

      运行状态 = 失败

      账号检查状态 = GMC没产品

      运行信息 = GMC没产品:候选列表显示 no products

      • 修复 v45 检测到 GMC候选列表 no products 后仍然继续循环的问题。

      • 原因是 NoRetryStop 被 wait_gmc_option_clickable() 里的 except Exception 吃掉。

      • 现在检测到 no products 会立即穿透等待循环,直接停止当前任务,不重试、不继续点击。

      • 同一个 no products 情况只截一次 gmc_no_products_candidate 图。

      • 已把上传的 GMC HubStudio 脚本流程合并进当前 Shopping Ads 自动化。

      • 同一个 HubStudio 环境会按顺序执行:

      1. GMC 配送 Shipping services 检查/创建;

      1. GMC Marketing methods 关闭 Free listings;

      1. 如果填写了 Feed文件路径,则创建 Primary Feed 并上传;

      1. 进入 GMC linkedaccounts/integrations,选择 Google Ads,绑定表格里的 Google Ads客户ID;

      1. 再进入 Google Ads 创建 4 个 Shopping 广告。

      • 新增表格字段:

      执行GMC预处理、Feed文件路径、币种、绑定AdsID、

      GMC预处理状态、配送设置状态、Free listings状态、Feed上传状态、GMC绑定Ads状态。

      • 如果【执行GMC预处理】为空,但填写了【Feed文件路径】或【币种】,也会自动执行GMC预处理。

      • 如果只想跑广告,不跑GMC预处理:执行GMC预处理 填 否,并清空 Feed文件路径/币种。

      • 原始上传脚本也放在 extra/gmc_hubstudio_auto_mysql_csv_original.py 备份。

      • 修复“GMC 和 Ads 不在同一个 Google账号 / HubStudio环境”的问题。

      • 表格新增字段:

      GMC环境名称、GMC环境ID、Ads环境名称、Ads环境ID、GMC登录邮箱、Ads登录邮箱。

      • 执行顺序改为:

      1. 如果启用GMC预处理:打开 GMC环境ID 对应环境,执行 Shipping / Free listings / Feed / GMC绑定AdsID;

      1. 关闭 GMC 环境;

      1. 打开 Ads环境ID 对应环境,检查 Ads政策页并创建4个 Shopping广告;

      1. 完成后关闭 Ads 环境。

      • 兼容旧表:

      如果不填 GMC环境ID / Ads环境ID,会继续使用旧的 环境ID。

      • 账号选择:

      GMC阶段优先使用 GMC登录邮箱;

      Ads阶段优先使用 Ads登录邮箱;

      为空时仍点击第一个已登录账号。

      • 按你指定的新顺序执行:

      1. 先打开 Ads环境ID,提取/确认 Google Ads客户ID;

      1. 关闭 Ads 环境;

      1. 打开 GMC环境ID;

      1. 在 GMC 账号里先绑定对应 Ads ID;

      1. 再执行 Shipping;

      1. 再关闭 Free listings;

      1. 再上传 Feed;

      1. Feed 必须等自动跳转到 https://merchants.google.com/mc/products/sources/detail 页面,才算上传完成并关闭 GMC 环境;

      1. 重新打开 Ads环境ID;

      1. 执行 policy/account 检查、创建4个Shopping广告、billing截图;

      1. 关闭 Ads 环境。

      • Feed 文件按 50-150MB 处理,等待上传完成默认最多 1200 秒。

      • 新增状态字段:

      AdsID提取状态。

      • 调整 Ads/GMC 环境切换逻辑:

      1. 先打开 Ads环境ID,提取/确认 Ads ID;

      1. 不关闭 Ads 环境,只断开脚本连接,Ads窗口放着;

      1. 打开 GMC环境ID,执行绑定 Ads ID / Shipping / Free listings / Feed上传;

      1. Feed 自动跳到 products/sources/detail 后,关闭 GMC 环境;

      1. 回到之前保留的 Ads环境ID;

      1. 执行 policy/account、创建4个 Shopping广告、billing截图;

      1. 最后关闭 Ads 环境。

      • 修复 v50 启动时报错:

      TypeError: get expected at most 2 arguments, got 6
      • 原因是进度显示函数里 row.get(“环境ID”, …) 被错误替换。

      • 现在进度显示环境ID优先级为:

      Ads环境ID > GMC环境ID > 环境ID

      • 修复 v51 报错:

      AttributeError: 'ShoppingAdsRunner' object has no attribute 'ensure_google_account_selected'
      • 补回 handle_google_choose_account() 和 ensure_google_account_selected()。

      • Ads ID 提取增强:

      支持从以下页面结构提取:

      <account-ids>

      <div class=”account-info” title=”641-745-2262 “>641-745-2262</div>

      </account-ids>

      • 如果表格已有 Google Ads客户ID,会优先确认一致;如果表格为空,会从页面提取并回写。

      • 修复 v52 报错:

      AttributeError: &#x27;ShoppingAdsRunner&#x27; object has no attribute &#x27;body_text&#x27;
      AttributeError: &#x27;ShoppingAdsRunner&#x27; object has no attribute &#x27;safe_goto&#x27;
      • 补回基础方法:

      body_text()
      safe_goto()
      wait_ready()
      • Ads ID 提取优化:

      如果打开的URL包含 ?ocid=6417452262,会直接提取为 641-745-2262,不再必须等页面DOM。

      • 修复 v53 报错:

      AttributeError: &#x27;ShoppingAdsRunner&#x27; object has no attribute &#x27;wait_page_or_reload&#x27;
      • 补回 wait_page_or_reload()。

      • Ads ID 提取改为优先从“准备打开的URL”直接提取:

      https://ads.google.com/aw/overview?ocid=6417452262

      会立即提取为 641-745-2262。

      • 不再因为 Choose an account 跳转导致提取到错误ID或提取失败。

      • Ads ID 提取优先从页面 account-info 获取:

      <account-ids>

      <div class=”account-info” title=”641-745-2262 “>641-745-2262</div>

      </account-ids>

      • 提取优先级:

      1. account-ids .account-info 的 title;

      1. account-ids .account-info 的文本;

      1. 当前URL里的 ocid;

      1. 打开URL里的 ocid;

      1. 表格已有 Google Ads客户ID。

      • 如果表格ID和页面 account-info ID不一致,会记录日志,并以页面 account-info 为准。

      • 修复 v55 报错:

      AttributeError: &#x27;ShoppingAdsRunner&#x27; object has no attribute &#x27;should_run_gmc_pre_setup&#x27;
      • 这次对 ShoppingAdsAuto.py 里 self.xxx() 调用和实际 def xxx() 做了扫描。

      • 补回缺失基础方法,避免继续出现 object has no attribute:

      should_run_gmc_pre_setup()
      yes_value()
      element_is_usable()
      js_click_best()
      fill_input()
      wait_google_loading_gone()
      click_text()
      retry_step()
      • Ads ID 仍按 v55 逻辑:优先从 account-info 提取,页面ID和表格ID不一致时,以页面 account-info 为准。

      • 重写 GMC Shipping services 检查/创建逻辑。

      • 打开 https://merchants.google.com/mc/shipping/services 后,会等待真实表格行渲染完成:

      particle-table-row[role=row]
      shippingServiceName

      Complete

      deliveryTime
      • 如果已存在 Complete 的 Shipping Policy,直接跳过。

      • 如果不存在,则执行:

      Add shipping policy

      Select all added countries

      Continue

      Continue

      Minimum transit time = 2

      Maximum transit time = 3

      Continue / Save / Done

      • 创建后重新打开 Shipping services 页面确认 Complete。

      • 修复 GMC Feed 上传时弹出 Enter feed label 的流程。

      • 新流程:

      1. 选择 Upload a file from your computer;

      1. 点击 Continue;

      1. 如果弹出 Enter feed label;

      1. 自动填写随机 Feed label,例如 FL-A1B2C3D4E5;

      1. 点击 Save;

      1. 再点击 Upload / Choose file;

      1. 选择表格 Feed文件路径;

      1. 等待自动跳到 products/sources/detail。

      • Feed label 只使用大写字母、数字、hyphen,符合页面要求。

      • Feed上传完成判断增强。

      • 除了 URL 跳到 /products/sources/detail 外,如果页面出现以下文本,也判断上传完成:

      Source details

      Your products are updated

      Your products are up-to-date with your file

      Any basic issues can be found on this page

      Needs attention

      • 检测到完成后等待 6 秒,再关闭 GMC 环境并继续 Ads 投放流程。

      • 修复创建第1个 Shopping 广告时报错:

      ShoppingAdsRunner.safe_goto() got an unexpected keyword argument &#x27;required_text&#x27;
      • safe_goto() 现在兼容:

      required_text

      required_texts

      required_selector

      required_selectors

      • 基于 v59,保留 Feed 上传完成判断:

      /products/sources/detail

      Source details

      Your products are updated

      Your products are up-to-date with your file

      • 修复 Feed 上传流程中 Continue 后没有点击 Enter feed label 弹窗 Save 的问题。

      • Continue 后会强制等待 Enter feed label 弹窗最多 90 秒。

      • 检测方式不只靠页面文字,还直接查:

      input[aria-label=&#x27;Feed label&#x27;]
      div[role=&#x27;dialog&#x27;]:has-text(&#x27;Enter feed label&#x27;)
      • 自动填写随机 Feed label。

      • Save 点击增强:

      普通 click → JS click → 鼠标中心点 click → dialog 内 JS 查找 Save 兜底。

      • Save 后再进入 Upload / Choose file 上传文件流程。

      • 修复 Feed label Save 后没有真正上传 Feed 文件的问题。

      • 文件上传改为强制确认:

      1. 等待上传区域出现;

      1. 优先 input[type=file].set_input_files;

      1. 如果没有 input[type=file],点击 Upload / Select file / Choose file 触发 file chooser;

      1. 设置文件后确认页面出现文件名或 input.files.length > 0;

      1. 再点击 Upload / Continue;

      1. 等待 /products/sources/detail 或 Source details。

      • 日志会输出 input[type=file] 数量和是否设置成功,方便判断文件是否真的上传。

      • 修正 GMC createPrimaryFeed 真实顺序。

      • 新顺序:

      1. 选择 Upload a file from your computer;

      1. 先上传表格里的 CSV Feed 文件;

      1. 点击 Continue;

      1. 弹出 Enter feed label;

      1. 填写随机数字 Feed label,例如 FL1234567890;

      1. 点击 Save;

      1. 再点击后续 Continue / Upload;

      1. 等待 Source details / Your products are updated。

      • 成功判断包含:

      /products/sources/detail

      Source details

      Your products are updated

      Your products are up-to-date with your file

      • 修复 Enter feed label 弹窗已出现,但输入框找不到的问题。

      • 新逻辑不再只靠 Playwright locator:

      直接用 JS 在 dialog / auto-suggest-text-field-dialog / material-dialog 内找 input[aria-label=&#x27;Feed label&#x27;]。

      • 强制写入随机 Feed label,并触发 input/change/keyup/keydown 事件。

      • Save 也优先用 JS 在 dialog 内找文本为 Save 的按钮点击。

      • Save 后最后点击页面上的 button[debugid=&#x27;continueButton&#x27;],再等待 Source details / Your products are updated。

      • 按上传的 GMC 独立脚本思路修复 Feed 上传顺序:

      set_input_files 后先等文件识别/上传状态完成,再点击 Continue。

      • 修复日志中:

      未检测到 Enter feed label 弹窗

      Feed label保存后未找到最终 Continue/Upload

      等待GMC Feed上传完成一直等

      • 新流程:

      1. Upload a file from your computer;

      1. 选择 CSV 文件;

      1. 等待文件名/.csv/进度条结束;

      1. 点击 Continue;

      1. 如弹 Enter feed label,填写随机 Feed label 并 Save;

      1. Save 后点击最终 Continue;

      1. 等待 Source details / Your products are updated。

      • 修复最终 Continue 后页面已出现 Source details / Your products are updated 但脚本仍继续等待的问题。

      • 点击最终 Continue 后会优先检测:

      Source details

      Your products are updated

      Your products are up-to-date with your file

      /products/sources/detail
      • 一旦检测到,等待 6 秒,截图,标记 Feed上传状态=已上传,并立即关闭 GMC 环境进入 Ads 流程。

      • wait_google_loading_gone() 在 Feed 阶段也会提前识别 Source details 成功页,不再卡 90 秒。

      • 修复创建Shopping广告选择GMC时报错:

      argument of type &#x27;bool&#x27; is not a container or iterable

      • 原因:extract_visible_gmc_ids() 被旧版本兜底方法返回 False。

      • 现在 extract_visible_gmc_ids() 返回 list[str]。

      • 新增 choose_gmc_id_from_picker():

      1. 读取表格 GMC ID;

      1. 等待 Select a Merchant Center account 区域稳定;

      1. 如果页面已显示目标GMC ID,直接使用;

      1. 否则在 Select account 搜索框输入GMC ID;

      1. 点击包含该GMC ID的候选行;

      1. 如果候选显示 no products,直接标记 GMC没产品并停止当前任务。

      • 如果页面显示 Merchant Center account link requests pending,会尝试点击 View/Review。

      • 修复 Feed 文件 Continue 后顺序不对导致卡住的问题。

      • 新顺序:

      1. 等待Feed文件被页面识别/上传完成;

      1. 点击 Continue;

      1. 立刻等待 Enter feed label 弹窗;

      1. Feed label 弹窗最多只等 25 秒,不再卡 120 秒;

      1. 如果没弹 Feed label,立即检测 Source details / Your products are updated;

      1. 如果已成功,等 6 秒并关闭 GMC 环境;

      1. 如果还没成功,再进入原来的上传完成等待。

      • 修正 Feed 文件识别后 Continue / Feed label 的日志和执行顺序。

      • 新顺序:

      1. 等待Feed文件被页面识别/上传完成;

      1. Feed文件已被页面识别,且没有进度条,继续;

      1. 准备等待 Enter feed label 弹窗;

      1. 点击 Continue 进入 Feed label 步骤;

      1. Continue 点击成功后立即检测 Feed label;

      1. 填写并保存 Feed label;

      1. 后面再等页面稳定 / Source details / Your products are updated。

      • 不再出现“先等页面稳定,再等 Feed label”的顺序。

      • 明确 Feed label 保存后的 Continue 是最后一步。

      • Feed 上传流程固定为:

      1. 选择 CSV Feed 文件;

      1. 等待文件被页面识别;

      1. 点击 Continue 打开 Enter feed label;

      1. 填写 Feed label;

      1. 点击 Save;

      1. 点击最后一步 Continue;

      1. 最后一步 Continue 后不再点击任何按钮,只等待:

      Source details

      Your products are updated

      Your products are up-to-date with your file

      • 检测成功后等待 6 秒,截图,关闭 GMC 环境,回到 Ads 环境。

      • 重写 Ads 创建 Shopping 广告流程,按用户提供的真实页面元素执行。

      • 修复:

      ShoppingAdsRunner.wait_gmc_area_settled() got multiple values for argument &#x27;timeout&#x27;
      • 新流程:

      1. 打开 https://ads.google.com/aw/campaigns/new;

      1. 点击 Website traffic;

      1. 点击 Shopping;

      1. 在 Select account 搜索表格 GMC ID 并选择;

      1. 填写随机 Campaign name;

      1. 点击 Continue;

      1. 填写表格预算;

      1. 勾选 Set a maximum cost per click bid limit;

      1. 填写 CPC;

      1. 第1个广告选择 High,后3个保持默认 Low;

      1. Next;

      1. Enter another location,输入表格投放国家并确认 Locations 表格;

      1. Next;

      1. Next;

      1. Publish;

      1. 等待自动跳到 /productgroups,等2秒继续下一个广告。

      • 修复 GMC Feed label 弹窗打开方式。

      • Feed label 不是点击 Continue 弹出,而是点击 Feed 文件/label 区域的 edit 图标弹出。

      • 新流程:

      1. 选择 CSV Feed 文件;

      1. 等待文件被页面识别;

      1. 点击 material-icon / i.material-icons-extended 文本为 edit 的图标;

      1. 弹出 Enter feed label;

      1. 填写随机 Feed label;

      1. 点击 Save;

      1. 最后点击 Continue;

      1. 等待 Source details / Your products are updated。

      • 保留旧函数名 click_continue_then_wait_feed_label,但内部已改为点击 edit 图标,避免其他调用报错。

      • 按用户上传的 v22 代码,恢复 Ads 创建 Shopping 广告的 GMC 选择逻辑。

      • 保留 v72 的 GMC Feed 上传修复。

      • Ads 侧恢复 v22 方法:

      select_or_approve_gmc()
      wait_gmc_area_settled(gmc_id, timeout=90)
      click_and_fill_gmc_select_account()
      choose_gmc_option_by_id()
      approve_review_if_visible()
      fill_campaign_name_and_continue()
      fill_budget_and_bid()
      maybe_select_high_priority()
      select_location_us()
      finish_remaining_steps()
      create_one_shopping_campaign()
      • 修复 v71 的错误方向:不再强制先点 pending View/Review 再搜索;改回 v22 的“核对当前GMC、必要时清空重选、Review时核对后批准”流程。

      • v22 原本只记录第1/第2组广告状态,v73 已兼容记录 广告1/2/3/4 状态和名称。

      • 彻底固定 GMC Feed 上传顺序:

      1. 进入 createPrimaryFeed;

      1. 选择 Upload a file from your computer;

      1. 上传 CSV Feed 文件;

      1. 等待文件名出现 / 文件被页面识别;

      1. 不是点击 Continue,而是先点击 edit 图标;

      1. 弹出 Enter feed label;

      1. 输入随机数字 Feed label;

      1. 点击 Save;

      1. 最后一步才点击 button[debugid=&#x27;continueButton&#x27;] Continue;

      1. 等待 Source details / Your products are updated。

      • edit 图标点击增强:

      支持 material-icon / i.material-icons-extended / span.icon-wrapper / button / role=button。

      • 最后一步 Continue 后不再点击其他按钮,只等待成功页。

      • 修复 Feed 页面点击了 Select countries / country 的 edit,导致没有弹出 Enter feed label 的问题。

      • click_feed_label_edit_icon() 重写:

      1. 扫描页面所有可见 edit 候选;

      1. 跳过上下文包含 Select countries / countries / country / language / destination 的 edit;

      1. 优先点击上下文包含 feed label / file / .csv / products / Ads campaign / uploaded 的 edit;

      1. 每点一个 edit 后立即检测是否弹出 Enter feed label;

      1. 只有真正弹出 Enter feed label 才算成功,否则继续尝试下一个 edit。

      • 最后一步仍然是 Save 后点击 button[debugid=&#x27;continueButton&#x27;] Continue。

      • 恢复用户之前正常的 Feed 上传流程,不再强制点击 edit 图标。

      • 新流程:

      1. 打开 createPrimaryFeed;

      1. 选择 Upload a file from your computer;

      1. 上传 CSV Feed 文件;

      1. 等待文件名 / .csv / 进度条结束;

      1. 点击 Continue;

      1. 等待页面 ready 约 3 秒;

      1. 如果弹出 Enter feed label,则填写随机标签并 Save;

      1. 如 Save 后还有 Continue,则点击;

      1. 等待 Source details / Your products are updated。

      • 修复:

      上传文件后未找到正确的 Feed label edit 图标

      • 修复 v76 错误:上传完成后马上点 Continue。

      • 现在 Continue 是最后一步。

      • 新流程:

      1. 选择 Upload a file from your computer;

      1. 上传 CSV Feed 文件;

      1. 等待文件名 / .csv / 进度条结束;

      1. 先点击 Feed label 的修改 / edit 入口;

      1. 把旧 Feed label 改成新的随机数字;

      1. Save;

      1. 最后才点击 Continue;

      1. 等待 Source details / Your products are updated。

      • 解决旧 Feed label 重复导致不能继续的问题。

      • 保留 v77 的 GMC / Feed 上传修复。

      • Ads 创建 Shopping 广告相关方法直接从用户上传的 v28 脚本搬入。

      • 已搬入方法:

      extract_visible_gmc_ids, has_visible_review_link_request, click_review_link_request, approve_review_if_visible, clear_selected_gmc_if_any, wait_gmc_option_clickable, click_and_fill_gmc_select_account, choose_gmc_option_by_id, wait_gmc_area_settled, select_or_approve_gmc, open_new_campaign, select_website_traffic_and_shopping, click_bottom_continue, fill_campaign_name_and_continue, fill_budget_and_bid, maybe_select_high_priority, click_next_from_budget, select_location_us, finish_remaining_steps, create_one_shopping_campaign

      • 特别修复 wait_gmc_area_settled() 兼容包装,避免:

      got multiple values for argument &#x27;timeout&#x27;

      • v28 Ads 流程用于 Merchant Center account 选择、预算/CPC、High/Low、位置、发布等步骤。

      • 修复 Feed label 修改按钮点错的问题。

      • 页面真实结构:

      feed-label-editor button[debugid=&#x27;editFeedLabel&#x27;]
      • 现在修改 Feed label 时固定优先点击:

      feed-label-editor button[debugid=&#x27;editFeedLabel&#x27;]
      feed-label-editor button[icon=&#x27;edit&#x27;]
      feed-label-editor button
      • 不再扫描所有 edit,不会点到:

      countries-selector button[debugid=&#x27;multi-countries-select&#x27;]

      Select countries / countries

      language-selector

      destinations-editor

      • 上传 Feed 文件后:

      1. 先点击 feed-label-editor 的 edit;

      1. 修改旧 Feed label 为随机数字;

      1. Save;

      1. 最后才点击 Continue。

      • GMC 预处理部分完整按用户上传的 gmc_hubstudio_auto_mysql_csv(5).py 逻辑写入。

      • run_gmc_pre_setup() 改为调用:

      gmc_ensure_shipping_policy_v80()
      gmc_disable_free_listings_v80()
      gmc_create_primary_feed_upload_v80()
      • Feed 上传流程恢复为完整脚本逻辑:

      1. 打开 createPrimaryFeed;

      1. 选择 Upload a file from your computer;

      1. set_input_files 上传文件;

      1. gmc_wait_upload_finished_v80() 等 .csv / uploaded / progress结束;

      1. 点击 Continue;

      1. 等待页面 ready;

      1. 再等待 Source details / Your products are updated。

      • Ads 创建逻辑继续保留 v78 的 v28 投放脚本逻辑。

      • 在 v80 完整 GMC 脚本逻辑基础上补充 Feed label 修改步骤。

      • Feed 上传完成后不直接点击 Continue。

      • 新顺序:

      1. 选择 Upload a file from your computer;

      1. 上传 CSV Feed 文件;

      1. 等待上传完成;

      1. 点击 feed-label-editor button[debugid=&#x27;editFeedLabel&#x27;];

      1. 弹出 Enter feed label;

      1. 填写随机 FEED_数字;

      1. 点击 Save;

      1. 最后才点击 Continue;

      1. 等待 Source details / Your products are updated。

      • 只点击 feed-label-editor,不点击 countries-selector / language-selector / destinations-editor。

      • 修复 Ads 合并后同名函数覆盖导致:

      wait_gmc_area_settled() got multiple values for argument &#x27;timeout&#x27;
      • 原因:

      合并包里同时存在两个 wait_gmc_area_settled:

      1. v28 正常版:wait_gmc_area_settled(self, gmc_id, timeout=90)

      1. 后续误加版:wait_gmc_area_settled(self, timeout=90)

      Python 后定义覆盖前定义,所以 Ads 侧传 gmc_id + timeout 时崩溃。
      • 处理:

      1. 删除当前包里的 Ads 同名函数;

      1. 从用户上传的 v28 Ads 脚本重新搬入整组 Ads 方法;

      1. 把 v28 的 wait_gmc_area_settled 改成 _wait_gmc_area_settled_v28_impl;

      1. 新增兼容 wrapper:wait_gmc_area_settled(self, *args, timeout=90, **kwargs);

      1. 保留 v81 的 GMC / Feed 修复。

      • Ads 侧仍按 v28 流程跑;GMC 侧按 v81 流程跑。

      • 修复 Ads 位置页面国家输入填错到顶部搜索框的问题。

      • select_location_us() 改为只填写:

      input[aria-label=&#x27;Enter a location to include or exclude&#x27;]

      或 label-text 为 Enter a location to include or exclude 附近的 input。

      • 不再使用泛泛的 input[role=&#x27;combobox&#x27;] 作为首选。

      • 输入国家后,只从 role=option/listbox/dropdown 中选择候选,并确认 Locations 表格包含该国家。

      • 修复 Ads Campaign priority High 选择方式。

      现在先点击 Campaign priority 这一栏的 expand/header,再点击 High 行里的 material-radio / icon-container。

      • 修复 Location 页面 radio 点击方式。

      现在先点击 Enter another location 行里的 material-radio / icon-container。

      • 修复 Location 国家输入。

      只填写 label 为 Enter a location to include or exclude 的输入框,不填顶部搜索框。

      • 选择国家候选后确认 Locations 表格包含该国家再继续。

      • 修复 Location 国家仍填到顶部 Search for a page or campaign 的问题。

      • 国家输入现在只认:

      material-input.suggest-input

      且内部必须包含:

      Enter a location to include or exclude

      For example, a country, city, region, or postal code

      • 绝不再使用普通 input[role=&#x27;combobox&#x27;] 作为国家输入框。

      • 继续保留 v84 的 Campaign priority High 修复。

      • 修改整体执行顺序:

      GMC Feed 上传完成并跳到 Source details 后,不立即关闭 GMC 环境。

      • 新流程:

      1. 打开 Ads 环境提取/确认 Ads ID;

      1. 打开 GMC 环境执行绑定/Shipping/Free listings/Feed 上传;

      1. Feed 上传完成后,GMC 环境保持打开;

      1. 切回 Ads 环境执行 policy/account、创建4个Shopping广告、billing截图;

      1. Ads 全部完成后,再统一关闭 GMC 环境和 Ads 环境。

      • 新增:

      remember_gmc_env_for_later_close()
      close_gmc_env_later_if_needed()
      • Hub_ShoppingAds_Auto.py 的 worker finally 中会先尝试关闭延迟保留的 GMC,再关闭当前 Ads。

      • Ads 创建广告完成判断修改:

      不再只看“检测到创建完成提示”。

      点击最终 Publish / Done / Finish 后,必须等待页面自动跳转到 /aw/overview 才算该广告完成。

      • 不刷新、不手动跳转,只等 Ads 自己跳转。

      • verify_campaign_created() 也改成等待 /aw/overview。

      • GMC 关闭逻辑加强:

      Feed 上传完成后 GMC 环境保持打开;

      Ads 全部完成后,在 worker finally 统一关闭延迟保留的 GMC 环境和当前 Ads 环境。

      • 修复 Ads 最终发布步骤:

      原 v87 调用了不存在的 self.click_btn(),导致 Publish/Done/Finish 一直失败。

      v88 新增 click_btn() 兼容 wrapper,并重写 finish_remaining_steps() 使用 js_click_best()。

      • 最终完成标准:

      不以“创建完成提示”为准,只等待 URL 自动跳到 /aw/overview。

      如果没有 Publish 按钮,也不会立即失败,会继续等待 /aw/overview。

      • 修复 GMC 保留逻辑:

      GMC 预处理完成后,不再 self.stop_hub_env(self.current_env_id)。

      只断开 GMC 浏览器连接,保留 HubStudio 窗口。

      • 修复 GMC 延迟关闭:

      close_gmc_env_later_if_needed() 现在调用项目真实存在的 stop_hub_env(gmc_env_id)。
      • Ads 发布完成判断再次调整:

      不再等待 /aw/overview。

      点击 Publish campaign 后,只要进入下一个页面/状态就算当前广告完成:

      currentStep=summary-section

      /productgroups
      /overview

      或 URL 发生变化并仍在 campaigns/new/shopping 后续状态

      • 成功后等待 5 秒,继续创建下一个广告。

      • Average daily budget 增加二次校验:

      填写后读取 input value,不对就重新填写一次。

      • Campaign name 改成选完 GMC ID 后同一页面强制随机填写。

      • 目标输入框:

      input[aria-label=&#x27;Campaign name&#x27;]
      • 每个广告都会生成新名称:

      Shopping-Auto-High-随机数字

      Shopping-Auto-Normal-随机数字

      • 填写后会读取 input value 二次校验,不成功则 JS 兜底填写。

      • 修复 v90 报错:

      cannot access local variable &#x27;campaign_name&#x27; where it is not associated with a value
      • create_one_shopping_campaign() 已重写:

      不再在 step() 闭包内读取并重新赋值外层 campaign_name。

      • Campaign name 填写逻辑强化:

      只填 input[aria-label=&#x27;Campaign name&#x27;]

      支持 aria-invalid=&#x27;true&#x27; 的输入框

      每次重试都会生成新的随机名称

      JS 填写 + Playwright 兜底 + input value 二次校验

      • 随机名称格式:

      Shopping-Auto-High-随机数字

      Shopping-Auto-Normal-随机数字

      隐藏内容需要付费才可以看见

      马上购买

      请登录之后再进行评论

      登录
    • 帖子间隔 侧栏位置: