сохранить изображение facebook с помощью curl, file_get_contents, fopen / fread / fwrite, копировать - странные заголовки - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь сохранить изображения с Facebook и возникла проблема.

Работает хорошо, за исключением изображений из домена external.ak.fbcdn.net

т.е. http://external.ak.fbcdn.net/safe_image.php?d=85623fa1fc7679d3e4e5e9ab3b9ad426&w=50&h=50&url=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F3%2F38%2FTwo_dancers.jpg&crop

Использование curl, file_get_contents, fopen / fread / fwrite, копирование return 1x1gif вместо реального изображения.

Я не смог найти решение, поэтому я проверил заголовки по размещенному выше URL (get_headers) и получил этот gif:

array(10) {
  [0]=>
  string(15) "HTTP/1.0 200 OK"
  ["Content-Type"]=>
  string(9) "image/gif"
  ["Pragma"]=>
  string(8) "no-cache"
  ["X-FB-Debug"]=>
  string(44) "qcXPNe3kW3TLOCgBRQQUBr/ekWiKISQTqbdUbDi7vXs="
  ["X-Cnection"]=>
  string(5) "close"
  ["Content-Length"]=>
  string(2) "43"
  ["Cache-Control"]=>
  string(44) "private, no-cache, no-store, must-revalidate"
  ["Expires"]=>
  string(29) "Sat, 31 Mar 2012 20:52:23 GMT"
  ["Date"]=>
  string(29) "Sat, 31 Mar 2012 20:52:23 GMT"
  ["Connection"]=>
  string(5) "close"
}    

Может кто-нибудь помочь мне с этим?Это какая-то защита от facebook или я что-то не так делаю?

На всякий случай вот мой код скручивания:

$ch = curl_init( $url );
$fp = fopen( $filePath, 'wb');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

curl_exec($ch);
curl_close($ch);
fclose($fp);

1 Ответ

2 голосов
/ 01 апреля 2012

Для URL с префиксом .../safe_image.php вам необходимо извлечь реальный URL изображения:

$url = 'http://external.ak.fbcdn.net/safe_image.php?d=85623fa1fc7679d3e4e5e9ab3b9ad426&w=50&h=50&url=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F3%2F38%2FTwo_dancers.jpg&crop';
$parts = parse_url($url);
parse_str($parts['query'], $params);
$realUrl = $params['url'];
print_r($realUrl);
// http://upload.wikimedia.org/wikipedia/commons/3/38/Two_dancers.jpg
...