Получение изображения профиля Facebook / Google+ / Linkedin, имеющего только адрес электронной почты

Что мне нужно

Мне нужно автоматически найти и загрузить изображение профиля, чтобы пользователь знал только его адрес электронной почты. Первоначально я сосредоточился на Facebook, учитывая количество людей, активно использующих его. Однако, похоже, больше нет прямой поддержки их API.

Здесь был похожий вопрос: как получить идентификатор пользователя Facebook с адреса электронной почты для входа в систему, который является довольно устаревшим, и текущие ответы там "это устарело" / "это невозможно"... РЕДАКТИРОВАТЬ: Я нашел еще лучший вопрос: Найти пользователя Facebook (URL на странице профиля) по известному адресу электронной почты (где на самом деле объясняется, почему и с каких пор эта функция не поддерживается)

Должен быть способ...

Что заставляет меня думать, что это должно быть возможно, так это то, что Spokeo каким-то образом это делает: http://www.spokeo.com/email-search/search?e=beb090303%40hotmail.com

Существует несколько сервисов / API, предлагающих такую ​​функцию:
Clearbit
Pipl
... но я не нашел ничего бесплатного.

альтернативы

Если есть какой-то обходной путь или иной подход, чем использование API Facebook для достижения этой цели, я хотел бы знать. Если Facebook действительно абсолютно безнадежен, то комбинация из них: Google+, Linkedin и / или Gravatar может подойти.


Моя первая (оригинальная) попытка:

Если у вас есть имя пользователя Facebook или идентификатор пользователя, можно легко создать URL для загрузки изображения. Поэтому я пытался искать идентификаторы пользователей Facebook, используя электронные письма с /search График API:
https://graph.facebook.com/search?q=beb090303@hotmail.com&type=user&access_token=TOKEN

что, к сожалению, всегда заканчивается "токен доступа пользователя требуется для запроса этого ресурса".

Использование FB PHP API + идентификатор приложения FB и секрет

Я также попробовал это: сначала я получаю access_token используя идентификатор приложения и секрет, а затем я пытаюсь использовать его как часть /search запрос с curl:

function post_query_url($url, $data) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}

function get_query_url($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $ret = curl_exec($ch);
    curl_close($ch);
    return $ret;
}

function get_retrieve_app_access_token($app_id, $secret) {
    $url = 'https://graph.facebook.com/oauth/access_token?client_id='.$app_id.'&client_secret='.$secret.'&grant_type=client_credentials';
    $res = get_query_url($url);
    if (!empty($res)) {
        $tokens = explode('=', $res);
        if (count($tokens) == 2)
            return $tokens[1];
    }
    return null;
}

function post_retrieve_app_access_token($app_id, $secret) {
    $url = 'https://graph.facebook.com/oauth/access_token';
    $data = 'client_id='.$app_id.'&client_secret='.$secret.'&grant_type=client_credentials';
    $res = post_query_url($url, $data);
    if (!empty($res)) {
        $tokens = explode('=', $res);
        if (count($tokens) == 2)
            return $tokens[1];
    }
    return null;
}

function get_id_from_email($email, $accessToken) {
    $url = 'https://graph.facebook.com/search?q='.urlencode($email).'&type=user&access_token='.$accessToken;
    $res = get_query_url($url);
    if (!empty($res)) {
        return $res;
    }
    return null;
}

echo 'Retrieving token...<br>';

$token = post_retrieve_app_access_token('MY_APP_ID', 'SECRET');
echo 'Retrieved token: ' . $token . '<br>';

echo 'Retrieving user ID...<br>';
$id = get_id_from_email('beb090303@hotmail.com', $token);
echo 'Retrieved ID: ' . $id . '<br>';

выводит что-то вроде:

Retrieving token...
Retrieved token: 367458621954635|DHfdjCnvO243Hbe1AFE3fhyhrtg
Retrieving user ID...
Retrieved ID: {"error":{"message":"A user access token is required to request this resource.","type":"OAuthException","code":102}}

Другая информация

Поскольку он запрашивает "токен доступа пользователя", я также попытался зайти в Facebook Graph Graph: https://developers.facebook.com/tools/explorer/ он сгенерировал мне токен доступа, и запросил: search?q=beb090303@hotmail.com&type=user&debug=all Это заканчивается:

{
  "error": {
    "message": "(#200) Must have a valid access_token to access this endpoint", 
    "type": "OAuthException", 
    "code": 200
  }
}

... так что Фейсбук кажется здесь безнадежным.

5 ответов

Решение

Именно поэтому существует Gravatar и почему люди используют Gravatar, пользователи знают, какое общедоступное изображение профиля они привязывают к какому адресу электронной почты, и они знают, где его изменить.

В вашем приложении пользователи могут загрузить свое изображение профиля и использовать Gravatar.

Если вы просто попытаетесь извлечь изображение из Facebook или Google+, это может испугать ваших пользователей, и им будет сложнее узнать, откуда ваш сервис получил изображение профиля.

Используя Gravatar в PHP, это так просто:

<?php
$email = "email@server.com";
$default = ""; // absolute url to default image goes here or leave empty for default gravatar image
$size = 200;

$grav_url = "http://www.gravatar.com/avatar/" . md5(strtolower(trim($email))) . "?d=" . urlencode($default) . "&s=" . $size;

header("content-type: image/jpeg");
echo file_get_contents($grav_url);
?>

Кроме того, вы также можете использовать Facebook и / или Google+ в качестве внешних провайдеров входа в систему, где пользователи могут предоставить вашему приложению доступ к информации своего профиля.

Произошла ошибка. Не удалось выполнить поиск пользователя по электронной почте после июля 2013 г. Breaking Changes, которая была закрыта как "By Design" с официальным ответом:

"Возможность передачи адреса электронной почты в тип поиска" пользователь "была удалена 10 июля 2013 года. Этот тип поиска возвращает только результаты, которые соответствуют имени пользователя (включая альтернативное имя)" ~ ~ Джозеф Туон Ан Фан (Facebook Team)

так что, вероятно, нет прямой поддержки Graph API.

Я пробовал Graph API Explorer, где вы также можете попробовать поиграть с FQL (просто нужно выбрать версию 2.0, так как более новые версии больше не поддерживаются), к сожалению, запрос выглядит так:

SELECT uid, name FROM user where email = 'some.email@gmail.com'

дает:

"error": {
  "message": "(#604) Your statement is not indexable. The WHERE clause must contain 
   an indexable column. Such columns are marked with * in the tables linked from
   http://developers.facebook.com/docs/reference/fql ", 
  "type": "OAuthException", 
  "code": 604
}

а ссылка на таблицу user показывает, что только uid а также third_party_id может быть использован в WHERE,

Вам нужен токен доступа, а также идентификатор пользователя Facebook. не зная, что они не могут получить их аватарку

Я думаю, что у Spokeo может быть соглашение с Facebook для доступа к данным? Я не удивлюсь.

В любом случае, если вы находитесь в профиле, вы можете искать profile_id в HTML. Это взломать, не уверен, что это работает.

Вы всегда можете позволить людям комментировать, войдя в систему под своей учетной записью g+/facebook/ любым другим способом (однако, вы должны сделать что-то подобное OpenID); если они вошли в систему, вы сможете получить UID на Facebook.

Кроме того, есть нечто, называемое libravatar, которое позволяет людям связывать изображения с их OpenID или адресом электронной почты (и которое возвращается к gravatar, если они ничего не настроили специально для libravatar); использование этого должно дать вам больше фотографий, чем если бы вы придерживались "просто" граватара.

Другие вопросы по тегам