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:
@@ -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
|
||||
@@ -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
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user