como salvar a foto de perfil do usuário no Facebook usando php

Oi, estou tentando criar um aplicativo que use a imagem do perfil do usuário nele. Então eu escrevo código que lê foto de perfil do Facebook e salve no meu servidor. Eu uso o código a seguir

function GetImageFromUrl($link){ $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch,CURLOPT_URL,$link); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); return $result; } $userpicpath = "http://graph.facebook.com/$uid/picture?type=normal"; $sourcecode = GetImageFromUrl($userpicpath); $savefile = fopen("$uid-normal.jpg", "w"); //this is name of new file that i save fwrite($savefile, $sourcecode); fclose($savefile); 

Aqui $ uid é id de usuário.

O código acima não funciona corretamente.

Mas quando eu copiar o $ userpicpath (ou seja, http://graph.facebook.com/ $ uid / picture? Type = normal) no navegador e pressione enter, ele me enviará novo caminho para a imagem na barra de endereços e me mostrará a imagem apropriada que Eu quero. Se eu passei esse novo caminho na barra de endereços para minha function, ele salva o arquivo de imagem que eu quero.

Porque isso está acontecendo? Como eu recebo esse segundo caminho de imagem e passa para minha function no programa. Por favor me ajude.

Obrigado.

O Facebook usa um redirecionamento para permitir a inclusão fácil em sites. Ele realiza isso enviando um header de redirecionamento HTTP 302. Uma vez que vejo que você está usando um CURL, escrevi meu exemplo com base em um guia que encontrei online. Eu também postei como enviar o agente do usuário via CURL. Aqui está a minha function getFBResponse () para você e pode ser usada para replace a tarefa do $ userpicpath. Experimente isso: $ userpicpath = getFBRedirect ();

 // Only calling the head curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD' $content = curl_exec ($ch); // The response should be: /* HTTP/1.1 302 Found Location: http://www.iana.org/domains/example/ */ // So splitting on "Location: " should give an array of index 2, the URL you want being the second index (1) $theUrl = split($content, "Location: "); return $content[1]; 

}

Tente configurar o header do agente de usuário para sua solicitação. O FB e muitos outros serviços muitas vezes se recusam a atender solicitação sem nenhum conjunto de User-Agent.

EDITAR: Pode ser feito assim:

 curl_setopt($ch,CURLOPT_HTTPHEADER,array('User-Agent: AnythingYouLikeHere')); 

EDITAR 2: A parte sobre os redirecionamentos também é verdadeira. Para permitir que a CURL cuide automaticamente de manipulação de redirecionamento, você pode fazer isso:

 curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true); 

Parece um redirecionamento. Aqueles não podem ser tratados pelo PHP, você precisará descobrir o endereço real da imagem para usar GetImageFromUrl

Você pode dizer ao CURL que siga o redirecionamento retornado pelo servidor do Facebook configurando a opção CURLOPT_FOLLOWLOCATION ; O abaixo deve funcionar como desejado:

 function GetImageFromUrl($link) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_URL, $link); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # ADDED LINE: curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $result = curl_exec($ch); curl_close($ch); return $result; }