사용자가 Facebook의 API를 사용하여 내 Facebook 페이지 또는 URL을 좋아하는지 확인하는 방법


102

미쳐가는 것 같아요. 작동하지 않습니다.
사용자가 iFrame앱 에서 자바 스크립트로 내 페이지를 좋아했는지 확인하고 싶습니다 .

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.0Canvas 고급 옵션 을 켜면 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
반환 된 개체에서 실제로 페이지 속성을 얻지 못합니다.이 메서드가 더 이상 가능하지 않습니까?
Casey Flynn

17
@Chris-명확하게하고 싶었습니다. 먼저 페이지를 좋아하는 항목을 조건으로 지정할 수 있습니다. 좋아요의 행위는 진입 메커니즘이 될 수 없지만 진입하기 전에 좋아요를 강제 할 수 있습니다.
아담 Pedley

4
@Adam-귀하의 설명이 정확합니다. Facebook은 앱이 콘텐츠에 대한 "Like Gate"액세스를 허용합니다. 예를 들어, 다음과 같이 허용됩니다. "대회 참가 양식을 보려면 좋아요를 누르십시오". 그리고 이것은 허용되지 않습니다 : "우리처럼 당신은 우리의 경쟁에 자동으로 참가할 것입니다".
크리스 야곱

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);

다음 세 가지 중 하나를 반환합니다.

  • 문자열 참 문자열 거짓 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가 손상되었습니다.
카말 쿠마을

안녕하세요 @DINJAS 귀하의 답변에 감사드립니다 위 코드는 페이스 북에서 잘 작동합니다. 인스 타 그램, 트위터, 링크드 인 링크가 있나요?
shivashankar m

@shivashankarm 솔직히 모르겠어요. 이 답변을 게시 한 이후로 이와 같은 작업을 할 필요가 없었습니다.
dinjas

16

이 게시물은 꽤 오랫동안 여기에 있었지만 솔루션은 순수한 JS가 아닙니다. Jason 은 권한 요청이 이상적이지 않다고 언급 했지만 사용자가 명시 적으로 거부 할 수 있기 때문에 좋은 일이라고 생각합니다. 나는 여전히이 코드를 게시하지만 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다른 사람의 적절한 사용자 ID로 바꾸십시오 (예 :이 작업을 수행하려면 아래 권한을 변경해야 할 수도 있습니다 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 파일의 내 databse에 삽입합니다. 이런 식으로 누군가가 좋아요 버튼을 눌렀는지 알기 위해 권한을 요청할 필요가 없지만 누가 누를 것인지 알고 싶다면 권한이 필요합니다.


1
이것이 귀하의 응용 프로그램과 연결되지 않은 경우 유일한 방법입니다
Kevin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.