parte de indexación por Telegram, temporal y con caducidad

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 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-08-17 22:11:35 +00:00
parent 70e5dc667f
commit 8edb287a9c
3 changed files with 153 additions and 0 deletions
+121
View File
@@ -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())