2017-09-14 4 views
0

file_get_contents dans PHP/Apache2 obtenait des photos d'utilisateur de Facebook. Cela fonctionnait bien jusqu'à récemment. Maintenant, il a toujours temps après une minute, avec cette erreur dans mon Apache2 error.log:PHP file_get_contents & curl peut obtenir des fichiers image de certains sites mais pas d'autres. Pourquoi?

PHP Warning: file_get_contents (https://graph.facebook.com/999999999/picture?width=200): failed to open stream: Délai de connexion dépassé

Voici le code (I récemment ajouté contexte $ pour voir si elle fait le travail qu'il n'a pas.):

$context = stream_context_create(array('https' => array('header'=>'Connection: close\r\n'))); 
$fbprofileimage = file_get_contents('https://graph.facebook.com/'.$id.'/picture?width=100',false,$context); 

j'ai essayé enroulent et il ne fonctionne pas:

$curl_handle=curl_init(); 
curl_setopt($curl_handle, CURLOPT_URL,'http://graph.facebook.com/'.$id.'/picture?width=100'); 
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'StockBet'); 
$fbprofileimage = curl_exec($curl_handle); 
curl_close($curl_handle); 

J'ai découvert que file_get_contents & curl fonctionnera avec certains sites, mais pas d'autres.

Les travaux suivants:

$context = stream_context_create(array('https' => array('header'=>'Connection: close\r\n'))); 
$fbprofileimage = file_get_contents('https://fm.cnbc.com/applications/cnbc.com/resources/img/editorial/2017/08/03/104629909-GettyImages-630953738-bitcoin.240x160.jpg?v=1501760634',false,$context); 

$curl_handle=curl_init(); 
curl_setopt($curl_handle, CURLOPT_URL,'https://fm.cnbc.com/applications/cnbc.com/resources/img/editorial/2017/08/03/104629909-GettyImages-630953738-bitcoin.240x160.jpg?v=1501760634'); 
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'StockBet'); 
$fbprofileimage = curl_exec($curl_handle); 
curl_close($curl_handle); 

Le code ci-dessus peut obtenir les fichiers image ainsi:

Le code ci-dessus ne peut pas obtenir les fichiers d'image suivants:

Est-ce que quelqu'un sait pourquoi je peux obtenir des fichiers d'images à partir de certains sites, mais pas d'autres?

+0

Avez-vous essayé de consigner la requête curl à l'aide de CURLOPT_VERBOSE? Vous pouvez également utiliser curl_getinfo avant curl_close pour voir si des erreurs HTTP ont été signalées. Il est très probable que ces sites bloquent la sortie si vous omettez un agent utilisateur ou un en-tête référent. –

+0

@RubenVincenten Merci pour votre réponse. Je l'ai eu pour travailler pour mon but. Voir ma réponse posté ci-dessous. – Curt

Répondre

1

Pour mes fins, ce qui est d'obtenir des images des utilisateurs de Facebook, je l'ai à travailler en utilisant le code suivant:

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // need confirmed 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // need confirmed. I think this is key, as Facebook redirects to another URL and we need to follow 
     //curl_setopt($ch, CURLOPT_ENCODING,""); // not needed confirmed 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // need confirmed 
     curl_setopt($ch, CURLOPT_TIMEOUT,1); // need confirmed 
     curl_setopt($ch, CURLOPT_FAILONERROR,true); // not needed confirmed 
     //curl_setopt($ch, CURLOPT_VERBOSE, true); // not needed confirmed 
     //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // not needed confirmed 
     curl_setopt($ch, CURLOPT_HEADER, true); // need confirmed 
     $fbprofileimage = curl_exec($ch); 
     if (curl_errno($ch)){ 
      echo 'Retreive Base Page Error: ' . curl_error($ch); 
     } 
     else { 
      //$info = rawurldecode(var_export(curl_getinfo($ch),true)); 
     // Get the cookies: 
      $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
      //$responseHeader= substr($fbprofileimage,0,$skip); 
      $fbprofileimage= substr($fbprofileimage,$skip); // need confirmed 
      //echo "HEADER: $responseHeader\n"; // causes error 
      //echo "\n\nINFO: $info\n\nDATA: $fbprofileimage"; // causes error 
     }    

Je pense que ce qui a été la clé était la suivante:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

car lorsque vous obtenez https://graph.facebook.com/999999999/picture?width=200 (où 999999999 est l'ID de l'utilisateur), Facebook redirige vers une autre URL.

+0

Merci! Il était en effet curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, true); –