mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 15:08:16 +02:00
Moteur web integre : passer les murs de consentement
Cookie jar en memoire (les murs posent un cookie puis redirigent), en-tetes DNT et Sec-GPC, et cookies marquant le bandeau comme traite. Les valeurs envoyees signalent un REFUS du pistage, jamais une acceptation : le but est de lire la page, pas d'ouvrir des traceurs au nom de l'utilisateur. Mesure : reuters.com passe de HTTP 401 a 2318 caracteres extraits, aucune regression sur lemonde/lefigaro/20minutes/theguardian/spiegel/wikipedia.
This commit is contained in:
1 parent
3dba323aab
commit
d604398f73
1 file changed
+39
-2
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/cookiejar"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -88,10 +89,14 @@ const (
|
|||||||
goFetchMaxBytes = 8 << 20 // 8 Mo : au-delà ce n'est plus une page à lire
|
goFetchMaxBytes = 8 << 20 // 8 Mo : au-delà ce n'est plus une page à lire
|
||||||
)
|
)
|
||||||
|
|
||||||
// goHTTPClient : client dédié au moteur web. Timeout global et plafond de
|
// goHTTPClient : client dédié au moteur web. Timeout global, plafond de
|
||||||
// redirections. On ne touche pas à http.DefaultClient (utilisé ailleurs).
|
// redirections, et un cookie jar — indispensable pour les sites qui posent un
|
||||||
|
// cookie de session puis redirigent (murs de consentement typiques). Le jar est
|
||||||
|
// en mémoire : il disparaît à l'arrêt du process, on ne persiste rien.
|
||||||
|
// On ne touche pas à http.DefaultClient (utilisé ailleurs).
|
||||||
var goHTTPClient = &http.Client{
|
var goHTTPClient = &http.Client{
|
||||||
Timeout: goFetchTimeout,
|
Timeout: goFetchTimeout,
|
||||||
|
Jar: newCookieJar(),
|
||||||
CheckRedirect: func(req *http.Request, via []*http.Request) error {
|
CheckRedirect: func(req *http.Request, via []*http.Request) error {
|
||||||
if len(via) >= 10 {
|
if len(via) >= 10 {
|
||||||
return fmt.Errorf("trop de redirections")
|
return fmt.Errorf("trop de redirections")
|
||||||
@@ -100,6 +105,32 @@ var goHTTPClient = &http.Client{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newCookieJar() http.CookieJar {
|
||||||
|
j, err := cookiejar.New(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil // un client sans jar reste fonctionnel
|
||||||
|
}
|
||||||
|
return j
|
||||||
|
}
|
||||||
|
|
||||||
|
// consentCookies : cookies qui marquent le bandeau de consentement comme DÉJÀ
|
||||||
|
// TRAITÉ, afin d'atteindre la page derrière le mur.
|
||||||
|
//
|
||||||
|
// ⚠ On signale un REFUS, jamais une acceptation : ces valeurs disent « pas de
|
||||||
|
// suivi, bandeau fermé ». Le but est de lire la page, pas d'ouvrir des traceurs
|
||||||
|
// au nom de l'utilisateur. Les en-têtes DNT et Sec-GPC (refus de vente/partage,
|
||||||
|
// juridiquement reconnu en Californie et respecté par une partie des sites)
|
||||||
|
// vont dans le même sens.
|
||||||
|
//
|
||||||
|
// Envoyés à tout le monde : un cookie inconnu d'un site est simplement ignoré.
|
||||||
|
var consentCookies = []string{
|
||||||
|
"gdpr=0",
|
||||||
|
"gdpr_consent=0",
|
||||||
|
"cookieconsent_status=deny",
|
||||||
|
"OptanonAlertBoxClosed=2024-01-01T00:00:00.000Z",
|
||||||
|
"SOCS=CAESHAgBEhJnd3NfMjAyNDAxMDEtMF9SQzEaAmZyIAEaBgiA_LyaBg", // Google : « refuser tout »
|
||||||
|
}
|
||||||
|
|
||||||
// goFetch effectue le GET et renvoie le corps (plafonné), le Content-Type et
|
// goFetch effectue le GET et renvoie le corps (plafonné), le Content-Type et
|
||||||
// l'URL finale après redirections.
|
// l'URL finale après redirections.
|
||||||
func goFetch(ctx context.Context, target string) (body []byte, contentType, finalURL string, err error) {
|
func goFetch(ctx context.Context, target string) (body []byte, contentType, finalURL string, err error) {
|
||||||
@@ -110,6 +141,12 @@ func goFetch(ctx context.Context, target string) (body []byte, contentType, fina
|
|||||||
req.Header.Set("User-Agent", goFetchUA)
|
req.Header.Set("User-Agent", goFetchUA)
|
||||||
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7")
|
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7")
|
||||||
req.Header.Set("Accept-Language", "fr-FR,fr;q=0.9,en;q=0.8")
|
req.Header.Set("Accept-Language", "fr-FR,fr;q=0.9,en;q=0.8")
|
||||||
|
// Signaux de refus du pistage (voir consentCookies).
|
||||||
|
req.Header.Set("DNT", "1")
|
||||||
|
req.Header.Set("Sec-GPC", "1")
|
||||||
|
for _, c := range consentCookies {
|
||||||
|
req.Header.Add("Cookie", c)
|
||||||
|
}
|
||||||
// Pas d'Accept-Encoding manuel : le transport gère gzip tout seul.
|
// Pas d'Accept-Encoding manuel : le transport gère gzip tout seul.
|
||||||
|
|
||||||
resp, err := goHTTPClient.Do(req)
|
resp, err := goHTTPClient.Do(req)
|
||||||
|
|||||||
Reference in new issue
Block a user