Как пейджинг в facebook javascript API работает?

Ваша обновленная система может быть нестабильной, так защитите все данные и т.д. перед продолжением. Можно попробовать некоторых или все следующее:

  • sudo apt-get clean
  • sudo apt-get autoremove
  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get -f install

, Если Вы получаете сообщения об ошибках, спросите.

24
задан luschn 10 September 2016 в 08:42
поделиться

2 ответа

1143 Ладно, кажется, что по простому вопросу много жалоб, и я все еще верю, что мой старый ответ проясняется. В любом случае, позволь мне присмотреть за тобой. :)

Первый : Я обнаружил, что вы не можете перейти на «предыдущую» страницу с первой страницы. В идеале я должен. Итак, вот ошибка, которую я подал, вы можете захотеть следовать: https://developers.facebook.com/bugs/391562790938294?browse=search_50fcac3ce094e7068176315

Секунда : если это сделано намеренно, вы не можете вернуться к «предыдущему» с первой страницы (потому что там нет предыдущего), но вы наверняка можете перейти к «Далее». Однако, поскольку API ведет себя как курсор, и вы продвинулись вперед, теперь ваша «предыдущая» страница будет работать.

Ответ на вопрос:
Я получаю URL как предыдущую страницу, и я не знаю, как сделать вызов Fav.api из javascript с этого URL. Есть идеи?

да, вы можете сделать вызов FB.api. Но я предлагаю вам сделать вызов HTTP GET, потому что это проще. Также обратите внимание, что предыдущий может возвращать и пустой массив, например {"data":[]}

Как получить предыдущую / следующую страницу?
Здесь я пишу небольшую код, который использует JQuery. Если вы не хотите читать код, есть два способа:

  1. Использовать предыдущий / следующий URL и сделать HTTP-запрос GET. Который, если не пустой, будет сопровождаться следующим набором ссылок «предыдущий», «следующий».
  2. Разобрать URL-адрес и получить строку запроса, как JSON и передать ее FB.api. Я использовал jQuery BBQ pluging для разбора.

Важное примечание: В этом примере я использую «следующий» URL, потому что при первом запросе, если я использую «предыдущий», он дает пустой JSON вместо сообщений из прошлого. Тем не менее, я могу использовать «предыдущий» URL после того, как продвинулся на несколько страниц вперед. Как и в результатах Google, вы не можете перейти на предыдущую страницу 1, но вы можете перейти с любой страницы> 1 (см. Пример 3 ниже). Это называется нумерацией страниц.

Пример 1. Код с использованием HTTP GET (предпочтительно): (я загружу 3 сообщения на страницу и посмотрю три следующих страницы)

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript" src="https://raw.github.com/cowboy/jquery-bbq/master/jquery.ba-bbq.min.js"></script>
<script>

var i =0;
var getPosts = function (response){
          for (element in response.data){
            post = response.data[element]
            console.log(post.id + ": " +post.message);          
          }



          // can i call FB.api(nextPage, getPosts); ??
          if(i < 2){
              nextPage = response.paging.next;        
              console.log(nextPage);
              i++;
              //Method 1: I use it.
              $.get(nextPage, getPosts, "json"); //optional: $.getJSON can be use instead
          }

      }

$(document).ready(function(){

$('#loadPosts').bind('click', function() {
            FB.api('/me/home',{since:'yesterday','limit': '3'}, getPosts);   
          });
})
</script>
</head>
<body>
<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'XXXXXXXXXXXX', // FILL YOUR APP ID HERE!
      status     : true, // check the login status upon init?
      cookie     : true, // set sessions cookies to allow your server to access the session?
    });

    // Additional initialization code such as adding Event Listeners goes here

  };
</script>
<button id="loadPosts">Load Posts</button>
<p>Please open developer console to see what's happening. In Firefox, you can use ctrl+shift+k, and in Chrome/Chromium use ctrl+shift+i</p>
</body>
</html>

Ответ :

100004192352945_156620584487686: undefined
137723270230_10152423499430231: On this day, please spare a thought for those fellow citizens, for whom I just spare a thought and do nothing else.
642965867_10151211036740868: Thanks everyone for their wishes! The wishes made my day!

https://graph.facebook.com/677811901/home?limit=3&access_token=AAACYjXGS5FQBAIR3brc2LibjBcZCi2kRJUybG8VMaaJSZARQ8SzNE7BE4PBrDIFVZB0AaVEa1dZCpX1fhCvoD2rnq8uc8OGaIFhO9uvVXAZDZD&until=1359184568
367116489976035_536776529676696: Rage. Quit. Life.
899605553_10152450871820554: undefined
367116489976035_417820828298092: undefined

https://graph.facebook.com/677811901/home?limit=3&access_token=AAACYjXGS5FQBAIR3brc2LibjBcZCi2kRJUybG8VMaaJSZARQ8SzNE7BE4PBrDIFVZB0AaVEa1dZCpX1fhCvoD2rnq8uc8OGaIFhO9uvVXAZDZD&until=1359179890
137723270230_10152423148745231: Pratibha Patil used to love the Republic Day Parade, especially the part where the visiting Chief Guest extended her an invitation to visit his/her own country.
137723270230_10152423131700231: The Kingfisher tableau at Republic Day Parade was so simple. Vijay Mallya riding a bicycle.
367116489976035_484460034950769: undefined

Пример 2. Код с использованием FB.api: (я загружу 3 сообщения на страницу и посмотрю три следующих страницы)

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript" src="https://raw.github.com/cowboy/jquery-bbq/master/jquery.ba-bbq.min.js"></script>
<script>

var i =0;
var getPosts = function (response){
          for (element in response.data){
            post = response.data[element]
            console.log(post.id + ": " +post.message);          
          }



          // can i call FB.api(nextPage, getPosts); ??
          if(i < 2){
              nextPage = response.paging.next;        
              console.log(nextPage);
              i++;

              //Method 2: If you have to call FB.api
              var params = jQuery.deparam.querystring(nextPage);
              console.log(JSON.stringify(params, null, 2));
              FB.api('/me/home', params, getPosts)
          }

      }

$(document).ready(function(){

$('#loadPosts').bind('click', function() {
            FB.api('/me/home',{since:'yesterday','limit': '3'}, getPosts);   
          });
})
</script>
</head>
<body>
<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'XXXXXXXXXXXX', // FILL YOUR APP ID HERE!
      status     : true, // check the login status upon init?
      cookie     : true, // set sessions cookies to allow your server to access the session?
    });

    // Additional initialization code such as adding Event Listeners goes here

  };
</script>
<button id="loadPosts">Load Posts</button>
<p>Please open developer console to see what's happening. In Firefox, you can use ctrl+shift+k, and in Chrome/Chromium use ctrl+shift+i</p>
</body>
</html>

Ответ :

367116489976035_536776529676696: Rage. Quit. Life.
899605553_10152450871820554: undefined
367116489976035_417820828298092: undefined
{
  "limit": "3",
  "access_token": "AAACYjXGS5FQBAIR3brc2LibjBcZCi2kRJUybG8VMaaJSZARQ8SzNE7BE4PBrDIFVZB0AaVEa1dZCpX1fhCvoD2rnq8uc8OGaIFhO9uvVXAZDZD",
  "until": "1359179890"
}

137723270230_10152423148745231: Pratibha Patil used to love the Republic Day Parade, especially the part where the visiting Chief Guest extended her an invitation to visit his/her own country.
137723270230_10152423131700231: The Kingfisher tableau at Republic Day Parade was so simple. Vijay Mallya riding a bicycle.
367116489976035_484460034950769: undefined

https://graph.facebook.com/677811901/home?limit=3&access_token=AAACYjXGS5FQBAIR3brc2LibjBcZCi2kRJUybG8VMaaJSZARQ8SzNE7BE4PBrDIFVZB0AaVEa1dZCpX1fhCvoD2rnq8uc8OGaIFhO9uvVXAZDZD&until=1359178140
{
  "limit": "3",
  "access_token": "AAACYjXGS5FQBAIR3brc2LibjBcZCi2kRJUybG8VMaaJSZARQ8SzNE7BE4PBrDIFVZB0AaVEa1dZCpX1fhCvoD2rnq8uc8OGaIFhO9uvVXAZDZD",
  "until": "1359178140"
}
655515199_403590309726450: a good resolution to take on Republic Day
505588854_496901583686790: Love the secret world that slow motion reveals.
693811975_10151217837201976: undefined

Пример 3: Выполнение: страница1 -> страница2 -> страница1 или страница -> следующая -> предыдущая Следующий код загрузит страницу 1, затем перейдите на «следующую» страницу (стр. 2), затем вернитесь на страницу 1, используя «предыдущий»

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript" src="https://raw.github.com/cowboy/jquery-bbq/master/jquery.ba-bbq.min.js"></script>
<script>

var i =0;
var getPosts = function (response){
          for (element in response.data){
            post = response.data[element]
            console.log(post.id + ": " +post.message);          
          }



          // can i call FB.api(nextPage, getPosts); ??
          if(i < 2){
              nextPage = response.paging.next;        
              if(i==1)
                nextPage = response.paging.previous;

              console.log(nextPage);
              i++;
              $.get(nextPage, getPosts, "json"); //optional: $.getJSON can be use instead
          }

      }

$(document).ready(function(){

$('#loadPosts').bind('click', function() {
            FB.api('/me/home',{since:'yesterday','limit': '3'}, getPosts);   
          });
})
</script>
</head>
<body>
<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'XXXXXXXXXXXX', // FILL YOUR APP ID HERE!
      status     : true, // check the login status upon init?
      cookie     : true, // set sessions cookies to allow your server to access the session?
    });

    // Additional initialization code such as adding Event Listeners goes here

  };
</script>
<button id="loadPosts">Load Posts</button>
<p>Please open developer console to see what's happening. In Firefox, you can use ctrl+shift+k, and in Chrome/Chromium use ctrl+shift+i</p>
</body>
</html>

Ответ :

PAGE1:
367116489976035_536806916340324: How big is the Solar System?
Full infographic here: http://bit.ly/WmzfVn
137723270230_10152423534790231: "Sociologist" Ashis Nandy has claimed that most of the corrupt came from OBC/SC/ST castes.
Following this, Corrupt people have strongly condemned Nandy's attempts to divide them on caste lines. They'll be united in loot, forever.
100004192352945_156620584487686: undefined

PAGE2:
https://graph.facebook.com/677811901/home?limit=3&access_token=AAACYjXGS5FQBAKqIMyCVYjH9upK4e2bjUwLoVbbFDL0ffc0SZBTVR9MUFGV4ZCq6HBdFIadFMpLDC3ATMZCJ4GPsXWpG4qTGODavuvzLAZDZD&until=1359185659

137723270230_10152423499430231: On this day, please spare a thought for those fellow citizens, for whom I just spare a thought and do nothing else.
642965867_10151211036740868: Thanks everyone for their wishes! The wishes made my day!
367116489976035_536776529676696: Rage. Quit. Life.

PAGE1:
https://graph.facebook.com/677811901/home?limit=3&access_token=AAACYjXGS5FQBAKqIMyCVYjH9upK4e2bjUwLoVbbFDL0ffc0SZBTVR9MUFGV4ZCq6HBdFIadFMpLDC3ATMZCJ4GPsXWpG4qTGODavuvzLAZDZD&since=1359185123&__previous=1

367116489976035_536806916340324: How big is the Solar System?
Full infographic here: http://bit.ly/WmzfVn
137723270230_10152423534790231: "Sociologist" Ashis Nandy has claimed that most of the corrupt came from OBC/SC/ST castes.
Following this, Corrupt people have strongly condemned Nandy's attempts to divide them on caste lines. They'll be united in loot, forever.
100004192352945_156620584487686: undefined

СТАРЫЙ ОТВЕТ

Используйте параметры limit, offset, since и until для достижения вашей цели.

См. http://developers.facebook.com/docs/reference/api/

Пейджинг

Когда Для запросов на соединения есть несколько полезных параметров, которые позволяют фильтровать и просматривать данные соединения:

Следующие сообщения должны получать все сообщения с last week до yesterday из сообщения 21st - 30th (в основном, третья страница из 10 сообщений на каждой странице).

 FB.api(
  '/me/home',
  {
    'since':'last week',
    'limit': '10',
    'offset': '20',
    'until': 'yesterday'
  }, 
  getPosts
); 

Я только что проверил, это работает. Я использовал limit = 4, что по размеру страницы. Итак, когда я получаю данные с 02 февраля 2011 г. (Unix Time Stamp: 1296626400) до сегодняшнего дня, используя этот

https://graph.facebook.com/me/home?access_token=[AUTH_TOKEN]&since=1296626400&limit=4

Он возвращает данные, а также возвращает URL для перехода на следующую страницу

{
   "data": [
      <ARRAY OF POSTS HERE>
   ],
   "paging": {
      "previous": "https://graph.facebook.com/me/home?access_token=[NEW_AUTH_TOKEN]&since=1298026753&limit=4",
      "next": "https://graph.facebook.com/me/home?access_token=[NEW_AUTH_TOKEN]&limit=4&until=1298023222"
   }
}

Вы можете безопасно использовать атрибуты previous и next объекта JSON для перехода на следующую страницу (или предыдущую страницу). Это, кажется, самый простой способ сделать.

Кстати, \u00257C нужно было преобразовать в |, чтобы заставить это работать.

32
ответ дан 28 November 2019 в 23:34
поделиться

Ключевое ограничение в вашем вопросе заключается в том, что мы не можем использовать следующий URL-адрес, указанный в ответе.

Я попытаюсь ответить на ваш вопрос, сначала задав более общий вопрос:

Как мы можем создать пользовательское взаимодействие для нашего приложения Facebook, где каждый вызов для большего количества элементов возвращает одинаковое количество товар.

Если пользователь запрашивает «больше» и получает 10 элементов, нажимает «больше» и получает затем 4, 7 и т. Д., Он может подумать, что наше приложение содержит ошибки.

На начальной странице Open Graph представлены различные параметры для подкачки. Это:

предел

смещение

до

с

, как упомянуто в разделе «пейджинг» заголовок. Однако если мы реализуем решение с пределом и смещением, в котором мы увеличиваем смещение, например:

https://graph.facebook.com/me/home?limit=10&offset=OFFSET

, где OFFSET будет увеличиваться на предел каждого запроса, мы обнаружим, что число возвращаемых результатов иногда не будет равно к указанному нами параметру «limit». Это связано с тем, что параметры применяются на стороне Facebook перед проверкой, видны ли запрашиваемые результаты для зрителя. Мы просим 10, но мы можем получить 8 предметов взамен.

Это означает, что мы не можем использовать решение, в котором мы увеличиваем предел и смещение, если мы хотим, чтобы запрос 'more' нашего приложения всегда возвращал одинаковое количество элементов.

Решение, предложенное в этом блоге Джеффом Боуэном (который работает в команде разработчиков платформы Facebook), заключается в следующем:

  • элемент запроса с лимитом = YOUR_LIMIT.
  • извлекают поле create_time последнего элемента в ответе.
  • запросить следующие 10 элементов, начиная с = RETRIEVED_CREATED_TIME и limit = YOUR_LIMIT

Вот пример кода, основанный на примере в сообщении в блоге, упомянутом выше:

var graphURL = "https://graph.facebook.com/me/home?" +
                 "callback=processResult&" +
                 "date_format=U&" +
                 "limit=10";

function loadPosts() {
  var script = document.createElement("script");
  script.src = graphURL;
  document.body.appendChild(script);
}

function processResult(posts) {
  if (posts.data.length == 0) {
    document.getElementById("loadMore").innerHTML =
      "No more results";
  }
  else {
    graphURL = graphURL + "&until=" +
      posts.data[posts.data.length-1].created_time;

    for (var post in posts.data) {
      var message = document.createElement("div");
      message.innerHTML = posts.data[post].message;
      document.getElementById("content").appendChild(message);
    }
  }
}

Это Решение извлекает следующие 10 элементов из ленты новостей пользователя в хронологическом порядке без использования URL-адреса в ответе JSON.

3
ответ дан 28 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: