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

Найти пользователя Facebook (ссылка на страницу профиля) по известному адресу электронной почты

У меня есть адрес электронной почты и вы хотите узнать, есть ли пользователь Facebook, связанный с этим адресом. Если есть, то я хочу получить URL-адрес этой страницы профиля пользователя и сохранить его где-нибудь. У меня не есть приложение facebook, но при необходимости я буду использовать существующие данные учетной записи для входа в facebook и выполнения задачи.

Я думал, что это будет непростая задача, но почему-то это не так. Я прочитал документацию Graph API и там вы найдете инструкции по поиску общедоступных данных. В нем говорится, что формат:
https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE

Но попытка с адресом электронной почты в параметре q и пользователем в параметре типа без дополнительной информации приводит к выражению OAuthException . Маркер доступа требуется для запроса этого ресурса. Однако, если вы нажмете пример ссылок поиска, Facebook генерирует URL-адрес с указанным токеном доступа, связанным с текущим пользователем. Выполнение поиска с помощью этого токена дает ожидаемые результаты. Но я не могу понять, как получить этот токен доступа к пользовательскому сеансу после входа в систему. Каждый раз, когда я ищу, как получить токен доступа, я нахожу только информацию о приложениях Facebook и получения разрешений для базового или специального доступа к данным. Это, как я уже упоминал, не то, что я ищу, так как у меня нет и не нужно приложение facebook.

Так как Facebook дает мне необходимый токен в примерах ссылок, я думал, что это не должно быть проблемой, чтобы получить его тоже. Или у них есть только из-за домашнего преимущества? Кроме того, Outlook Social Connector Provider для Facebook может извлекать данные Facebook только через адрес электронной почты (и предоставленные данные учетной записи). Поэтому я подумал, что если Microsoft сможет делать это, мне также следует делать простые вещи.

И последнее, но не менее важное: это тем хуже, поскольку я, теоретически и практически, уже могу найти URL-адрес профиля пользователей, просто поиская адрес электронной почты. Мне даже не нужно входить в Facebook. И это не официальный путь API.
Если я выполняю веб-запрос http://www.facebook.com/search.php?init=s:email&[email protected]&type=users, я получаю ожидаемый результат поиска. Проблема в том, что мне приходится анализировать HTML-код и извлекать URL-адрес (что хорошо), и что страница результатов может быть изменена и может легко сломать мой метод, чтобы извлечь URL-адрес (проблемный).

И есть ли у кого-нибудь представление, какой лучший способ выполнить задание?

4b9b3361

Ответ 1

Окончательный ответ на этот вопрос - от самих Facebook. В сообщении сегодня https://developers.facebook.com/bugs/335452696581712 говорится:

The ability to pass in an e-mail address into the "user" search type was
removed on July 10, 2013. This search type only returns results that match
a user name (including alternate name).

Итак, увы, простой ответ: вы больше не можете искать пользователей по их адресу электронной почты. Это отстой, но что новые правила Facebook.

Ответ 2

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

Если вы делаете это навалом, вы можете использовать пакетные запросы в партиях из 20 адресов электронной почты. Это может помочь с ограничениями по скорости (я не уверен, если вы получите 600 пакетных запросов за 600 секунд или 600 индивидуальных запросов).

Ответ 3

В ответ на ошибку, указанную здесь: http://developers.facebook.com/bugs/167188686695750, инженер в Facebook ответил:

Это по дизайну, поиск пользователей предназначен только для пользователей, для использования в поиске новых друзей или поиске по электронной почте, чтобы найти существующие контакты на Facebook. "Скребок", упомянутый в StackOverflow, специально противоречит нашим Условиям обслуживания https://www.facebook.com/terms.php и фактически единственный законный способ поиска пользователей на Facebook - это когда вы являетесь пользователем.

Ответ 4

Я захватил сообщение о плагине Outlook для Facebook и вот запрос POST

https://api.facebook.com/method/fql.multiquery
access_token=TOKEN&queries={"USER0":"select '0', uid, name, birthday_date, profile_url, pic, website from user where uid in (select uid from email where email in ('EMAIL_HASH'))","PENDING_OUT":"select uid_to from friend_request where uid_from = MY_ID and (uid_to IN (select uid from #USER0))"}

где
TOKEN - действительный токен доступа
EMAIL_HASH - комбинация хэшей CRC32 и MD5 искомого адреса электронной почты в формате crc32_md5
MY_ID - идентификатор профиля facebook владельца маркера доступа

Но когда я запускаю этот запрос с другим токеном доступа (сгенерированным для собственного приложения), ответ сервера: "Запрошенная вами таблица не существует". Я также не нашел адрес электронной почты в документации API Facebook. Есть ли у Microsoft дополнительные права в Facebook?

Ответ 5

Возможно, это немного запоздало, но я нашел веб-сайт, который дает информацию об учетной записи в социальных сетях, благодаря знанию электронной почты addreess. Это https://www.fullcontact.com

Вы можете использовать Person Api и получить информацию.

Это тип get: https://api.fullcontact.com/v2/[email protected] **** & apiKey = ********

Также есть выбор xml или json.

Ответ 6


ПРЕДУПРЕЖДЕНИЕ: старый и устаревший ответ. Не используйте


Я думаю, вам придется искать последнее решение, соскабливая страницу результатов поиска, потому что вы можете искать только по электронной почте с API в тех пользователей, которые разрешили ваш APP (и вам понадобится один, потому что токен, который FB предоставляет в примерах, имеет дату истечения срока действия, и вам нужны расширенные разрешения для доступа к электронной почте пользователя).

Единственный подход, который я не пробовал, но я думаю, что он ограничен таким же образом, это FQL. Что-то вроде

SELECT * FROM user WHERE email '[email protected]'

Ответ 7

Andreas, Я также искал ellegant-решение "email-to-id" и не смог его найти. Однако, как вы сказали, скрипинг экрана в этом случае не такая уж плохая идея, потому что электронные письма уникальны, и вы либо получаете одно совпадение, либо ничего. До тех пор, пока Facebook не изменит свою страницу поиска резко, следующее будет делать трюк:

final static String USER_SEARCH_QUERY = "http://www.facebook.com/search.php?init=s:email&q=%s&type=users";
final static String USER_URL_PREFIX = "http://www.facebook.com/profile.php?id=";

public static String emailToID(String email)
{
    try
    {
        String html = getHTML(String.format(USER_SEARCH_QUERY, email));
        if (html != null)
        {
            int i = html.indexOf(USER_URL_PREFIX) + USER_URL_PREFIX.length();
            if (i > 0)
            {
                StringBuilder sb = new StringBuilder();
                char c;
                while (Character.isDigit(c = html.charAt(i++)))
                    sb.append(c);
                if (sb.length() > 0)
                    return sb.toString();
            }
        }
    } catch (Exception e)
    {
        e.printStackTrace();
    }
    return null;
}

private static String getHTML(String htmlUrl) throws MalformedURLException, IOException
{
    StringBuilder response = new StringBuilder();
    URL url = new URL(htmlUrl);
    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setRequestMethod("GET");
    if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
    {
        BufferedReader input = new BufferedReader(new InputStreamReader(httpConn.getInputStream()), 8192);
        String strLine = null;
        while ((strLine = input.readLine()) != null)
            response.append(strLine);
        input.close();
    }
    return (response.length() == 0) ? null : response.toString();
}

Ответ 8

В Facebook существует строгая политика обмена только тем содержимым, которое профиль предоставляет публике конечному пользователю. Еще то, что вы хотите, возможно, если пользователь фактически оставил идентификатор электронной почты открытым для общедоступного домена. Дикая попытка, которую вы можете выполнить, - это отправить пакетные запросы для максимально возможного размера партии в идентификаторы... "http://graph.facebook.com/.. и проанализировать результат, чтобы проверить, существует ли электронная почта, и если это так, то это соответствует на тот, который вы хотите.. вам не нужно access_token для публичной информации..

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

Ответ 9

Возможно, все изменилось, но я помню, что rapleaf имел сервис, в который вы вводили адрес электронной почты, и вы могли бы получить идентификатор facebook.
https://www.rapleaf.com/

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

Я столкнулся с этим, когда несколько лет назад использовал инструмент поиска Maltego. Приложение использует множество типов "преобразований", а некоторые из них связаны с facebook и твиттером и т.д.

.. или найти некоторые новые sqli на приложениях fb и fb, хе-хе.:)

Ответ 10

Это выглядит как довольно простая задача, так как Facebook не скрывает от меня электронные письма пользователей или телефоны. Итак, вот функция gtml parsing на PHP с cURL

/*
    Search Facebook without authorization
    Query
        user name, e-mail, phone, page etc
    Types of search
        all, people, pages, places, groups, apps, events
    Result
        Array with facebook page names ( facebook.com/{page} )
    By      57ar7up
    Date    2016
*/
function facebook_search($query, $type = 'all'){
    $url = 'http://www.facebook.com/search/'.$type.'/?q='.$query;
    $user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36';

    $c = curl_init();
    curl_setopt_array($c, array(
        CURLOPT_URL             => $url,
        CURLOPT_USERAGENT       => $user_agent,
        CURLOPT_RETURNTRANSFER  => TRUE,
        CURLOPT_FOLLOWLOCATION  => TRUE,
        CURLOPT_SSL_VERIFYPEER  => FALSE
    ));
    $data = curl_exec($c);

    preg_match_all('/href=\"https:\/\/www.facebook.com\/(([^\"\/]+)|people\/([^\"]+\/\d+))[\/]?\"/', $data, $matches);
    if($matches[3][0] != FALSE){                // facebook.com/people/name/id
        $pages = array_map(function($el){
            return explode('/', $el)[0];
        }, $matches[3]);
    } else                                      // facebook.com/name
        $pages = $matches[2];
    return array_filter(array_unique($pages));  // Removing duplicates and empty values
}