J'ai une adresse e-mail et je veux savoir s'il y a un utilisateur Facebook associé à cette adresse. Si tel est le cas, je souhaite récupérer l'URL sur la page de profil de cet utilisateur et l'enregistrer quelque part . Je n'ai pas une application facebook, mais, si nécessaire, j'utiliserais les données de compte existantes pour me connecter. facebook et effectuer la tâche.
Je pensais que ce serait une tâche facile, mais ce n’est pas le cas. J'ai lu la documentation Graph API et vous y trouverez des instructions sur la recherche de données publiques. Il dit que le format est:https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE
Mais essayer cela avec une adresse e-mail dans le paramètre q et utilisateur dans le paramètre type sans plus d'informations aboutit à une OAuthException disant "Un accès Un jeton est requis pour demander cette ressource. " Cependant, si vous cliquez sur l'exemple de liens de recherche, Facebook génère une URL contenant le jeton d'accès mentionné et lié à l'utilisateur actuellement connecté. Effectuer des recherches avec ce jeton donne les résultats attendus. Mais je ne peux pas comprendre comment obtenir ce jeton d'accès à la session utilisateur après la connexion. À chaque fois que je cherche comment obtenir un jeton d'accès, je ne trouve que des informations concernant les applications Facebook et la récupération des autorisations pour un accès de base ou spécifique aux données. Comme je l'ai dit, ce n'est pas ce que je recherche, car je n'ai ni n'a besoin d'une application facebook.
Puisque Facebook m'a donné le jeton nécessaire dans les exemples de liens, j'ai pensé que cela ne devrait pas être un problème pour l'obtenir aussi. Ou l'ont-ils seulement parce qu'ils ont l'avantage d'être à la maison? De plus, le fournisseur Outlook Social Connector pour Facebook est capable de récupérer des données Facebook simplement via une adresse e-mail (et les données de compte fournies). Je me suis donc dit que si Microsoft pouvait faire ce genre de choses, je devrais être aussi capable de faire des choses semblables.
Enfin, c’est le plus frustrant puisque, théoriquement et pratiquement, je suis déjà en mesure de trouver l’url du profil des utilisateurs en recherchant simplement l’adresse électronique. Je n'ai même pas besoin d'être connecté à Facebook. Et ce n'est pas la manière officielle de l'API.
Si j'exécute une requête Web sur http://www.facebook.com/search.php?init=s:email&[email protected]&type=users
, j'obtiens le résultat de recherche attendu. Le problème est que je dois analyser le code HTML et extraire l'URL (ce n'est pas grave) et que la page de résultat est susceptible de changer et peut facilement casser ma méthode pour extraire l'URL (problématique).
Alors, est-ce que quelqu'un a une idée de la meilleure façon d'accomplir la tâche?
La réponse définitive à cette question provient de Facebook eux-mêmes. En poste aujourd'hui à https://developers.facebook.com/bugs/335452696581712 un développeur Facebook dit
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).
Donc, hélas, la réponse simple est que vous ne pouvez plus rechercher d’utilisateurs par leur adresse électronique. C'est nul, mais ce sont les nouvelles règles de Facebook.
En réponse au bogue déposé ici: http://developers.facebook.com/bugs/167188686695750 un ingénieur de Facebook a répondu:
Ceci est voulu par la conception même, la recherche d’utilisateur est destinée à être fonction d’utilisateur à utilisateur, pour rechercher de nouveaux amis ou pour rechercher par courrier électronique des contacts existants sur Facebook. Le "scraping" mentionné sur StackOverflow est spécifiquement contre nos Conditions d'utilisation https://www.facebook.com/terms.php et en fait, le seul moyen légitime de rechercher des utilisateurs sur Facebook est lorsque vous êtes un utilisateur .
Utilisez simplement l'API graphique avec ce format d'URL: https://graph.facebook.com/[email protected]&type=user&access_token= ... Vous pouvez facilement créer une application ici et prenez un jeton d'accès pour cela ici . Je crois vous recevez environ 600 demandes par 600 secondes, bien que cela ne soit pas documenté.
Si vous le faites en bloc, vous pouvez utiliser demandes de lot par lots de 20 adresses électroniques. Cela peut aider avec des limites de taux (je ne suis pas sûr si vous obtenez 600 demandes de lot par 600 secondes ou 600 demandes individuelles).
C’est peut-être un peu tard mais j’ai trouvé un site Web qui donne les détails du compte sur les réseaux sociaux par adresse électronique connue. C'est https://www.fullcontact.com
Vous pouvez utiliser Person Api ici et obtenir les informations.
C'est un type d'obtention: https://api.fullcontact.com/v2/person.xml?email=someone@ **** & apiKey = ********
Aussi, il y a le choix xml ou json.
J'ai capturé la communication du plug-in Outlook pour Facebook et voici la demande 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))"}
où
TOKEN - jeton d'accès valide
EMAIL_HASH - combinaison du hachage CRC32 et MD5 de l'adresse électronique recherchée au format crc32_md5
MY_ID - ID du profil facebook du propriétaire du jeton d'accès
Mais lorsque j'exécute cette requête avec un jeton d'accès différent (généré pour ma propre application), la réponse du serveur est la suivante: "La table demandée n'existe pas". Je n'ai pas trouvé non plus l'e-mail de table dans la documentation de l'API Facebook. Microsoft a-t-il des droits supplémentaires sur Facebook?
AVERTISSEMENT: réponse ancienne et obsolète. Ne pas utiliser
Je pense que vous devrez chercher votre dernière solution, en grattant la page de résultats de la recherche, car vous ne pouvez effectuer une recherche par courrier électronique avec l'API que sur les utilisateurs qui ont autorisé votre APP (et vous en aurez besoin d'une, car le jeton que FB fournit dans les exemples une date d'expiration et vous avez besoin d'autorisations étendues pour accéder à la messagerie de l'utilisateur).
La seule approche que je n’ai pas essayée, mais je pense que c’est limité de la même manière, est FQL. Quelque chose comme
SELECT * FROM user WHERE email '[email protected]'
Peut-être que les choses ont changé, mais je me souviens que rapleaf avait un service dans lequel vous entrez une adresse e-mail et vous pouviez recevoir un identifiant facebook.
https://www.rapleaf.com/
Si quelque chose ne s'y trouvait pas, on pourrait "s'inscrire" avec le courrier électronique et il devrait avoir une chance d'obtenir les données après un certain temps.
Je suis tombé sur ce problème en utilisant un outil de recherche appelé Maltego il y a quelques années.
L'application utilise de nombreux types de "transformations", et quelques-unes sont liées à Facebook et Twitter, etc.
..ou trouver quelques nouveaux sqli est sur fb et les applications fb, hehe. :)
Cela semble être une tâche assez facile, car Facebook ne me cache pas les courriels ni les téléphones des utilisateurs. Donc, voici la fonction d'analyse HTML sur PHP avec 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
}
Andreas, Je recherchais également une solution "email-to-id" et je ne pouvais pas en trouver ... .. Cependant, comme vous l'avez dit, le grattage d'écran n'est pas une si mauvaise idée dans ce cas, parce que les courriels sont uniques et que vous obtenez une correspondance unique ou aucune. Tant que Facebook ne changera pas radicalement sa page de recherche, voici ce qui fera l'affaire:
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();
}
Facebook a une politique stricte qui consiste à ne partager que le contenu qu'un profil rend public à l'utilisateur final. Néanmoins, ce que vous voulez est possible si l'utilisateur a réellement laissé l'identifiant de l'e-mail ouvert au domaine public ... est d’envoyer des demandes de lot pour la taille de lot maximale possible aux ids ... "http://graph.facebook.com/ .. et d’analyser le résultat pour vérifier si le courrier électronique existe et s’il existe, il correspond alors à celui de votre choix. .. vous n'avez besoin d'aucun access_token pour l'information publique ..
au cas où vous voudriez que l’identifiant email d’un utilisateur FB soit le seul moyen possible, c’est qu’ils autorisent votre application et que vous puissiez ensuite utiliser le code d’accès ainsi généré pour la tâche requise.
D'abord je vous remercie. # 57ar7up et j'ajouterai le code suivant qui aide à trouver le numéro de téléphone de retour.
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;
}