#!/usr/bin/env python3 """Parte de indexación por Telegram — seguimiento del arreglo del 2026-08-17. De un solo uso, con fecha de caducidad puesta. El 2026-08-17 se descubrió que seis artículos del blog EN llevaban hasta dos semanas publicados sin que Google los hubiera rastreado siquiera («URL is unknown to Google»); ver ~/.claude/…/memory/feedback_indexacion_se_comprueba_no_se_deduce.md. Esa noche se pidió indexación a mano de los seis y se reenviaron los sitemaps. Este script comprueba a la mañana siguiente si han entrado y lo cuenta por Telegram, porque el marcador semanal NO mide esto: mide impresiones, y un post que Google no conoce no tiene impresiones que medir. Se apaga solo: pasada FIN deja de avisar (ver `caducado`). Para quitarlo del todo: systemctl disable --now indexacion-parte.timer """ import datetime as dt import sys sys.path.insert(0, "/home/chemavx/seo-tools") import seo_gsc as G # noqa: E402 (telegram/token/credencial ya resueltos ahí) import requests # noqa: E402 # Los seis del arreglo, en el orden en que se publicaron. EN = [ ("the-wilson-davis-memo-inside-a-pentagon-officials-blocked-access-to-" "americas-ufo-reverse-engineering-program", "wilson-davis"), ("hundreds-watched-in-broad-daylight-the-westall-ufo-mystery-that-" "australia-still-cant-explain", "westall"), ("pursue-release-5-2026-1948-memo-redacted-uap-videos", "release-5"), ("uap-nuclear-bases-six-decades-incursions", "uap-nuclear-bases"), ("project-blue-book-declassified-ufo-files", "blue-book"), ("the-mj-12-documents-a-forty-year-forgery-mystery", "mj-12"), ("shag-harbour-1967-canada-government-documented-ufo-crash", "shag-harbour"), ] ES = [("teheran-1976-cazas-f-4-ovni", "teheran")] # A partir de aquí el seguimiento deja de tener sentido: o entraron, o el # problema es otro y toca mirarlo a mano, no seguir mandando partes. FIN = dt.date(2026, 8, 24) def estado(tok, site, slug): """Veredicto de Google, no deducción nuestra. Devuelve (icono, texto).""" base = ("https://www.theexclusionzone.com/" if site == "en" else "https://zonadeexclusion.com/") r = requests.post( "https://searchconsole.googleapis.com/v1/urlInspection/index:inspect", headers={"Authorization": f"Bearer {tok}"}, timeout=60, json={"inspectionUrl": f"{base}{slug}/", "siteUrl": G.SITIOS[site]["propiedad"]}) if r.status_code != 200: return "❓", f"error {r.status_code}" i = r.json()["inspectionResult"]["indexStatusResult"] cob = i.get("coverageState", "?") if i.get("verdict") == "PASS": return "✅", "indexado" if cob.startswith("Crawled"): return "🟡", "rastreado, sin indexar" if cob.startswith("Discovered"): return "🔵", "descubierto, sin rastrear" return "⏳", "Google no lo conoce" def sitemaps(tok, site): import urllib.parse as up prop = G.SITIOS[site]["propiedad"] r = requests.get( "https://searchconsole.googleapis.com/webmasters/v3/sites/" f"{up.quote(prop, safe='')}/sitemaps", headers={"Authorization": f"Bearer {tok}"}, timeout=30) if r.status_code != 200: return [] return [(s["path"].rsplit("/", 1)[-1], (s.get("lastDownloaded") or "—")[:10]) for s in r.json().get("sitemap", [])] def main(): hoy = dt.date.today() if hoy > FIN: print(f"caducado ({FIN}); no se manda parte") return 0 tok = G.token(G.carga_credencial()) L = [f"🔎 Indexación — parte del {hoy:%d/%m}", ""] pendientes = [] for site, lista, cab in (("en", EN, "INGLÉS"), ("es", ES, "ESPAÑOL")): L.append(f"── {cab}") ok = 0 for slug, corto in lista: ic, txt = estado(tok, site, slug) if ic == "✅": ok += 1 else: pendientes.append(corto) L.append(f" {ic} {corto} — {txt}") L.append(f" {ok} de {len(lista)} indexados") L.append("") L.append("── SITEMAPS (última lectura de Google)") for site, cab in (("en", "EN"), ("es", "ES")): for nombre, fecha in sitemaps(tok, site): L.append(f" {cab} {nombre}: {fecha}") L.append("") if pendientes: L.append("Si alguno lleva más de 48 h sin moverse, vuelve a pedirle " "indexación en Search Console — el límite diario da de sobra.") else: L.append("Todo dentro. Nada que hacer, y este parte ya no hace falta:") L.append("systemctl disable --now indexacion-parte.timer") texto = "\n".join(L) print(texto) return 0 if G.telegram(texto) else 1 if __name__ == "__main__": sys.exit(main())