web-dev-qa-db-ja.com

Facebook API:ページの好きな人/ページを好きな人を獲得する

特定のページまたはそのファンが好きなユーザーのリストを取得したいと思います。

FB APIドキュメントには、ソーシャルグラフを使用して特定のページのファンの数を取得できるが、ファンのリストは取得できないと記載されています。

ここでの議論 Facebookファン名の取得 は、SELECT user_id FROM like WHERE object_id="YOUR PAGE ID"のようなFQLクエリを使用してページを好きな人の数を取得できることを示唆していますが、同じページに対しては空の応答を返します「{}」。

だから、私はこれができるかどうか誰にもアイデアがあるのだろうかと思っていました。

68
pesho

トークンのないファンページのプロファイルIDでファンリストの一部を取得する「方法」があります。

  1. パブリックグラフデータでファンページのIDを取得: http://graph.facebook.com/cocacola -Coca-Colaには40796308305があります。 更新2016.04.30:Facebookは、グラフを介してpage_idを取得するためにアクセストークンを必要とするため、ファンページHTML構文を解析して、https://www.facebook.com/{PAGENAME}ファンページに存在するogタグに基づく以下の例のように。
  2. いくつかの変更されたパラメーターを使用して、コカコーラの「ライクプラグイン」iframeディスプレイを直接取得します。 http://www.facebook.com/plugins/fan.php?connections=100&id=40796308305
  3. ここでページのソースを確認してください。プロフィールへのリンクがある多くのファンがいます。そこでは、プロフィールIDまたはニックネームを見つけることができます: http://www.facebook.com/michal.semeniuk
  4. プロファイルIDのみに関心がある場合は、グラフAPIを再度使用します。プロファイルIDが直接表示されます。 http://graph.facebook.com/michal.semeniuk 更新2016.04.30:Facebookでは、このような情報を取得するためにアクセストークンが必要になりました。最初のステップでメタタグが親友であるように、プロファイルHTML構文を解析できます:<meta property="al:Android:url" content="fb://profile/{PROFILE_ID}" />

そして今が最良の部分です。ポイント2でリンクを更新(F5)してみてください。コカコーラの別のファンの新しいフルセットがあります。ユニークな人だけを連れて行くと、ファンのニース、ほぼ完全なリストを取得することができます。

-更新2013.08.06-

準備ができているPHPスクリプトを使用してファンを獲得してみませんか? :)

UPDATE 2016.04.30:FacebookがグラフAPIから公開データを取得するためにアクセストークンを要求するようになった後、新しいメソッドを使用するようにサンプルスクリプトを更新しました。

function fetch_fb_fans($fanpage_name, $no_of_retries = 10, $pause = 500000 /* 500ms */){
    $ret = array();
    // prepare real like user agent and accept headers
    $context = stream_context_create(array('http' => array('header' => 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-encoding: gzip, deflate, sdch\r\nAccept-language: en-US,en;q=0.8,pl;q=0.6\r\n')));
    // get page id from facebook html og tags for mobile apps
    $fanpage_html = file_get_contents('https://www.facebook.com/' . $fanpage_name, false, $context);
    if(!preg_match('{fb://page/(\d+)}', $fanpage_html, $id_matches)){
        // invalid fanpage name
        return $ret;
    }
    $url = 'http://www.facebook.com/plugins/fan.php?connections=100&id=' . $id_matches[1];
    for($a = 0; $a < $no_of_retries; $a++){
        $like_html = file_get_contents($url, false, $context);
        preg_match_all('{href="https?://www\.facebook\.com/([a-zA-Z0-9\._-]+)" class="link" data-jsid="anchor" target="_blank"}', $like_html, $matches);
        if(empty($matches[1])){
            // failed to fetch any fans - convert returning array, cause it might be not empty
            return array_keys($ret);
        }else{
            // merge profiles as array keys so they will stay unique
            $ret = array_merge($ret, array_flip($matches[1]));
        }
        // don't get banned as flooder
        usleep($pause);
    }
    return array_keys($ret);
}

print_r(fetch_fb_fans('TigerPolska', 2, 400000));
71
s3m3n

新しいFacebook検索を使用してファンを獲得できます: https://www.facebook.com/search/321770180859/likers?ref=about

41
Oleg

これを使って。

https://www.facebook.com/browse/?type=page_fans&page_id=<your page id>

最新のいいね!のうち最大500個が返されます。

http://www.facebook.com/browse/?type=page_fans&page_id=<your page id>&start=400

各ページには100人のファンがいます。開始値を(0、100、200、300、400)に変更して、最初の500を取得します。開始値が401以上の場合、ページは空白になります:(

10
Somnath Muluk

Facebookのドキュメント によると、ページのすべてのファンを獲得することは不可能です。

Facebookページのすべてのファンのリストを取得することはできませんが、特定の人がページを高く評価したかどうかはわかります。

7
Steven Delrue

S3m3nの答えとして、Facebookファンプラグイン(例: LAMODA )には現在制限があり、継続的なリクエストで新しいファンがますます少なくなっています。変更したPHPスクリプトを試して結果を視覚化できます。 https://Gist.github.com/liruqi/7f425bd570fa8a7c73be#file-facebook_fans_by_plugin-php

別のアプローチは、Facebookのグラフ検索です。検索結果ページで: 「Lamoda」という名前のページが好きな人 、Chromeコンソールを開いてJavaScriptを実行します。

var run = 0;
var mails = {}
total = 3000; //滚动次数,可以自己根据情况定义

function getEmails (cont) {
    var friendbutton=cont.getElementsByClassName("_ohe");
    for(var i=0; i<friendbutton.length; i++) {
        var link = friendbutton[i].getAttribute("href");

        if(link && link.substr(0,25)=="https://www.facebook.com/") {
            var parser = document.createElement('a');
            parser.href = link;
            if (parser.pathname) {
                path = parser.pathname.substr(1);
                if (path == "profile.php") {
                    search = parser.search.substr(1);
                    var args = search.split('&');
                    email = args[0].split('=')[1] + "@facebook.com\n";
                } else {
                    email = parser.pathname.substr(1) + "@facebook.com\n";
                }
                if (mails[email] > 0) {
                    continue;
                }
                mails[email] = 1;
                console.log(email);
            }
        }
    }
}

function moreScroll() {
    var text="";
    containerID = "BrowseResultsContainer"
    if (run > 0) {
        containerID = "fbBrowseScrollingPagerContainer" + (run-1);
    }
    var cont = document.getElementById(containerID);
    if (cont) {
        run++;
        var id = run - 2;
        if (id >= 0) {
            setTimeout(function() {
                containerID = "fbBrowseScrollingPagerContainer" + (id);
                var delcont = document.getElementById(containerID);
                if (delcont) {
                getEmails(delcont);
                delcont.parentNode.removeChild(delcont);
                }
                window.scrollTo(0, document.body.scrollHeight - 10);
            }, 1000);
        }
    } else {
        console.log("# " + containerID);
    }
    if (run < total) {
        window.scrollTo(0, document.body.scrollHeight + 10);
    }
    setTimeout(moreScroll, 2000);
}//1000为间隔时间,也可以根据情况定义

moreScroll();

新しいファンをロードし、ユーザーID /メールを印刷し、古いDOMノードを削除してページのクラッシュを回避します。このスクリプトを見つけることができます こちら

3
liruqi

このページ https://developers.facebook.com/docs/reference/fql/like/ が書いたので、ファンリストを取得できません。

「Post、Video、Note、Link、Photo、およびAlbum Graph APIオブジェクトには、いいね!と呼ばれる同等の接続が含まれています。」

注:fql like query is deprecated

1

技術的には、このFQLクエリは機能するはずですが、何らかの理由で、Facebookはインデックスがないためにそれを許可しません。それがポリシーによるものなのか、それとも忘れただけなのかわかりません。

SELECT uid FROM page_fans WHERE page_id="YOUR_PAGE_ID"
0
Robin Smidsrød