Найти пользователя Facebook (URL на страницу профиля) по известному адресу электронной почты
У меня есть адрес электронной почты, и я хочу узнать, есть ли пользователь Facebook, связанный с этим адресом. Если есть, то я хочу получить URL-адрес этой страницы профиля пользователя и сохранить его где-нибудь. У меня нет приложения для Facebook, но, если необходимо, я бы использовал данные существующей учетной записи, чтобы войти в Facebook и выполнить задачу.
Я думал, что это будет легкая задача, но почему-то это не так. Я прочитал документацию по Graph API и там вы найдете инструкции по поиску открытых данных. Он говорит, что формат:https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE
Но попытка сделать это с адресом электронной почты в параметре q и пользователем в параметре типа без дополнительной информации приводит к OAuthException, говорящему: "Требуется токен доступа для запроса этого ресурса". Однако, если вы щелкнете по поисковым ссылкам в качестве примера, Facebook сгенерирует URL с указанным токеном доступа, связанным с текущим вошедшим пользователем. Выполнение поиска с этим токеном дает ожидаемые результаты. Но я не могу понять, как получить этот токен доступа к сеансу пользователя после входа в систему. Каждый раз, когда я ищу, как получить токен доступа, я нахожу информацию только о приложениях Facebook и получении разрешений для доступа к основным или конкретным данным. Это, как я уже говорил, не то, что я ищу, потому что у меня нет и не нужно приложение на Facebook.
Так как Facebook дает мне необходимый токен в ссылках примера, я подумал, что его тоже не должно быть проблемой. Или они только из-за домашнего преимущества? Кроме того, поставщик социальных сетей Outlook для 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 ответов
Окончательный ответ на это от самих 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.
В ответ на ошибку, поданную здесь: http://developers.facebook.com/bugs/167188686695750 инженер Facebook ответил:
Это сделано специально, поиск пользователей предназначен только для функции пользователь-пользователь, для поиска новых друзей или поиска по электронной почте для поиска существующих контактов на Facebook. Упомянутая в Stackru "очистка" противоречит нашим Условиям предоставления услуг https://www.facebook.com/terms.php и фактически единственный законный способ поиска пользователей в Facebook - это когда вы являетесь пользователем.
Просто используйте API графа с этим форматом URL: https://graph.facebook.com/search?q=zuck@fb.com&type=user&access_token=... Вы можете легко создать приложение здесь и получить токен доступа для него здесь, Я полагаю, что вы получаете примерно 600 запросов за 600 секунд, хотя это не задокументировано.
Если вы делаете это массово, вы можете использовать пакетные запросы в пакетах по 20 адресов электронной почты. Это может помочь с ограничением скорости (я не уверен, что вы получаете 600 пакетных запросов за 600 секунд или 600 отдельных запросов).
Может быть, это немного поздно, но я нашел веб-сайт, который сообщает подробности учетной записи в социальных сетях по известной электронной почте. Это https://www.fullcontact.com/
Вы можете использовать Person Api там и получить информацию.
Это тип получения: https://api.fullcontact.com/v2/person.xml?email=someone@**** & apiKey = ********
Также есть выбор XML или JSON.
Я перехватил сообщение плагина 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 - идентификатор профиля в фейсбуке владельца токена доступа
Но когда я выполняю этот запрос с другим токеном доступа (сгенерированным для моего собственного приложения), ответ сервера: "Запрошенная вами таблица не существует". Я также не обнаружил электронную почту таблицы в документации API Facebook. Есть ли у Microsoft дополнительные права на Facebook?
Это оказалось довольно простой задачей, так как 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
}
Андреас, я также искал элегантное решение для отправки по электронной почте и не смог его найти. Однако, как вы сказали, очистка экрана не является такой плохой идеей в этом случае, потому что электронные письма уникальны, и вы либо получаете одно совпадение, либо ни одного. Пока 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();
}
Возможно, все изменилось, но я помню, что у rapleaf была служба, где вы вводили адрес электронной почты, и вы могли получить идентификатор Facebook.
https://www.rapleaf.com/
Если чего-то там не было, можно было бы "зарегистрироваться" по электронной почте, и у него должна была быть возможность получить данные через некоторое время.
Я сталкивался с этим при использовании поискового инструмента под названием Maltego несколько лет назад.
Приложение использует много типов "преобразований", и некоторые из них связаны с Facebook, Twitter и т. Д.
... или найти новые sqli в приложениях fb и fb, хе-хе.:)
Сначала я благодарю вас. # 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('/\{"id":(?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;
}
ВНИМАНИЕ: Старый и устаревший ответ. Не использовать
Я думаю, что вам придется искать последнее решение, соскребая страницу результатов поиска, потому что вы можете выполнять поиск по электронной почте с помощью API только среди тех пользователей, которые авторизовали ваше приложение (а вам он понадобится, потому что токен этого FB В приведенных примерах указана дата истечения срока действия, и вам необходимы расширенные разрешения для доступа к электронной почте пользователя).
Единственный подход, который я не пробовал, но я думаю, что он ограничен таким же образом, это FQL. Что-то вроде
SELECT * FROM user WHERE email 'your@email.com'
У Facebook строгая политика в отношении общего доступа только к контенту, который профиль делает общедоступным для конечного пользователя. Тем не менее, то, что вы хотите, возможно, если пользователь фактически оставил идентификатор электронной почты открытым для публичного домена. Пакетные запросы на максимально возможный размер пакета для идентификаторов..."http://graph.facebook.com/ .. и проанализируйте результат, чтобы проверить, существует ли электронная почта, и если она существует, то она соответствует той, которую вы хотите.. вы мне не нужен access_token для публичной информации..
в случае, если вам нужен идентификатор электронной почты пользователя FB, единственный возможный способ - это авторизовать ваше приложение, а затем вы можете использовать сгенерированный таким образом access_token для требуемой задачи.