Найти пользователя Facebook (URL на страницу профиля) по известному адресу электронной почты - PullRequest
30 голосов
/ 08 марта 2011

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

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

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

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

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

ТакУ кого-нибудь есть идеи, как лучше всего выполнить поставленную задачу?

Ответы [ 11 ]

15 голосов
/ 11 августа 2013

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

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's name (including alternate name).

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

7 голосов
/ 21 сентября 2011

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

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

7 голосов
/ 14 сентября 2011

Просто используйте API графика с этим форматом URL: https://graph.facebook.com/search?q=zuck@fb.com&type=user&access_token=... Вы можете легко создать приложение здесь и получить для него токен доступа здесь полагаю, вы получите примерно 600 запросов за 600 секунд, хотя это не задокументировано.

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

5 голосов
/ 04 ноября 2015

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

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

Это тип получения: https://api.fullcontact.com/v2/person.xml?email=someone@****&apiKey=********

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

3 голосов
/ 24 сентября 2013

Я перехватил сообщение плагина 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?

1 голос
/ 20 февраля 2016

Это оказалось довольно легкой задачей, так как Facebook не скрывает от меня электронные письма пользователей или телефоны. Итак, вот функция синтаксического анализа HTML на 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
}
0 голосов
/ 16 января 2018

Сначала я благодарю вас. # 57ar7up, и я добавлю следующий код, который поможет найти номер телефона для возврата.

function index(){
    // $keyword = "0946664869";
    $sql = "SELECT * FROM phone_find LIMIT 10";
    $result =  $this->GlobalMD->query_global($sql);
    $fb = array();
    foreach($result as $value){
        $keyword = $value['phone'];
        $fb[] = $this->facebook_search($keyword);
    }
    var_dump($fb);

}

function facebook_search($query, $type = 'all'){
    $url = 'http://www.facebook.com/search/'.$type.'/?q='.$query;
    $user_agent = $this->loaduserAgent();

    $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('/\&#123;&quot;id&quot;:(?P<fbUserId>\d+)\,/', $data, $matches);
    if(isset($matches["fbUserId"]) && $matches["fbUserId"] != ""){
        $fbUserId = $matches["fbUserId"];
        $params = array($query,$fbUserId);
    }else{
        $fbUserId = "";
        $params = array($query,$fbUserId);
    }
    return $params;
}
0 голосов
/ 21 сентября 2011

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

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

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

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

0 голосов
/ 17 сентября 2011

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

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

0 голосов
/ 13 сентября 2011

Andreas, Я также искал элегантное решение для отправки по электронной почте и не смог его найти. Однако, как вы сказали, очистка экрана не является такой плохой идеей в этом случае, потому что электронные письма уникальны, и вы либо получаете одно совпадение, либо ни одного. Пока 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...