Facebook GRAPH API + PHP SDK: получить URL-адрес большого изображения пользователя

Я пытаюсь переписать приложение Facebook (скрипт PHP, встраивающий небольшую многопользовательскую флеш-игру) от старого FBML к новому типу iFrame, и это работает:

<?php

require_once('facebook.php');

define('FB_API_ID', '182820975103876');
define('FB_AUTH_SECRET', 'XXX');

$facebook = new Facebook(array(
            'appId'  => FB_API_ID,
            'secret' => FB_AUTH_SECRET,
            'cookie' => true,
            ));

if (! $facebook->getSession()) {
    printf('<script type="text/javascript">top.location.href="%s";</script>',
        $facebook->getLoginUrl(
                array('canvas'    => 1,
                      'fbconnect' => 0,
                      #'req_perms' => 'user_location',
        )));

} else {
    try {
        $me = $facebook->api('/me');

        $first_name = $me['first_name'];
        $city       = $me['location']['name'];
        $female     = ($me['gender'] != 'male');
        $fields     = $facebook->api('/me', array(
                          'fields' => 'picture',
                          'type'   => 'large'
                      ));
        $avatar     = $fields['picture'];

        # then I print swf tag and pass first_name;city;avatar to it

    } catch (FacebookApiException $e) {
        print('Error: ' . $e);
    }
}

?>

но я думаю, что вызов для получения изображения профиля пользователя заставляет мой скрипт выполнять вторую выборку CURL, чего, вероятно, можно избежать? А также я хотел бы использовать новый GRAPH API, а не старый REST API, но я не уверен, как переписать этот вызов (и мне нужно получить большой и прямой изображение пользователя).


person Alexander Farber    schedule 06.05.2011    source источник


Ответы (2)


Если вы знаете идентификатор пользователя, просто используйте:

<img src="http://graph.facebook.com/<UID>/picture?type=large" />

Также обратите внимание, что вы можете использовать этот URL-адрес для получения содержимого через cURL. При необходимости вы также можете использовать cURL для отслеживания перенаправлений и конечный URL.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 
    "http://graph.facebook.com/<UID>/picture?type=large");

curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);

var_dump($url);
person Jimmy Sawczuk    schedule 06.05.2011
comment
Спасибо, интересно, сработает ли ваш трюк в моем случае (я передаю закодированную строку first_name; город; женщина; аватар как flashvars в swf-файл Flash-игры)... - person Alexander Farber; 06.05.2011
comment
Я не знаком с Flash, но если вы можете загрузить URL-адрес изображения, вы сможете использовать тот же URL-адрес. В качестве альтернативы вы можете закодировать его в base64 и передать необработанные данные в SWF (или что-то еще). - person Jimmy Sawczuk; 06.05.2011
comment
Нет, извините, на самом деле это не сработает для меня, потому что я передаю этот URL-адрес аватара другим пользователям моей многопользовательской игры, и у них не будет прав доступа к этому URL-адресу... Поэтому я ищу другой способ получить прямой URL-адрес изображения пользователя, например profile.ak.fbcdn. net/hprofile-ak-snc4/hs1325.snc4/ — я обновил свой вопрос, извините, что не упомянул об этом. - person Alexander Farber; 06.05.2011
comment
Я не понимаю, почему у них нет разрешения; если вы знаете удостоверение личности, у вас есть доступ к их фотографии, она общедоступна. Тем не менее, вы все равно можете следовать шагам, чтобы получить окончательный URL-адрес ответа - этот вопрос выглядит многообещающе для этого. - person Jimmy Sawczuk; 06.05.2011
comment
Нет, вы не можете отправить URL-адрес изображения profile.ak.fbcdn.net, это ссылка CDN (сети доставки контента). Это означает, что оно загружается на ближайший сервер, а это означает, что пользователи Facebook могут получить другой URL-адрес для одного и того же изображения. Некоторые ссылки не будут работать в других странах и т. д. Вы по-прежнему можете использовать graph.facebook.com. /‹UID›/picture?type=large в качестве прямого URL-адреса при загрузке из флэш-памяти. например, mc.loadMovie(graph.facebook.com/‹UID›/picture?type =большой); - person dragonjet; 07.05.2011

Вместо двух вызовов API вы можете использовать FQL, например:

$result = $facebook->api(array(
    'method'=>'fql.query',
    'query'=>'SELECT uid,name,first_name,current_location,sex,pic_big FROM user WHERE uid=me()'
));

Конечно, fql.query - это не метод графа, но все же это способ использования FQL.

person ifaour    schedule 06.05.2011