#!/usr/bin/env python3
"""Confere canonical, hreflang e de todas as URLs do sitemap.
python3 scripts/verifica-seo.py http://127.0.0.1:3998
Regras: o canonical é a própria URL; o conjunto de hreflang da página é o mesmo
do sitemap; há x-default quando existe mais de um idioma; o livro (só em pt)
não aponta para outros idiomas. Cada falha é impressa e o script sai com 1.
"""
import re
import sys
import urllib.request
from urllib.parse import urlparse
base = sys.argv[1].rstrip("/")
LANG = {"pt": "pt-BR", "en": "en", "es": "es-419", "fr": "fr", "de": "de", "zh-CN": "zh-CN"}
def get(url):
req = urllib.request.Request(url, headers={"User-Agent": "ESPDocs-SmokeTest/1.0"})
return urllib.request.urlopen(req, timeout=15).read().decode("utf-8")
def caminho(u):
return urlparse(u).path or "/"
sitemap = get(base + "/sitemap.xml")
falhas = 0
total = 0
for bloco in re.findall(r"(.*?)", sitemap, re.S):
loc = caminho(re.search(r"([^<]+)", bloco).group(1))
esperado = {
h: caminho(u)
for h, u in re.findall(r'")[0]
idioma = loc.strip("/").split("/")[0]
m = re.search(r']*\blang="([^"]+)"', html)
if not m or m.group(1) != LANG.get(idioma):
print(f"FALHOU {loc}: é {m and m.group(1)}, esperado {LANG.get(idioma)}")
falhas += 1
canon = re.search(r' 1 and sem_default_pagina != sem_default_sitemap:
print(f"FALHOU {loc}: hreflang da página difere do sitemap")
falhas += 1
if len(sem_default_sitemap) > 1 and "x-default" not in na_pagina:
print(f"FALHOU {loc}: sem x-default")
falhas += 1
if len(sem_default_sitemap) <= 1 and len(sem_default_pagina) > 1:
print(f"FALHOU {loc}: página de um idioma só com hreflang para outros: {sorted(sem_default_pagina)}")
falhas += 1
if falhas == 0:
print(f" ✔ SEO: canonical, hreflang e lang corretos em {total} URLs do sitemap.")
sys.exit(1 if falhas else 0)