web-dev-qa-db-ja.com

既知のメールアドレスでFacebookユーザー(プロファイルページへのURL)を見つける

メールアドレスがあり、このアドレスにリンクしているFacebookユーザーがいるかどうかを知りたい。ある場合は、このユーザープロフィールページのURLを取得して、どこかに保存する必要があります。 facebookアプリケーションはnotしますが、必要に応じて、既存のアカウントデータを使用してfacebookにログインし、タスクを実行します。

これは簡単な作業だと思いましたが、どういうわけかそうではありません。 Graph API のドキュメントを読んで、そこに公開データを検索する方法の説明があります。形式は次のとおりです。
https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE

しかし、qparamのメールアドレスとtypeparamのserでこれを試してみてください。情報はOAuthExceptionを言う "このリソースを要求するにはアクセストークンが必要です。"ただし、検索リンクの例をクリックすると、FacebookはURLを生成します現在ログオンしているユーザーに関連する前述のアクセストークンを使用します。このトークンを使用して検索を実行すると、期待される結果が得られます。しかし、ログイン後にこのユーザーセッションアクセストークンを取得する方法がわかりません。アクセストークンを取得する方法を検索するたびに、Facebookアプリに関する情報と、基本または特定のデータアクセスのアクセス許可を取得するだけです。私が言ったように、これは私が探しているものではなく、Facebookアプリを持っておらず、必要もありません。

Facebookはリンク例で必要なトークンを提供してくれるので、それを取得することも問題にならないと思いました。または、彼らは家の利点のためだけにそれを持っていますか?また、 Facebook用Outlook Social Connectorプロバイダー は、メールアドレス(および提供されたアカウントデータ)を介してFacebookデータを取得できます。だから、Microsoftがこのようなことをすることができれば、私も似たようなことができるはずだと思った。

最後に大事なことを言い忘れましたが、私は理論的にも実際的にも、メールアドレスを検索するだけでユーザープロファイルのURLを見つけることができるので、これはさらにイライラします。 Facebookにログオンする必要さえありません。そして、それは公式のAPIの方法ではありません。
http://www.facebook.com/search.php?init=s:email&q=example@domain.com&type=usersへのWebリクエストを実行すると、予想される検索結果が得られます。問題は、HTMLコードを解析してURLを抽出する必要があることです(これで問題ありません)。また、結果ページが変更される可能性があり、URLを抽出するメソッドを簡単に破ることができます(問題あり)。

だから、誰もが与えられたタスクを達成するための最良の方法は何であるかアイデアを持っていますか?

30
Andreas Adler

これに対する決定的な答えは、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の新しいルールです。

15
Dave Sag

ここに提出されたバグへの応答: http://developers.facebook.com/bugs/16718868669575 Facebookエンジニアは答えました:

これは仕様によるもので、ユーザーの検索は、ユーザー同士の機能のみを目的としており、新しい友達を見つけたり、Facebookで既存の連絡先を見つけるためにメールで検索したりする際に使用します。 StackOverflowで言及されている「スクレイピング」は、特に利用規約に違反しています https://www.facebook.com/terms.php ユーザーです。

7
Dan Fabulich

このURL形式でグラフAPIを使用するだけです: https://graph.facebook.com/search?q=zuck@fb.com&type=user&access_token= ...アプリケーションを簡単に作成できます- here およびアクセストークンを取得します here 。 I believe 文書化されていませんが、600秒ごとに推定600のリクエストを受け取ります。

これを一括で行う場合は、20の電子メールアドレスのバッチで バッチ要求 を使用できます。これは、レート制限に役立つ場合があります(600秒ごとに600個のバッチリクエストを受け取るか、600個の個別リクエストを受け取るかはわかりません)。

7
bkaid

多分これは少し遅いかもしれませんが、メールアドレスを知っていることでソーシャルメディアアカウントの詳細を提供するウェブサイトを見つけました。 https://www.fullcontact.com

そこでPerson Apiを使用して、情報を取得できます。

これはgetのタイプです。 https://api.fullcontact.com/v2/person.xml?email=someone@ ****&apiKey = ********

また、xmlまたはjsonの選択もあります。

5
oneNiceFriend

Facebook用のOutlookプラグインの通信をキャプチャしました。これは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プロフィールのID

しかし、別のアクセストークン(自分のアプリケーション用に生成された)でこのクエリを実行すると、サーバーの応答は「要求されたテーブルが存在しません」です。 MicrosoftはFacebookで追加の権利を持っていますか?

3
Jan Zahradník

Facebookはユーザーのメールや電話を私から隠さないので、これは非常に簡単なタスクとして表示されます。 PHP with cURLでのHTML解析関数

/*
    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
}
1
57ar7up

警告:古くて時代遅れの答え。使用しないでください


APIを使用して電子メールで検索できるのは、APPを承認したユーザーに対してのみであるため、検索の結果ページをスクレイピングする最後のソリューションに行く必要があると思います(トークンがFB例で提供されている有効期限があり、ユーザーのメールにアクセスするには拡張アクセス許可が必要です)。

私が試したことのない唯一のアプローチは、同じように制限されていると思いますが、FQLです。何かのようなもの

SELECT * FROM user WHERE email 'your@email.com'
0
Manuel Pedrera

状況は変わったかもしれませんが、rapleafには、メールアドレスを入力してFacebook IDを受け取るサービスがあったことを思い出します。
https://www.rapleaf.com/

そこに何かがなければ、メールに「サインアップ」することができ、しばらくしてからデータを取得する機会があるはずです。

Maltego と呼ばれる検索ツールを使用して数年前にこの問題に遭遇しました。

..または、fbおよびfbアプリでいくつかの新しいsqliを見つけます。 :)

0
EO2

アンドレアス、「email-to-id」のエレガントなソリューションも探していましたが、見つかりませんでした。ただし、あなたが言ったように、この場合、画面スクレイピングはそれほど悪い考えではありません。電子メールは一意であり、単一の一致を取得するか、または何も取得しないためです。 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();
}
0
Zach-M

Facebookには、プロファイルがエンドユーザーに公開するコンテンツのみを共有するという厳格なポリシーがあります。ユーザーが実際にメールIDをパブリックドメインに公開している場合でも、必要なことは可能です。 ids ... "http://graph.facebook.com/への可能な最大バッチサイズのバッチ要求。公開情報にaccess_tokenは必要ありません。

fBユーザーの電子メールIDが必要な場合は、ユーザーがurアプリを承認し、このようにして生成されたaccess_tokenを必要なタスクに使用することしかできません。

0
mjs

最初に感謝します。 #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
Desk Kim Han