From 8edb287a9c62a51336ffc746187c4f2f2685be2e Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 17 Aug 2026 22:11:35 +0000 Subject: [PATCH] =?UTF-8?q?parte=20de=20indexaci=C3=B3n=20por=20Telegram,?= =?UTF-8?q?=20temporal=20y=20con=20caducidad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seguimiento del arreglo del 2026-08-17: comprueba cada mañana (07:00 UTC) si los seis del EN y el ES del día han entrado en el índice, y lo cuenta por Telegram. El marcador semanal no mide esto —mide impresiones, y un post que Google no conoce no tiene impresiones que medir. Se apaga solo pasado el 2026-08-24. Co-Authored-By: Claude Opus 5 --- indexacion-parte.service | 18 ++++++ indexacion-parte.timer | 14 +++++ indexacion_parte.py | 121 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 indexacion-parte.service create mode 100644 indexacion-parte.timer create mode 100644 indexacion_parte.py diff --git a/indexacion-parte.service b/indexacion-parte.service new file mode 100644 index 0000000..ea32812 --- /dev/null +++ b/indexacion-parte.service @@ -0,0 +1,18 @@ +[Unit] +Description=Parte de indexación por Telegram — seguimiento del arreglo del 2026-08-17 +Documentation=file:///home/chemavx/seo-tools/indexacion_parte.py +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +User=chemavx +WorkingDirectory=/home/chemavx/seo-tools +Environment=HOME=/home/chemavx +Environment=KUBECONFIG=/home/chemavx/.kube/config +Environment=PATH=/home/chemavx/.local/bin:/home/chemavx/.nvm/versions/node/v24.14.1/bin:/usr/local/bin:/usr/bin:/bin +ExecStart=/usr/bin/python3 /home/chemavx/seo-tools/indexacion_parte.py +TimeoutStartSec=600 + +[Install] +WantedBy=multi-user.target diff --git a/indexacion-parte.timer b/indexacion-parte.timer new file mode 100644 index 0000000..39abd78 --- /dev/null +++ b/indexacion-parte.timer @@ -0,0 +1,14 @@ +[Unit] +Description=Parte de indexación, 07:00 UTC (09:00 en España) + +[Timer] +# Temporal y con caducidad puesta: el script deja de avisar solo pasado el +# 2026-08-24. Sigue informando cada mañana mientras quede algún artículo sin +# indexar, porque Google sirve las solicitudes por tandas y un solo disparo +# habría cazado una foto a medias. +OnCalendar=*-*-* 07:00:00 UTC +Persistent=true +RandomizedDelaySec=120 + +[Install] +WantedBy=timers.target diff --git a/indexacion_parte.py b/indexacion_parte.py new file mode 100644 index 0000000..a9a568f --- /dev/null +++ b/indexacion_parte.py @@ -0,0 +1,121 @@ +#!/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())