3 votes

Comment obtenir le titre d'une URL en PHP à partir de sites renvoyant 403 Forbidden (interdit)

J'essaie d'obtenir le titre de quelques pages en PHP avec ce code. Cela fonctionne bien avec presque tous les liens, sauf quelques-uns, par exemple avec 9gag.

function download_page($url)
{
    $agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);

    return $data;
}

function get_title_tag($str)
{
    $pattern = '/<title[^>]*>(.*?)<\/title>/is';

    if(preg_match_all($pattern, $str, $out))
    {
        return $out[1][0];
    }
    return false;
}

$url = "https://9gag.com/gag/avPBX3b";

$data = download_page($url);

echo $extracted_title = get_title_tag($data);

Il fait écho

Attention ! | Cloudflare

qui semble être protégé par une page de vérification du robot Cloudflare. Mais lorsque j'essaie de publier ce lien sur un réseau social, ils sont capables d'obtenir le titre et toutes les métadonnées requises. Comment cela est-il possible ?

Edita:

Même si j'utilise l'API opengraph.io, j'obtiens :

"root":{
    "error":{
        "code": 2005
        "message": "Got 403 error from server."
    }
}

2voto

Kresimir Pendic Points 2644

Il suffit de remplacer la chaîne d'agent et cela devrait fonctionner correctement, à partir de :

$agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';

à :

$agent = 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)';

Je vois que CloudFlare a activé la vérification par captcha si des chaînes d'agent standard sont présentes, ce qui permettra de contourner facilement cette vérification. Je suis perplexe quant à la sécurité, mais cela n'entre pas dans le cadre de cette question.

1voto

Verma Jr. Points 693

Vous pouvez utiliser l'API graphique de Facebook.

https://graph.facebook.com/v7.0/?fields=og\_object&id=https://9gag.com/gag/avPBX3b

Sortie JSON :

{
   "og_object": {
      "id": "994417753967326",
      "description": "More memes, funny videos and pics on 9GAG",
      "title": "32 Places People Have Mispronounced Their Entire Life",
      "type": "article",
      "updated_time": "2020-06-12T15:54:27+0000"
   },
   "id": "https://9gag.com/gag/avPBX3b"
}

Vous pouvez en savoir plus sur son utilisation aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X