estado: comparar twitter:site contra el handle real, no contra @ghost

El chequeo tenía una lista negra de un solo elemento (el default de Ghost)
y por eso se le colaba el caso peor: el sitio ES apuntaba a
@ZonaDeExclusion, un handle que no existe. Un handle ajeno o abandonado es
más grave que el default, porque cualquiera puede reclamarlo y quedarse con
la atribución de las tarjetas de X.

Hay UNA sola cuenta para los dos blogs (@ExclusionZoneEN), así que se
declara como constante y se compara contra ella. También avisa si el meta
desaparece del todo: vaciar el ajuste en Ghost lo quita, y el silencio no
es lo mismo que estar bien.

Cuatro tests, y verificado que el chequeo se ve fallar con el handle
esperado falseado — no es una comparación vacua.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
ChemaVX
2026-07-30 08:57:54 +00:00
co-authored by Claude Opus 5
parent 67b55454c8
commit d2882c0fdd
2 changed files with 61 additions and 3 deletions
+16 -3
View File
@@ -53,6 +53,10 @@ SITES = {
}
AQUI = os.path.dirname(os.path.abspath(__file__))
ROBOTS_SNAP = os.path.join(AQUI, "robots-esperado.json")
# Hay UNA sola cuenta de X para los dos blogs, y es la inglesa (confirmado por
# Jose el 2026-07-30). El autopost del RSS inglés y el CLI `ze` tiran de ella.
HANDLE_X = "@ExclusionZoneEN"
UA = "seo-estado/1.0 (+https://chemavx.xyz)"
TIMEOUT = 25
@@ -221,10 +225,19 @@ def check_head(site, cfg, posts):
out.append("SCHEMA DUPLICADO: " + " + ".join(
f"{t}«{hd}»" for t, hd in arts) + " — Google elige cuál usa")
# Comparar contra el handle REAL, no contra la lista de valores malos que se
# nos ocurran. Este chequeo solo miraba el default de Ghost (@ghost), y por
# eso se le pasó lo peor de los dos: el ES apuntaba a @ZonaDeExclusion, un
# handle que no existe. Un handle ajeno o abandonado es más grave que el
# default, porque cualquiera puede reclamarlo y quedarse con la atribución
# de las tarjetas. Solo hay UNA cuenta de X para los dos blogs.
tw = re.findall(r'name="twitter:site" content="([^"]*)"', h)
if tw and tw[0].lower() in ("@ghost", "ghost"):
out.append(f"twitter:site sigue en el default de Ghost ({tw[0]}): "
"atribuye las tarjetas a la cuenta de Ghost")
if not tw:
out.append("no hay twitter:site: las tarjetas de X salen sin atribuir")
elif tw[0].lower() != HANDLE_X.lower():
que = (" (el default de Ghost, atribuye las tarjetas a la cuenta de Ghost)"
if tw[0].lower() in ("@ghost", "ghost") else "")
out.append(f"twitter:site es {tw[0]}{que} y debería ser {HANDLE_X}")
pub_fb = re.findall(r'property="article:publisher" content="([^"]*)"', h)
if pub_fb and "facebook.com/ghost" in pub_fb[0]:
out.append("article:publisher sigue en el default de Ghost "