[object Object]

← back to Ga Allsites

grant script: --all-fleet mode (proven — took GSC coverage 10->180)

7f573059e6950720f14f395e60195d7ae235e0ad · 2026-08-17 10:56:16 -0700 · Steve Abrams

Files touched

Diff

commit 7f573059e6950720f14f395e60195d7ae235e0ad
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 17 10:56:16 2026 -0700

    grant script: --all-fleet mode (proven — took GSC coverage 10->180)
---
 grant_microsites_gsc.py | 67 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 58 insertions(+), 9 deletions(-)

diff --git a/grant_microsites_gsc.py b/grant_microsites_gsc.py
index fdadf0a..9d2d987 100644
--- a/grant_microsites_gsc.py
+++ b/grant_microsites_gsc.py
@@ -180,7 +180,16 @@ def grant(domain: str, gtoken: str, cftok: str, gd) -> str:
 
 def main():
     args = sys.argv[1:]
-    if "--all" in args:
+    if "--all-fleet" in args:
+        # every GA4 property in the cache -> its guessed apex domain
+        rows = json.loads((pathlib.Path(__file__).parent / "cache" / "data.json"
+                           ).read_text())["rows"]
+
+        def _sl(n):
+            x = n.lower().replace(" - ga4", "").replace("&", "and")
+            return "".join(c for c in x if c.isalnum())
+        targets = sorted({_sl(r["property"]) + ".com" for r in rows if _sl(r["property"])})
+    elif "--all" in args:
         targets = RECOMMENDED
     elif "--site" in args:
         targets = [args[args.index("--site") + 1]]
@@ -193,23 +202,63 @@ def main():
     gtoken = creds.token
     cftok = cf_token()
     gd = godaddy_creds()
+    # skip domains the SA can already query
+    try:
+        req = urllib.request.Request(
+            "https://searchconsole.googleapis.com/webmasters/v3/sites",
+            headers={"Authorization": f"Bearer {gtoken}"})
+        have = {s["siteUrl"].replace("sc-domain:", "")
+                for s in json.loads(urllib.request.urlopen(req, timeout=30).read()
+                                    ).get("siteEntry", [])
+                if s.get("permissionLevel") != "siteUnverifiedUser"}
+    except Exception:  # noqa: BLE001
+        have = set()
+    skipped_have = [d for d in targets if d in have]
+    targets = [d for d in targets if d not in have]
     print(f"SA: {json.loads(KEY.read_text()).get('client_email')}")
     print(f"GoDaddy API: {'available' if gd[0] else 'NOT configured'}")
-    print(f"Granting {len(targets)} domain(s): {', '.join(targets)}\n")
+    if skipped_have:
+        print(f"Already granted (skipping {len(skipped_have)}): {', '.join(skipped_have)}")
+    print(f"Granting {len(targets)} domain(s)\n")
 
-    results = {}
-    for d in targets:
+    def _do(d):
         try:
-            results[d] = grant(d, gtoken, cftok, gd)
+            return grant(d, gtoken, cftok, gd)
         except urllib.error.HTTPError as e:
-            results[d] = f"ERROR {e.code}: {e.read().decode()[:160]}"
+            return f"ERROR {e.code}: {e.read().decode()[:120]}"
         except Exception as e:  # noqa: BLE001
-            results[d] = f"ERROR: {e}"
+            return f"ERROR: {e}"
+
+    results = {}
+    for d in targets:
+        results[d] = _do(d)
         print()
 
+    # pass 2: retry domains whose TXT was written but hadn't propagated in time
+    retry = [d for d, r in results.items() if "VERIFY FAILED" in str(r)]
+    if retry:
+        print(f"--- pass 2: retrying {len(retry)} propagation-pending domain(s) ---")
+        time.sleep(25)
+        for d in retry:
+            results[d] = _do(d)
+            print()
+
+    granted = [d for d, r in results.items() if str(r).startswith("GRANTED")]
+    nohost = [d for d, r in results.items() if "SKIP" in str(r)]
+    failed = {d: r for d, r in results.items()
+              if not str(r).startswith("GRANTED") and "SKIP" not in str(r)}
     print("=== SUMMARY ===")
-    for d, r in results.items():
-        print(f"  {d:32} {r}")
+    print(f"  GRANTED       : {len(granted)}")
+    print(f"  no DNS host   : {len(nohost)}  (domain not on our Cloudflare/GoDaddy)")
+    print(f"  failed/other  : {len(failed)}")
+    if granted:
+        print("\n  newly granted:")
+        for d in sorted(granted):
+            print(f"    ✓ {d}")
+    if failed:
+        print("\n  failed (verify/token/other — likely wrong domain guess or foreign DNS):")
+        for d, r in sorted(failed.items()):
+            print(f"    ✗ {d:32} {str(r)[:80]}")
     print("\nNext: cd ~/Projects/ga-allsites && /opt/homebrew/bin/python3 etl.py")
     print("then check keywords.json gsc_site_count climbs (data lags ~2 days).")
 

← a648e3c grant script: add GoDaddy DNS support (append TXT via API) s  ·  back to Ga Allsites  ·  auto-data-snapshot: 2026-08-17T10:56:53 (1 data files) — cac 9561e03 →