Подтвердить что ты не робот

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

Что мне нужно

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

Здесь был аналогичный вопрос: Как получить идентификатор пользователя facebook с адреса электронной почты для входа в систему, который является довольно устаревшим, а текущие ответы есть "он устарел" / "это невозможно"... EDIT: Я нашел еще лучший вопрос: Найти пользователя Facebook (ссылка на страницу профиля) по известному адресу электронной почты (где это действительно объясняется, почему и с тех пор, когда эта функция не является 't поддерживается)

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

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

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

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

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


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

После того, как у вас есть имя пользователя или идентификатор пользователя Facebook, вам легко создать URL-адрес для загрузки изображения. Поэтому я пытался найти идентификаторы пользователей Facebook, используя электронные письма с помощью /search Graph API:
https://graph.facebook.com/[email protected]&type=user&access_token=TOKEN

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

Использование FB PHP API + FB App ID и секретный

Я также пробовал это: сначала я извлекаю 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('[email protected]', $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 Explorer: https://developers.facebook.com/tools/explorer/ пусть он генерирует токен доступа для меня и запрашивает: [email protected]&type=user&debug=all На этом заканчивается:

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

... так что Facebook кажется любопытным здесь безнадежным.

4b9b3361

Ответ 1

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

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

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

Использование Gravatar в PHP так же просто:

<?php
$email = "[email protected]";
$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+ в качестве внешних поставщиков входа, где пользователи могут предоставить вашему приложению доступ к их информации о профиле.

Ответ 2

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

"Возможность отправки адреса электронной почты в тип поиска пользователя была удалена 10 июля 2013 года. Этот тип поиска возвращает результаты, соответствующие имени пользователя (включая альтернативное имя)" ~ Joseph Tuấn Anh Фан (команда Facebook)

поэтому, вероятно, нет прямой поддержки от API-интерфейсов Graph.

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

SELECT uid, name FROM user where email = '[email protected]'

дает:

"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
}

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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