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
中文字段说明
| 字段 | 说明 |
|---|---|
| 环境名称 | 仅用于日志显示 |
| 环境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 |
| 运行状态 | 脚本回写 |
| 运行信息 | 脚本回写 |
| 账号检查状态 | 脚本回写 |
| 第一组广告状态 | 脚本回写 |
| 第二组广告状态 | 脚本回写 |
| 截图路径 | 脚本回写 |
| 更新时间 | 脚本回写 |
运行注意事项
-
HubStudio必须正在运行。
-
对应HubStudio环境里必须已经登录Google Ads。
-
GMC必须能在广告创建流程里选择,或出现 Review link request 并可批准。
-
如果Google页面文案或结构变化,脚本可能卡住;看 runtime/screenshots 里的失败截图补selector。
-
建议先 –thread 1 跑一条,稳定后再并发。
基础更新说明
-
如果 Add products to this campaign 页面已经显示表格里的 GMC ID,例如 5777859064 – 店铺名,脚本会直接跳过 GMC 选择,继续填写广告系列名称并进入下一步。
版本更新记录
点击版本标题展开/收起
-
严格核对 GMC ID:页面已选 GMC ID 必须和表格【GMC ID】一致,否则停止并截图,防止投错 GMC。
-
修复 Next 隐藏按钮问题:只点击可见、可用的 Next/Continue 按钮。
-
多线程改为队列模式:–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选择支持三种状态:
-
已经绑定/已选中:核对表格GMC ID,一致则继续;
-
没有绑定/为空:按表格GMC ID输入并选择;
-
已选中但和表格不一致:尝试清空后重新选择表格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 后会等待:
-
搜索结果区域停止 loading/spinner;
-
包含 GMC ID 的候选项真正可见可点击;
-
再点击选择。
-
不再过早按 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 账号选择只保留两处:
-
第一步 policy/account 账号检查页;
-
最后 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:
-
点击账号;
-
等待;
-
重新打开 billing/summary URL;
-
再等待 Balance / Billing / Payments 页面;
-
最后截图。
-
发布广告后不再只靠等待判断成功。
-
每创建完一个 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 环境会按顺序执行:
-
GMC 配送 Shipping services 检查/创建;
-
GMC Marketing methods 关闭 Free listings;
-
如果填写了 Feed文件路径,则创建 Primary Feed 并上传;
-
进入 GMC linkedaccounts/integrations,选择 Google Ads,绑定表格里的 Google Ads客户ID;
-
再进入 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登录邮箱。
-
执行顺序改为:
-
如果启用GMC预处理:打开 GMC环境ID 对应环境,执行 Shipping / Free listings / Feed / GMC绑定AdsID;
-
关闭 GMC 环境;
-
打开 Ads环境ID 对应环境,检查 Ads政策页并创建4个 Shopping广告;
-
完成后关闭 Ads 环境。
-
兼容旧表:
如果不填 GMC环境ID / Ads环境ID,会继续使用旧的 环境ID。
-
账号选择:
GMC阶段优先使用 GMC登录邮箱;
Ads阶段优先使用 Ads登录邮箱;
为空时仍点击第一个已登录账号。
-
按你指定的新顺序执行:
-
先打开 Ads环境ID,提取/确认 Google Ads客户ID;
-
关闭 Ads 环境;
-
打开 GMC环境ID;
-
在 GMC 账号里先绑定对应 Ads ID;
-
再执行 Shipping;
-
再关闭 Free listings;
-
再上传 Feed;
-
Feed 必须等自动跳转到 https://merchants.google.com/mc/products/sources/detail 页面,才算上传完成并关闭 GMC 环境;
-
重新打开 Ads环境ID;
-
执行 policy/account 检查、创建4个Shopping广告、billing截图;
-
关闭 Ads 环境。
-
Feed 文件按 50-150MB 处理,等待上传完成默认最多 1200 秒。
-
新增状态字段:
AdsID提取状态。
-
调整 Ads/GMC 环境切换逻辑:
-
先打开 Ads环境ID,提取/确认 Ads ID;
-
不关闭 Ads 环境,只断开脚本连接,Ads窗口放着;
-
打开 GMC环境ID,执行绑定 Ads ID / Shipping / Free listings / Feed上传;
-
Feed 自动跳到 products/sources/detail 后,关闭 GMC 环境;
-
回到之前保留的 Ads环境ID;
-
执行 policy/account、创建4个 Shopping广告、billing截图;
-
最后关闭 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: 'ShoppingAdsRunner' object has no attribute 'body_text'
AttributeError: 'ShoppingAdsRunner' object has no attribute 'safe_goto'
-
补回基础方法:
body_text()
safe_goto()
wait_ready()
-
Ads ID 提取优化:
如果打开的URL包含 ?ocid=6417452262,会直接提取为 641-745-2262,不再必须等页面DOM。
-
修复 v53 报错:
AttributeError: 'ShoppingAdsRunner' object has no attribute 'wait_page_or_reload'
-
补回 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>
-
提取优先级:
-
account-ids .account-info 的 title;
-
account-ids .account-info 的文本;
-
当前URL里的 ocid;
-
打开URL里的 ocid;
-
表格已有 Google Ads客户ID。
-
如果表格ID和页面 account-info ID不一致,会记录日志,并以页面 account-info 为准。
-
修复 v55 报错:
AttributeError: 'ShoppingAdsRunner' object has no attribute 'should_run_gmc_pre_setup'
-
这次对 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 的流程。
-
新流程:
-
选择 Upload a file from your computer;
-
点击 Continue;
-
如果弹出 Enter feed label;
-
自动填写随机 Feed label,例如 FL-A1B2C3D4E5;
-
点击 Save;
-
再点击 Upload / Choose file;
-
选择表格 Feed文件路径;
-
等待自动跳到 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 'required_text'
-
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='Feed label']
div[role='dialog']:has-text('Enter feed label')
-
自动填写随机 Feed label。
-
Save 点击增强:
普通 click → JS click → 鼠标中心点 click → dialog 内 JS 查找 Save 兜底。
-
Save 后再进入 Upload / Choose file 上传文件流程。
-
修复 Feed label Save 后没有真正上传 Feed 文件的问题。
-
文件上传改为强制确认:
-
等待上传区域出现;
-
优先 input[type=file].set_input_files;
-
如果没有 input[type=file],点击 Upload / Select file / Choose file 触发 file chooser;
-
设置文件后确认页面出现文件名或 input.files.length > 0;
-
再点击 Upload / Continue;
-
等待 /products/sources/detail 或 Source details。
-
日志会输出 input[type=file] 数量和是否设置成功,方便判断文件是否真的上传。
-
修正 GMC createPrimaryFeed 真实顺序。
-
新顺序:
-
选择 Upload a file from your computer;
-
先上传表格里的 CSV Feed 文件;
-
点击 Continue;
-
弹出 Enter feed label;
-
填写随机数字 Feed label,例如 FL1234567890;
-
点击 Save;
-
再点击后续 Continue / Upload;
-
等待 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='Feed label']。
-
强制写入随机 Feed label,并触发 input/change/keyup/keydown 事件。
-
Save 也优先用 JS 在 dialog 内找文本为 Save 的按钮点击。
-
Save 后最后点击页面上的 button[debugid='continueButton'],再等待 Source details / Your products are updated。
-
按上传的 GMC 独立脚本思路修复 Feed 上传顺序:
set_input_files 后先等文件识别/上传状态完成,再点击 Continue。
-
修复日志中:
未检测到 Enter feed label 弹窗
Feed label保存后未找到最终 Continue/Upload
等待GMC Feed上传完成一直等
-
新流程:
-
Upload a file from your computer;
-
选择 CSV 文件;
-
等待文件名/.csv/进度条结束;
-
点击 Continue;
-
如弹 Enter feed label,填写随机 Feed label 并 Save;
-
Save 后点击最终 Continue;
-
等待 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 'bool' is not a container or iterable
-
原因:extract_visible_gmc_ids() 被旧版本兜底方法返回 False。
-
现在 extract_visible_gmc_ids() 返回 list[str]。
-
新增 choose_gmc_id_from_picker():
-
读取表格 GMC ID;
-
等待 Select a Merchant Center account 区域稳定;
-
如果页面已显示目标GMC ID,直接使用;
-
否则在 Select account 搜索框输入GMC ID;
-
点击包含该GMC ID的候选行;
-
如果候选显示 no products,直接标记 GMC没产品并停止当前任务。
-
如果页面显示 Merchant Center account link requests pending,会尝试点击 View/Review。
-
修复 Feed 文件 Continue 后顺序不对导致卡住的问题。
-
新顺序:
-
等待Feed文件被页面识别/上传完成;
-
点击 Continue;
-
立刻等待 Enter feed label 弹窗;
-
Feed label 弹窗最多只等 25 秒,不再卡 120 秒;
-
如果没弹 Feed label,立即检测 Source details / Your products are updated;
-
如果已成功,等 6 秒并关闭 GMC 环境;
-
如果还没成功,再进入原来的上传完成等待。
-
修正 Feed 文件识别后 Continue / Feed label 的日志和执行顺序。
-
新顺序:
-
等待Feed文件被页面识别/上传完成;
-
Feed文件已被页面识别,且没有进度条,继续;
-
准备等待 Enter feed label 弹窗;
-
点击 Continue 进入 Feed label 步骤;
-
Continue 点击成功后立即检测 Feed label;
-
填写并保存 Feed label;
-
后面再等页面稳定 / Source details / Your products are updated。
-
不再出现“先等页面稳定,再等 Feed label”的顺序。
-
明确 Feed label 保存后的 Continue 是最后一步。
-
Feed 上传流程固定为:
-
选择 CSV Feed 文件;
-
等待文件被页面识别;
-
点击 Continue 打开 Enter feed label;
-
填写 Feed label;
-
点击 Save;
-
点击最后一步 Continue;
-
最后一步 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 'timeout'
-
新流程:
-
打开 https://ads.google.com/aw/campaigns/new;
-
点击 Website traffic;
-
点击 Shopping;
-
在 Select account 搜索表格 GMC ID 并选择;
-
填写随机 Campaign name;
-
点击 Continue;
-
填写表格预算;
-
勾选 Set a maximum cost per click bid limit;
-
填写 CPC;
-
第1个广告选择 High,后3个保持默认 Low;
-
Next;
-
Enter another location,输入表格投放国家并确认 Locations 表格;
-
Next;
-
Next;
-
Publish;
-
等待自动跳到 /productgroups,等2秒继续下一个广告。
-
修复 GMC Feed label 弹窗打开方式。
-
Feed label 不是点击 Continue 弹出,而是点击 Feed 文件/label 区域的 edit 图标弹出。
-
新流程:
-
选择 CSV Feed 文件;
-
等待文件被页面识别;
-
点击 material-icon / i.material-icons-extended 文本为 edit 的图标;
-
弹出 Enter feed label;
-
填写随机 Feed label;
-
点击 Save;
-
最后点击 Continue;
-
等待 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 上传顺序:
-
进入 createPrimaryFeed;
-
选择 Upload a file from your computer;
-
上传 CSV Feed 文件;
-
等待文件名出现 / 文件被页面识别;
-
不是点击 Continue,而是先点击 edit 图标;
-
弹出 Enter feed label;
-
输入随机数字 Feed label;
-
点击 Save;
-
最后一步才点击 button[debugid='continueButton'] Continue;
-
等待 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() 重写:
-
扫描页面所有可见 edit 候选;
-
跳过上下文包含 Select countries / countries / country / language / destination 的 edit;
-
优先点击上下文包含 feed label / file / .csv / products / Ads campaign / uploaded 的 edit;
-
每点一个 edit 后立即检测是否弹出 Enter feed label;
-
只有真正弹出 Enter feed label 才算成功,否则继续尝试下一个 edit。
-
最后一步仍然是 Save 后点击 button[debugid='continueButton'] Continue。
-
恢复用户之前正常的 Feed 上传流程,不再强制点击 edit 图标。
-
新流程:
-
打开 createPrimaryFeed;
-
选择 Upload a file from your computer;
-
上传 CSV Feed 文件;
-
等待文件名 / .csv / 进度条结束;
-
点击 Continue;
-
等待页面 ready 约 3 秒;
-
如果弹出 Enter feed label,则填写随机标签并 Save;
-
如 Save 后还有 Continue,则点击;
-
等待 Source details / Your products are updated。
-
修复:
上传文件后未找到正确的 Feed label edit 图标
-
修复 v76 错误:上传完成后马上点 Continue。
-
现在 Continue 是最后一步。
-
新流程:
-
选择 Upload a file from your computer;
-
上传 CSV Feed 文件;
-
等待文件名 / .csv / 进度条结束;
-
先点击 Feed label 的修改 / edit 入口;
-
把旧 Feed label 改成新的随机数字;
-
Save;
-
最后才点击 Continue;
-
等待 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 'timeout'
-
v28 Ads 流程用于 Merchant Center account 选择、预算/CPC、High/Low、位置、发布等步骤。
-
修复 Feed label 修改按钮点错的问题。
-
页面真实结构:
feed-label-editor button[debugid='editFeedLabel']
-
现在修改 Feed label 时固定优先点击:
feed-label-editor button[debugid='editFeedLabel']
feed-label-editor button[icon='edit']
feed-label-editor button
-
不再扫描所有 edit,不会点到:
countries-selector button[debugid='multi-countries-select']
Select countries / countries
language-selector
destinations-editor
-
上传 Feed 文件后:
-
先点击 feed-label-editor 的 edit;
-
修改旧 Feed label 为随机数字;
-
Save;
-
最后才点击 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 上传流程恢复为完整脚本逻辑:
-
打开 createPrimaryFeed;
-
选择 Upload a file from your computer;
-
set_input_files 上传文件;
-
gmc_wait_upload_finished_v80() 等 .csv / uploaded / progress结束;
-
点击 Continue;
-
等待页面 ready;
-
再等待 Source details / Your products are updated。
-
Ads 创建逻辑继续保留 v78 的 v28 投放脚本逻辑。
-
在 v80 完整 GMC 脚本逻辑基础上补充 Feed label 修改步骤。
-
Feed 上传完成后不直接点击 Continue。
-
新顺序:
-
选择 Upload a file from your computer;
-
上传 CSV Feed 文件;
-
等待上传完成;
-
点击 feed-label-editor button[debugid='editFeedLabel'];
-
弹出 Enter feed label;
-
填写随机 FEED_数字;
-
点击 Save;
-
最后才点击 Continue;
-
等待 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 'timeout'
-
原因:
合并包里同时存在两个 wait_gmc_area_settled:
-
v28 正常版:wait_gmc_area_settled(self, gmc_id, timeout=90)
-
后续误加版:wait_gmc_area_settled(self, timeout=90)
Python 后定义覆盖前定义,所以 Ads 侧传 gmc_id + timeout 时崩溃。
-
处理:
-
删除当前包里的 Ads 同名函数;
-
从用户上传的 v28 Ads 脚本重新搬入整组 Ads 方法;
-
把 v28 的 wait_gmc_area_settled 改成 _wait_gmc_area_settled_v28_impl;
-
新增兼容 wrapper:wait_gmc_area_settled(self, *args, timeout=90, **kwargs);
-
保留 v81 的 GMC / Feed 修复。
-
Ads 侧仍按 v28 流程跑;GMC 侧按 v81 流程跑。
-
修复 Ads 位置页面国家输入填错到顶部搜索框的问题。
-
select_location_us() 改为只填写:
input[aria-label='Enter a location to include or exclude']
或 label-text 为 Enter a location to include or exclude 附近的 input。
-
不再使用泛泛的 input[role='combobox'] 作为首选。
-
输入国家后,只从 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='combobox'] 作为国家输入框。
-
继续保留 v84 的 Campaign priority High 修复。
-
修改整体执行顺序:
GMC Feed 上传完成并跳到 Source details 后,不立即关闭 GMC 环境。
-
新流程:
-
打开 Ads 环境提取/确认 Ads ID;
-
打开 GMC 环境执行绑定/Shipping/Free listings/Feed 上传;
-
Feed 上传完成后,GMC 环境保持打开;
-
切回 Ads 环境执行 policy/account、创建4个Shopping广告、billing截图;
-
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='Campaign name']
-
每个广告都会生成新名称:
Shopping-Auto-High-随机数字
Shopping-Auto-Normal-随机数字
-
填写后会读取 input value 二次校验,不成功则 JS 兜底填写。
-
修复 v90 报错:
cannot access local variable 'campaign_name' where it is not associated with a value
-
create_one_shopping_campaign() 已重写:
不再在 step() 闭包内读取并重新赋值外层 campaign_name。
-
Campaign name 填写逻辑强化:
只填 input[aria-label='Campaign name']
支持 aria-invalid='true' 的输入框
每次重试都会生成新的随机名称
JS 填写 + Playwright 兜底 + input value 二次校验
-
随机名称格式:
Shopping-Auto-High-随机数字
Shopping-Auto-Normal-随机数字
隐藏内容需要付费才可以看见







