Cách kiểm tra xem người dùng có thích Trang hoặc URL Facebook của tôi hay không bằng cách sử dụng API của Facebook


102

Tôi nghĩ tôi điên mất. Tôi không thể có được nó để làm việc.
Tôi chỉ muốn kiểm tra xem người dùng có thích trang của tôi bằng javascript trong một iFrameứng dụng hay không.

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 :(');
        }
    }
);

Điều này trả về: Sai
Nhưng tôi là một người hâm mộ trang của tôi nên nó không phải là sự thật sao ?!


Câu trả lời:


101

Tôi cũng xé tóc mình ra vì cái này. Mã của bạn chỉ hoạt động nếu người dùng đã cấp quyền mở rộng cho điều đó không lý tưởng.

Đây là một cách tiếp cận khác.

Tóm lại, nếu bạn bật OAuth 2.0tùy chọn dành cho Canvas nâng cao, Facebook sẽ gửi $_REQUEST['signed_request']cùng với mọi trang được yêu cầu trong ứng dụng tab của bạn. Nếu bạn phân tích cú pháp đó sign_request, bạn có thể nhận được một số thông tin về người dùng, bao gồm cả việc họ có thích trang hay không.

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
Cảnh báo: Đọc Nguyên tắc khuyến mại của Facebook trước khi cố gắng "lạm dụng" điều này, ví dụ như trang để đăng ký cạnh tranh. "# 3 Bạn không được sử dụng các tính năng hoặc chức năng của Facebook làm cơ chế đăng ký hoặc tham gia chương trình khuyến mãi. Ví dụ: hành động thích Trang hoặc đăng ký Địa điểm không thể tự động đăng ký hoặc nhập người tham gia khuyến mại." - facebook.com/promotions_guidelines.php
Chris Jacob

1
Tôi thực sự không nhận được thuộc tính trang từ đối tượng được trả về, phương pháp này không còn khả thi?
Casey Flynn

17
@Chris - chỉ muốn làm rõ, trước tiên bạn có thể đặt mục nhập là thích trang. Hành động thích không thể là cơ chế nhập cảnh, nhưng bạn có thể thực thi hành động thích trước khi nhập.
Adam Pedley

4
@Adam - lời giải thích của bạn là chính xác. Facebook cho phép các ứng dụng "Like Gate" truy cập vào nội dung. Ví dụ - điều này được CHO PHÉP: "Thích Chúng tôi để xem biểu mẫu đăng ký cuộc thi". Và điều này KHÔNG ĐƯỢC PHÉP: "Giống như Chúng tôi và bạn sẽ được tự động tham gia vào cuộc thi của chúng tôi".
Chris Jacob

3
Bạn không kiểm tra tính hợp lệ của signed_request. Đây là một cách tiếp cận nguy hiểm. Bạn nên kiểm tra nó với bí mật ứng dụng của bạn. Kiểm tra này câu trả lời để biết thêm thông tin
ifaour

19

Bạn có thể sử dụng (PHP)

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

Điều đó sẽ trả về một trong ba:

  • string true string false json
  • phản hồi có định dạng của lỗi nếu mã thông báo
  • hoặc page_id không hợp lệ

Tôi đoán rằng cách duy nhất không sử dụng mã thông báo để đạt được điều này là với Jason Siffring đã đăng_đầu_điều_kiện vừa được đăng. Người trợ giúp của tôi bằng cách sử dụng SDK PHP:

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

17

Bạn có thể làm điều đó trong JavaScript như vậy (Dựa trên phản hồi của @warfy cho một câu hỏi tương tự ):

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

Trong đó tệp channel.html trên máy chủ của bạn chỉ chứa dòng:

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

Có một chút trùng lặp mã trong đó, nhưng bạn có thể hiểu được. Thao tác này sẽ bật lên hộp thoại đăng nhập lần đầu tiên người dùng truy cập trang (điều này không chính xác lý tưởng, nhưng hoạt động). Trong những lần truy cập tiếp theo, không có gì sẽ xuất hiện.


javascript 2.7 SDK nó được deprected
Kamal Kumar

Xin chào @DINJAS Cảm ơn câu trả lời của bạn, mã trên đang hoạt động tốt cho facebook. có bất kỳ liên kết nào đến instagram, twitter và linkdn không
shivashankar m

@shivashankarm Tôi thành thật không biết. Tôi đã không phải làm bất cứ điều gì như thế này kể từ khi tôi đăng câu trả lời này.
dinjas

16

Mặc dù bài đăng này đã ở đây khá lâu, nhưng các giải pháp không phải là JS thuần túy. Mặc dù Jason lưu ý rằng việc yêu cầu quyền không phải là lý tưởng, nhưng tôi coi đó là một điều tốt vì người dùng có thể từ chối nó một cách rõ ràng. Tôi vẫn đăng mã này, mặc dù (gần như) điều tương tự cũng có thể được nhìn thấy trong một bài đăng khác của ifaour . Hãy coi đây là phiên bản JS duy nhất mà không cần quá chú ý đến chi tiết.

Mã cơ bản khá đơn giản:

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

Thay vào đó, hãy thay thế mebằng UserID thích hợp của người khác (bạn có thể cần thay đổi các quyền bên dưới để thực hiện việc này, chẳng hạn như friends_likes) Như đã lưu ý, bạn cần nhiều hơn quyền cơ bản:

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

3

tôi sử dụng jquery để gửi dữ liệu khi người dùng nhấn nút thích.

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

Lưu ý: bạn có thể sử dụng một số văn bản đầu vào ẩn để lấy id của nút của bạn. Trong trường hợp của tôi, tôi lấy nó từ chính url trong "var fbl_id = h_fbl [4];" becasue có ví dụ id: url: http://mywebsite.com/post/22/some-tittle

vì vậy tôi phân tích cú pháp url để lấy id và sau đó chèn nó vào databse của tôi trong tệp like.php. Bằng cách này, bạn không cần phải yêu cầu quyền để biết nếu ai đó nhấn nút thích, nhưng nếu bạn không thể biết ai nhấn nút đó, thì bạn cần có quyền.


1
đây là cách duy nhất nếu họ đã không kết nối với ứng dụng của bạn
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.