32 votes

Trouver un utilisateur de Facebook (url de la page de profil) à partir d'une adresse électronique connue

J'ai une adresse électronique et je veux savoir si un utilisateur de Facebook est lié à cette adresse. Si c'est le cas, je veux récupérer l'url de la page de profil de cet utilisateur et la sauvegarder quelque part. Je fais no Je n'ai pas d'application facebook, mais, si nécessaire, j'utiliserais les données du compte existant 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 les API graphique et vous y trouverez des instructions sur la manière de rechercher des données publiques. Il est indiqué que le format est le suivant :
https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE

Mais en essayant de le faire avec une adresse électronique dans le champ q param et utilisateur dans le type param sans autre information aboutit à une Exception OAuth dire "Un jeton d'accès est nécessaire pour demander cette ressource." Cependant, si vous cliquez sur les liens de recherche de l'exemple, Facebook génère une url avec le jeton d'accès mentionné lié à l'utilisateur actuellement connecté. Les recherches effectuées avec ce jeton donnent les résultats escomptés. Mais je n'arrive pas à comprendre comment obtenir ce jeton d'accès à la session de l'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 l'accès aux données de base ou spécifiques. Comme je l'ai dit, ce n'est pas ce que je recherche, car je n'ai pas d'application Facebook et je n'en ai pas besoin.

Puisque Facebook me donne le jeton nécessaire dans les liens de l'exemple, j'ai pensé qu'il ne devrait pas y avoir de problème pour l'obtenir aussi. Ou est-ce qu'ils l'ont seulement parce qu'ils ont l'avantage du terrain ? Par ailleurs, le Outlook Social Connector Provider pour Facebook est en mesure de récupérer les données de Facebook à partir d'une simple adresse électronique (et des données de compte fournies). Je me suis donc dit que si Microsoft pouvait faire ce genre de choses, il devait être possible de faire des choses similaires.

Enfin, c'est d'autant plus frustrant que, théoriquement et pratiquement, je suis déjà capable de trouver l'url du profil d'un utilisateur en recherchant simplement son adresse e-mail. Je n'ai même pas besoin d'être connecté à Facebook. Et ce n'est pas la méthode officielle de l'API.
Si j'effectue une requête web à http://www.facebook.com/search.php?init=s:email&q=example@domain.com&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 qui n'est pas grave) et que la page de résultat est susceptible de changer et pourrait facilement casser ma méthode d'extraction de l'url (ce qui est problématique).

Quelqu'un a-t-il une idée de la meilleure façon d'accomplir cette tâche ?

1voto

Joe.M Points 346

Andreas, J'ai également cherché une solution élégante de type "email-to-id" et je n'en ai pas trouvé. Cependant, comme vous l'avez dit, le screen scraping n'est pas une si mauvaise idée dans ce cas, parce que les emails sont uniques et que vous obtenez soit une seule correspondance, soit aucune. Tant que Facebook ne change pas radicalement sa page de recherche, ce qui suit 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();
}

1voto

57ar7up Points 38

Cela semble être une tâche assez facile, car Facebook ne me cache pas les emails ou les téléphones des utilisateurs. Voici donc la fonction d'analyse html en 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
}

0voto

Manuel Pedrera Points 3199

AVERTISSEMENT : Réponse ancienne et périmée. Ne pas utiliser


Je pense que vous devrez opter pour votre dernière solution, le scraping de la page de résultat de la recherche, car vous ne pouvez effectuer une recherche par email avec l'API que pour les utilisateurs qui ont autorisé votre APP (et vous en aurez besoin car le jeton que FB fournit dans les exemples a une date d'expiration et vous avez besoin de permissions étendues pour accéder à l'email de l'utilisateur).

La seule approche que je n'ai pas essayée, mais je pense qu'elle est limitée de la même manière, est FQL. Quelque chose comme

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

0voto

mjs Points 419

Facebook a une politique stricte en matière de partage du contenu qu'un profil rend public à l'utilisateur final. Néanmoins, ce que vous souhaitez est possible si l'utilisateur a effectivement laissé son adresse électronique ouverte au domaine public... Vous pouvez essayer d'envoyer des requêtes par lot pour la taille de lot maximale possible aux identifiants... "http://graph.facebook.com/ ... et analyser le résultat pour vérifier si l'email existe et si c'est le cas, il correspond à celui que vous voulez... vous n'avez pas besoin d'un access_token pour l'information publique...

Si vous souhaitez obtenir l'adresse électronique d'un utilisateur de FB, la seule solution possible est qu'il autorise notre application et que vous puissiez utiliser l'access_token ainsi généré pour la tâche requise.

0voto

EO2 Points 329

Peut-être que les choses ont changé, mais je me souviens que rapleaf proposait un service où l'on entrait une adresse e-mail et où l'on recevait un identifiant Facebook.
https://www.rapleaf.com/

Si quelque chose ne s'y trouve pas, il est possible de s'inscrire en envoyant son adresse électronique, ce qui devrait permettre d'obtenir les données au bout d'un certain temps.

Je suis tombé sur ce document en utilisant un outil de recherche appelé Maltego il y a quelques années.
L'application utilise de nombreux types de "transformations", dont certaines sont liées à Facebook et Twitter, etc.

ou trouver de nouveaux sqli's sur fb et fb apps, hehe. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X