FacebookのAPIを使用して、ユーザーがFacebookページまたはURLが好きかどうかを確認する方法


102

私は夢中になると思います。うまく動かない。
ユーザーがiFrameアプリでJavaScriptを使用して自分のページを気に入ったかどうかを確認したいだけです。

FB.api({
    method:     "pages.isFan",
    page_id:        my_page_id,
},  function(response) {
        console.log(response);
        if(response){
            alert('You Likey');
        } else {
            alert('You not Likey :(');
        }
    }
);

これは次を返します:False
しかし、私は自分のページのファンなので、trueを返しませんか?


回答:


101

私もこれで髪を引き裂いた。コードが機能するのは、ユーザーが理想的ではない拡張アクセス許可をユーザーが付与した場合のみです。

ここに別のアプローチがあります。

簡単に言えば、OAuth 2.0キャンバスの詳細オプションをオンにすると、Facebookはタブアプリ$_REQUEST['signed_request']内でリクエストされたすべてのページとともにを送信します。そのsigned_requestを解析すると、ユーザーがページを気に入ったかどうかなど、ユーザーに関する情報を取得できます。

function parsePageSignedRequest() {
    if (isset($_REQUEST['signed_request'])) {
      $encoded_sig = null;
      $payload = null;
      list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
      $sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
      $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
      return $data;
    }
    return false;
  }
  if($signed_request = parsePageSignedRequest()) {
    if($signed_request->page->liked) {
      echo "This content is for Fans only!";
    } else {
      echo "Please click on the Like button to view this tab!";
    }
  }

12
警告:Facebookプロモーションガイドラインを読んでから、このようなページ(コンテストエントリなど)を「乱用」する前に読んでください。「#3 Facebookの機能をプロモーションの登録または入力メカニズムとして使用することはできません。たとえば、ページを高く評価したり、プレイスにチェックインしたりしても、プロモーションの参加者を自動的に登録または入力することはできません。」- facebook.com/promotions_guidelines.php
クリス・ヤコブ

1
返されたオブジェクトから実際にpagesプロパティを取得していないのですが、このメソッドはもう使用できませんか?
Casey Flynn

17
@Chris-明確にしたかったのですが、最初に好みのページでエントリーを条件付けることができます。好みの行為はエントリーメカニズムではありませんが、入る前に好みを強制することができます。
Adam Pedley

4
@アダム-あなたの説明は正しいです。Facebookでは、アプリがコンテンツに「いいね」のアクセスを許可しています。たとえば、これは許可されています:「コンテストのエントリーフォームを見るのが好きです」。そして、これは許可されていません:「私たちのように、あなたは自動的に私たちの競争に参加します」。
Chris Jacob

3
の有効性をチェックしていませんsigned_request。これは危険なアプローチです。アプリケーションシークレットに対してチェックする必要があります。詳細については、この回答を確認してください
ifaour

19

(PHP)を使用できます

$isFan = file_get_contents("https://api.facebook.com/method/pages.isFan?format=json&access_token=" . USER_TOKEN . "&page_id=" . FB_FANPAGE_ID);

次の3つのいずれかが返されます。

  • 文字列true文字列false json
  • トークンの場合のエラーのフォーマット済み応答
  • またはpage_idが無効です

これを実現するためのトークンを使用しない唯一の方法は、投稿されたsigned_request Jason Siffringを使用することだと思います。PHP SDKを使用する私のヘルパー:

function isFan(){
    global $facebook;
    $request = $facebook->getSignedRequest();
    return $request['page']['liked'];
}

17

あなたはそれをJavaScriptで行うことができます(同様の質問への@dwarfyの応答から構築する):

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <style type="text/css">
      div#container_notlike, div#container_like {
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : 'YOUR_APP_ID', // App ID
          channelUrl : 'http(s)://YOUR_APP_DOMAIN/channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        FB.getLoginStatus(function(response) {
          var page_id = "YOUR_PAGE_ID";
          if (response && response.authResponse) {
            var user_id = response.authResponse.userID;
            var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
            FB.Data.query(fql_query).wait(function(rows) {
              if (rows.length == 1 && rows[0].uid == user_id) {
                console.log("LIKE");
                $('#container_like').show();
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            });
          } else {
            FB.login(function(response) {
              if (response && response.authResponse) {
                var user_id = response.authResponse.userID;
                var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
                FB.Data.query(fql_query).wait(function(rows) {
                  if (rows.length == 1 && rows[0].uid == user_id) {
                    console.log("LIKE");
                    $('#container_like').show();
                  } else {
                    console.log("NO LIKEY");
                    $('#container_notlike').show();
                  }
                });
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            }, {scope: 'user_likes'});
          }
        });
      };

      // Load the SDK Asynchronously
      (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
      }(document));
    </script>

    <div id="container_notlike">
      YOU DON'T LIKE ME :(
    </div>

    <div id="container_like">
      YOU LIKE ME :)
    </div>

  </body>
</html>

サーバーのchannel.htmlファイルには、次の行のみが含まれています。

 <script src="//connect.facebook.net/en_US/all.js"></script>

そこには少しコードの重複がありますが、あなたは考えを理解します。これにより、ユーザーが最初にページにアクセスしたときにログインダイアログがポップアップします(これは厳密には理想的ではありませんが、機能します)。その後の訪問では、何もポップアップするべきではありません。


javascript 2.7 sdk廃止予定
Kamal Kumar

こんにちは@DINJASご回答ありがとうございます。上記のコードはFacebookで問題なく機能しています。Instagram、twitter、linkdnへのリンクはありますか
shivashankar m

@shivashankarm正直、わかりません。私はこの回答を投稿して以来、このようなことをする必要はありませんでした。
忍者

16

この投稿はかなり長い間ここにありますが、解決策は純粋なJSではありません。しかしジェイソンは、権限を要求することは理想的ではないことに留意ユーザーが明示的に拒否することができるので、私はそれは良いことを検討してください。私はまだこのコードを投稿していますが、(ほぼ)同じことがifaourの別の投稿でも見られます。詳細にあまり注意を払わずに、これをJSのみのバージョンと考えてください。

基本的なコードはかなり単純です:

FB.api("me/likes/SOME_ID", function(response) {
    if ( response.data.length === 1 ) { //there should only be a single value inside "data"
        console.log('You like it');
    } else {
        console.log("You don't like it");
    }
});

または、me他の誰かの適切なUserIDに置き換えます(これを行うには、以下のアクセス許可を変更する必要がある場合がありますfriends_likes)。前述のとおり、基本的なアクセス許可以上のものが必要です。

FB.login(function(response) {
    //do whatever you need to do after a (un)successfull login         
}, { scope: 'user_likes' });

3

ユーザーが「いいね!」ボタンを押したときに、jqueryを使用してデータを送信します。

<script>
  window.fbAsyncInit = function() {
    FB.init({appId: 'xxxxxxxxxxxxx', status: true, cookie: true,
             xfbml: true});

                 FB.Event.subscribe('edge.create', function(href, widget) {
$(document).ready(function() { 

var h_fbl=href.split("/");
var fbl_id= h_fbl[4]; 


 $.post("http://xxxxxx.com/inc/like.php",{ idfb:fbl_id,rand:Math.random() } )

}) });
  };

</script>

注:非表示の入力テキストを使用してボタンのIDを取得できます。私の場合は、「var fbl_id = h_fbl [4];」のURL自体から取得します。idの例があるので:url:http ://mywebsite.com/post/22/some-tittle

そのため、URLを解析してIDを取得し、それをlike.phpファイルの私のデータベースに挿入します。このように、誰かがいいねボタンを押すかどうかを知るために許可を求める必要はありませんが、誰がそれを押すかを知りたい場合は、許可が必要です。


1
これが、アプリケーションに接続していない場合の唯一の方法です
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.