Buscar usuario de Facebook (url en la página de perfil) por dirección de correo electrónico conocida

Tengo una dirección de correo electrónico y quiero saber si hay un usuario de Facebook vinculado a esta dirección. Si la hay, entonces quiero recuperar la url en esta página de perfil de usuario y guardarla en alguna parte. No tengo una aplicación de Facebook, pero, de ser necesario, usaría los datos de mi cuenta existente para iniciar sesión en Facebook y realizar la tarea.

Pensé que sería una tarea fácil, pero de alguna manera no es así. Leí la documentación de Graph API y allí encontré instrucciones sobre cómo buscar datos públicos. Dice que el formato es:
https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE

Pero intentar esto con una dirección de correo electrónico en el parámetro q y usuario en el tipo param sin más información da como resultado una OAuthException que dice “Se requiere un token de acceso para solicitar este recurso”. Sin embargo, si hace clic en los enlaces de búsqueda de ejemplo, Facebook genera una url con el token de acceso mencionado relacionado con el usuario que ha iniciado sesión actualmente. La realización de búsquedas con este token da los resultados esperados. Pero no puedo entender cómo obtener este token de acceso de sesión de usuario después de iniciar sesión. Cada vez que busco información sobre cómo obtener un token de acceso, solo encuentro información sobre las aplicaciones de Facebook y recupero permisos para acceder a datos básicos o específicos. Esto es, como mencioné, no lo que estoy buscando, ya que no tengo y no necesito una aplicación de Facebook.

Como Facebook me da el token necesario en los enlaces de ejemplo, pensé que no debería ser un problema obtenerlo también. ¿O solo lo tienen por la ventaja de jugar en casa? Además, Outlook Social Connector Provider para Facebook puede recuperar datos de Facebook solo a través de una dirección de correo electrónico (y los datos de la cuenta proporcionados). Entonces, pensé, si Microsoft puede hacer esto también debería ser posible hacer cosas similares.

Por último, pero no menos importante, esto es lo más frustrante ya que, teórica y prácticamente, ya puedo encontrar la URL del perfil de los usuarios simplemente buscando la dirección de correo electrónico. Ni siquiera tengo que iniciar sesión en Facebook. Y no es la forma oficial de API.
Si realizo una solicitud web a http://www.facebook.com/search.php?init=s:email&q=example@domain.com&type=users obtengo el resultado de búsqueda esperado. El problema es que tengo que analizar el código HTML y extraer la URL (está bien) y que la página de resultados está posiblemente sujeta a cambios y podría romper fácilmente mi método para extraer la url (problemática).

Entonces, ¿alguien tiene una idea de cuál es la mejor manera de lograr la tarea dada?

La respuesta definitiva a esto proviene de Facebook. En post hoy en https://developers.facebook.com/bugs/335452696581712 un desarrollador de Facebook dice

 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). 

Así que, por desgracia, la respuesta simple es que ya no puede buscar usuarios por su dirección de correo electrónico. Esto apesta, pero esas son las nuevas reglas de Facebook.

Simplemente use la API de gráficos con este formato url: https://graph.facebook.com/search?q=zuck@fb.com&type=user&access_token= … Puede crear fácilmente una aplicación aquí y obtener un token de acceso aquí . Creo que recibes un estimado de 600 solicitudes por 600 segundos, aunque esto no está documentado.

Si está haciendo esto a granel, podría usar solicitudes por lotes en lotes de 20 direcciones de correo electrónico. Esto puede ayudar con los límites de velocidad (no estoy seguro si recibe 600 solicitudes por lote por 600 segundos o 600 solicitudes individuales).

En respuesta al error presentado aquí: http://developers.facebook.com/bugs/167188686695750, un ingeniero de Facebook respondió:

Esto es por diseño, la búsqueda de usuarios está destinada a ser una función de usuario a usuario solamente, para usar en la búsqueda de nuevos amigos o buscar por correo electrónico para encontrar contactos existentes en Facebook. El “raspado” mencionado en StackOverflow está específicamente en contra de nuestros Términos de Servicio https://www.facebook.com/terms.php y, de hecho, la única manera legítima de buscar usuarios en Facebook es cuando usted es un usuario.

Tal vez esto es un poco tarde, pero encontré un sitio web que da detalles de la cuenta de redes sociales por correo electrónico conocido. Es https://www.fullcontact.com

Puede usar Person Api allí y obtener la información.

Este es un tipo de get: https://api.fullcontact.com/v2/person.xml?email=someone@ **** & apiKey = ********

También hay una opción xml o json.

He capturado la comunicación del complemento de Outlook para Facebook y aquí está la solicitud 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))"} 

dónde
TOKEN – token de acceso válido
EMAIL_HASH – combinación de hash CRC32 y MD5 de la dirección de correo electrónico buscada en formato crc32_md5
MY_ID: ID del perfil de Facebook del propietario del token de acceso

Pero cuando ejecuto esta consulta con un token de acceso diferente (generado para mi propia aplicación), la respuesta del servidor es: “La tabla que solicitó no existe”. Tampoco encontré el correo electrónico de la tabla en la documentación de la API de Facebook. ¿Microsoft tiene algunos derechos adicionales en Facebook?

Facebook tiene una política estricta de compartir solo el contenido que un perfil hace público para el usuario final. Aún así, lo que desea es posible si el usuario ha dejado la identificación del correo electrónico abierta al dominio público. Un bash salvaje que puede hacer es enviar solicitudes por lotes para el tamaño de lote máximo posible para los identificadores … “http://graph.facebook.com/ .. y analizar el resultado para verificar si existe correo electrónico y si lo hace, entonces coincide con el que desea … usted no necesita ningún access_token para la información pública ..

en caso de que desee una identificación de correo electrónico de un usuario de FB, solo la única forma posible es que autoricen su aplicación y luego puede usar la access_token generada para la tarea requerida.

Tal vez las cosas cambiaron, pero recuerdo que Rapleaf tenía un servicio donde ingresas una dirección de correo electrónico y puedes recibir una identificación de Facebook.
https://www.rapleaf.com/

Si algo no estaba allí, uno podría “registrarse” con el correo electrónico, y debería tener la oportunidad de obtener la información después de un tiempo.

Me encontré con esto cuando usé una herramienta de búsqueda llamada Maltego hace unos años.
La aplicación usa muchos tipos de “transformaciones”, y algunas relacionadas con Facebook y Twitter, etc.

..o encuentra algunos nuevos sqli en aplicaciones fb y fb, jeje. 🙂

Andreas, también he estado buscando una solución elegante “email-to-id” y no pude encontrar ninguna. Sin embargo, como dijiste, el raspado de la pantalla no es una mala idea en este caso, porque los correos electrónicos son únicos y obtienes una sola coincidencia o ninguna. Mientras Facebook no cambie drásticamente su página de búsqueda, lo siguiente será el truco:

 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(); } 

ADVERTENCIA: respuesta antigua y desactualizada. No utilice


Creo que tendrás que ir por tu última solución, raspando la página de resultados de la búsqueda, porque solo puedes buscar por correo electrónico con la API a los usuarios que hayan autorizado tu aplicación (y necesitarás una porque el token de ese FB proporciona en los ejemplos tiene una fecha de caducidad y necesita permisos extendidos para acceder al correo electrónico del usuario).

El único enfoque que no he probado, pero creo que es limitado de la misma manera, es FQL. Algo como

 SELECT * FROM user WHERE email 'your@email.com' 

Esto parece una tarea bastante fácil, ya que Facebook no oculta mis correos electrónicos o teléfonos de los usuarios. Así que aquí está la función de análisis html en PHP con 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 } 

Primero, te agradezco # 57ar7up y agregaré el siguiente código que ayuda a encontrar el número de teléfono devuelto.

 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\d+)\,/', $data, $matches); if(isset($matches["fbUserId"]) && $matches["fbUserId"] != ""){ $fbUserId = $matches["fbUserId"]; $params = array($query,$fbUserId); }else{ $fbUserId = ""; $params = array($query,$fbUserId); } return $params; }