web-dev-qa-db-fra.com

wp_remote_get () ne récupère pas les pages correctement

J'utilise wp_remote_get() pour récupérer différentes pages du Web. C'est un site de nouvelles.

La plupart du temps, cela fonctionne avec succès. Cependant, parfois, la requête renvoie succès (code 200), mais le contenu de la page est différent de celui de la page récupérée par un brwoser (le contenu de la page renvoyée par cet appel est similaire à "page introuvable"). ")

Toutefois, si j'utilise un navigateur pour récupérer la page en question, celle-ci est renvoyée avec succès.

Voici un exemple:

// The following returns code 200, yet the returned page is different from the acual page that is accessed via the browser
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");

NOTE: Pour vérifier, j’ai regardé la page retournée avec PHP, ainsi que le code source de la page via le navigateur, et ils sont différents.

Je ne sais pas quel est le problème. Je soupçonne que cela pourrait avoir quelque chose à voir avec les arguments de wp_remote_get(), cependant, documentation about arguments n’est pas clair.

Est-ce les arguments? Si oui, quoi et comment les installer? Si non, qu'est-ce que vous soupçonnez du problème?


MISE À JOUR IMPORTANTE ET SOLUTION

Après avoir lu le commentaire de zendka dans lequel il déclare "Je reçois exactement le même contenu. Je viens de vérifier et de comparer le corps de la réponse à la source de la page du navigateur. Ils sont identiques :) ", J'ai réalisé quelque chose de très important.

L'URL d'origine utilisée dans mon code dans wp_remote_get() est http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا

Et l'appel serait comme

// Causes problems
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا");

L’URL utilisée et décrite à l’origine dans cette question était

// Runs successfully
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");

NOTEZ CE QUI SUIT:

  1. Pour que l'url fonctionne avec wp_remote_get() sans causer de problème ni d'erreur, il ne devrait PAS être du format suivant http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا, mais plutôt être codé comme suit http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7.

  2. La raison pour laquelle wp_remote_get() ne peut pas travailler avec http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا est qu’elle est incapable de traiter ce format utf8. Pour que cela fonctionne correctement, seul le chemin de l'URL doit être converti en un format codé en pourcentage. De plus, aucun caractère barre oblique (/) dans le chemin ne doit pas être codé, sinon wp_remote_get() ne pourra pas trouver la page et nous obtiendrons donc un code de succès (200) avec un contenu de 404 pages. Par conséquent, ce format http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7 fonctionne correctement lorsqu'il est passé à wp_remote_get().

  3. La raison pour laquelle j'ai signalé les formats de manière incorrecte, c'est en cours de test, j'ai copié l'URL de Firefox et l'ai collée ici. Firefox convertit automatiquement le formatage au format "correct". Détails ici: https://superuser.com/questions/480692/copying-unicode-symbols-from-firefox-address-bar-as-is

La solution

  1. Vérifier que l'URL a le bon format de pourcentage

  2. Utilisez l'URL nouvellement formatée avec wp_remote_get()

Ressources utiles

https://github.com/neitanod/forceutf8

https://stackoverflow.com/questions/910793/detect-encoding-and-make-everything-utf-8

https://stackoverflow.com/questions/2742852/unicode-characters-in-urls

https://stackoverflow.com/questions/9831077/how-to-url-encode-only-non-ascii-symbols-of-url-in-php-but-leave-reserved-symbo

https://stackoverflow.com/questions/25465114/php-str-replace-not-working-with-special-chars

3
Greeso

La demande HTTP envoyée par wp_remote_get() est différente de celle envoyée par un navigateur. Par exemple, le user-agent est différent (voir documentation ). Certains sites Web réagissent différemment en fonction de cela. Le second argument de wp_remote_get() permet de modifier la requête.

Les sites Web peuvent également répondre différemment selon l'adresse IP ou le nombre de demandes reçues (généralement en limitant ou en interdisant certains modèles).

A propos, j'ai testé la page que vous avez mentionnée et cela fonctionne pour moi:

wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");
3
zendka