google.com/goto : lire Location avec HEAD
Google Search n’écrit plus toujours l’URL finale dans le href du résultat. Les résultats organiques pointent vers https://www.google.com/goto?url=CAES…. Ce n’est pas l’ancien google.com/url?q=… : le paramètre n’est pas une URL encodée. On ne le décode pas.
Google doit quand même connaître la destination. Il la pose dans l’en-tête HTTP Location quand on interroge /goto. C’est cette lecture qu’on utilise.
Exemples curl, Python et Node : github.com/automdev/google-goto-url-fix. Chez Autom, l’API Google Search applique ce hop côté serveur.
Le déploiement et le pourquoi : google.com/goto : l'anti-scraping de Google.
Une phrase
Ne pas suivre la redirection. Lire Location.
GET /goto?url=CAES… HTTP/1.1
Host: www.google.com
HTTP/1.1 302 Found
Location: https://www.linkedin.com/in/satyanadella
HEAD demande uniquement les en-têtes. GET avec redirect: "manual" (ou allow_redirects=False) fait la même lecture. Google renvoie parfois un 402 (ou un autre statut) avec un Location : on lit l’en-tête même si ce n’est pas un 3xx.
curl
curl -sI --max-redirs 0 \
-H 'Referer: https://www.google.com/search' \
'https://www.google.com/goto?url=CAES...' \
| grep -i '^location:'
-I = HEAD. Sans -L, curl ne suit pas. La ligne Location: est l’URL réelle.
Même lecture en GET :
curl -sD - -o /dev/null --max-redirs 0 \
-H 'Referer: https://www.google.com/search' \
'https://www.google.com/goto?url=CAES...' \
| grep -i '^location:'
Python
import requests
goto = "https://www.google.com/goto?url=CAES..."
r = requests.head(
goto,
allow_redirects=False,
headers={"Referer": "https://www.google.com/search"},
timeout=10,
)
print(r.status_code, r.headers.get("Location"))
Si HEAD est vide, retenter en GET sans suivre :
r = requests.get(goto, allow_redirects=False, timeout=10)
print(r.headers.get("Location"))
Node
const res = await fetch(goto, {
method: "HEAD",
redirect: "manual",
headers: { Referer: "https://www.google.com/search" },
});
console.log(res.status, res.headers.get("location"));
Dans un navigateur, un 3xx en redirect: "manual" peut arriver en opaqueredirect et masquer l’en-tête. En Node, les en-têtes sont visibles.
Pourquoi pas décoder CAES ?
Le blob n’est pas un protobuf d’URL publique. C’est une référence opaque. Seul Google connaît la cible, et il la pose dans Location au moment du hop. Recoller un nom visible ("LinkedIn · Satya Nadella") pour inventer une URL est une mauvaise idée.
Le href est /goto. La page connaît encore l’URL.
Google ne peut pas cacher complètement la destination. Il en a besoin pour dessiner la SERP : le domaine visible, le favicon, le bloc d’attribution. Ces valeurs sont encore sur la page, souvent dans un script de données en bas, et dans un store interne (W_jd) que le JavaScript de la SERP lit.
C’est pour ça que, dans certains navigateurs, les liens « se nettoient » après un mouvement de souris : un script lit W_jd et réécrit chaque href /goto avec l’URL réelle. Ça ne couvre que l’organique sous #rso div[data-rpos] avec un bloc d’attribution. Les AI Overviews restent en /goto. Il faut une page live et ce premier mouvement de souris. Un fetch headless du HTML ne le déclenche pas. Chrome laisse souvent les href /goto en place.
Autre fuite : le lien « Traduire cette page ». Si la langue de l’UI ne correspond pas à celle des résultats, Google ajoute ce contrôle et l’URL propre est souvent dessus. Le latin (Accept-Language: la) apparaît presque à chaque fois, parce que presque aucune page n’est en latin.
Ce sont des explications de ce que la page contient encore. C’est fragile : Google peut renommer W_jd, changer le script, ou retirer le contrôle de traduction. Ça ne donne pas non plus un champ API stable.
La lecture durable reste Location sur /goto. Pas de DOM live, pas d’événement souris, pas de truc de langue.
Chez Autom
L’API Google Search résout déjà /goto et renvoie l’URL finale dans organic_results[].link.
curl -s https://api.autom.dev/v1/google/search \
-H "x-api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"linkedin.com/in satya nadella","gl":"us","hl":"en"}'
Code et README : github.com/automdev/google-goto-url-fix.
Lectures associées
- google.com/goto : l'anti-scraping de Google
- Google a supprimé num=100
- Google poursuit SerpAPI : ce que SearchGuard révèle
1 000 requêtes gratuites sur les tarifs Autom, clé API sur app.autom.dev/register.