Processing
 

How does paging in facebook javascript API work?

17/02/2011 00:13#1

Fgblanch

Member

Joined at: 9 months ago

Post: 3

Thank: 0

Thanked: 0

I'm trying to recover the last week posts in my facebook news feed with the javascript sdk. I'm able to get the first page but then, I don't know how to continue iterating through the other pages. I've tried it with the following code:

 $('#loadPosts').bind('click', function() {                  FB.api('/me/home',{since:'last week'}, getPosts);              });   getPosts = function(response){         for (element in response.data){             post = response.data[element]             console.log(post);                     }            previousPage = response.paging.previous;                   console.log(previousPage);            // can i call FB.api(previousPage, getPosts); ??              } 

But I'm getting a URL as previous page and I don't know how to make a javascript FB.api call from that URL. Any ideas?

18/02/2011 11:21Top#2

Nishant

Member

Joined at: 10 months ago

Post: 44

Thank: 0

Thanked: 0

Alright, it seems a lot of whining about a simple issue that I still believe my old answer clarifies. Anyway, let me babysit you. :)

First: I find out that you cannot really go to the "previous" page from the first page. Ideally, I should. So, here is a bug that I have filed you may want to follow: https://developers.facebook.com/bugs/391562790938294?browse=search_50fcac3ce094e7068176315

Second: If this is by design, you cannot go back to "previous" from the first page (because there is no previous), but you can surely go to "Next". However, since the API behaves as a cursor, and you have moved forward, now your "previous" page would work.

The answer to the question:
I'm getting a URL as previous page and I don't know how to make a javascript FB.api call from that URL. Any ideas?

yes, you can make FB.api call. But I suggest you to make a HTTP GET call instead, because it's easier. Also, note that previous may return and empty array like {"data":[]}

How to get previous/next page?
Here, I am writing a small code that uses jQuery. In case you do not want to read the code, there are two ways:

  1. Use previous/next URL and make HTTP GET request. Which, if not empty, will come with next set of "previous", "next" link.
  2. Parse the URL, and get the query-string as JSON ans pass it to FB.api. I used jQuery BBQ pluging for parsing.

Important Note: In the example, I am using "next" URL because on the first request if I use "previous" it gives empty JSON instead of giving posts from the past. However, I can use use "previous" URL once I have moved ahead a few pages. Like Google results, you can not go previous on page 1, but you can from any page > 1 (see Example 3 below). This is called pagination.

Example 1: Code using HTTP GET (preferred): (I will load 3 posts/page and look three next-pages)

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

Response:

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 

Example 2: Code using FB.api: (I will load 3 posts/page and look three next-pages)

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

Response:

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 

Example 3: Performing: page1 -> page2 -> page1 or page -> next -> previous The following code will load page1, then go to "next" page (page2), then come back to page1, using "previous"

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

Response:

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 

OLD ANSWER

Use limit, offset, since and until parameters to achieve your goal.

Refer: http://developers.facebook.com/docs/reference/api/

Paging

When querying connections, there are several useful parameters that enable you to filter and page through connection data:

The following should get all the posts since last week until yesterday from 21st - 30th message (basically, third page of 10 message per page pagination).

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

I've just tested, it works. I have used limit=4, which is page-size kind of thing. So, when I fetch data since Feb 02, 2011 (Unix Time Stamp: 1296626400) till today using this

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

It returns the data, plus it also return URL to go to next page

{    "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"    } } 

You can safely use previous and next attributes of the JSON object to jump to next page (or previous page). This seems to be the easiest way to do.

By the way, \u00257C needed to be converted to | to get this to work.

30/08/2012 04:19Top#3

Joined at: 10 months ago

Post: 6

Thank: 0

Thanked: 0

If you simply wanted to get the next page (using the paging.next object) you could do a jQuery.getJSON request. Something like the following:

function loadAlbums(){     FB.api('/me/albums', function(response){         handleAlbumsResponse(response);     }); }  function handleAlbumsResponse(response){     var albums = response.data;      for( var i in albums){         var album = albums[i];         $('#albums ul').append('<li><a href="#">' + album.name + '</a></li>');     }      if( response.paging.next){         console.log('fetching next page...');         $.getJSON(response.paging.next, function(response){                             handleAlbumsResponse(response);         });     }  }  
28/04/2012 00:58Top#4

MrK

Member

Joined at: 10 months ago

Post: 17

Thank: 0

Thanked: 0

The key constraint in your question is we can't use the 'next' url provided in the response.

I'll try to answer your question by first asking a more general question:

How can we create a user experience for our Facebook app where every call for more items returns the same amount of items.

If the user requests 'more' and gets 10 items, presses 'more' and gets then 4, then 7 etc, she might think our app is buggy.

On the Open Graph intro page, different parameters for paging are introduced. These are:

limit

offset

until

since

as mentioned under the 'paging' heading. However if we implement a solution with limit and offset where we increment offset ,e.g.:

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

where OFFSET will be increased by the limit each request, we find that the number of results returned will sometimes not be equal to the “limit” parameter we specified. This is because parameters are applied on Facebook's side before checking if the queried results are visible to the viewer. We ask for 10, but we might get 8 items in return.

This means we can't use a solution where we increment limit and offset if we want our app's 'more' request to always return the same amount of items.

A solution proposed in this blog by Jeff Bowen (who works on the Facebook plaform team) is this logic:

  • request item with limit = YOUR_LIMIT.
  • retrieve the created_time field of the last item in the response.
  • request next 10 items with since = RETRIEVED_CREATED_TIME and limit=YOUR_LIMIT

Here's a code sample, based on an example in the blog post mentioned above:

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

This solution retrieves the next 10 items from the user's newsfeed in chronological order without using the url in the JSON response.

06/07/2016 12:32Top#5

Joined at: 4 months ago

Post: 1

Thank: 0

Thanked: 0

It's working

    function friends_list()     {          for (var x = 0; x<500; x++)         {             FB.api(             '/me/friendlists/',             'GET',             {"fields":"id","offset":x},             function(response) {             for (i = 0; i < response.data.length; i++)              {               document.getElementById("friends_list").innerHTML =               document.getElementById("friends_list").innerHTML + "<br>" + response.data[i].id;               }             document.getElementById("friends_list").innerHTML =               document.getElementById("friends_list").innerHTML + "<br>" ;             }             );         }       } 
Similar articles

On click Facebook post link goes to another link

6 months ago - Reply: 0 - Views: 4

How to creat facebook note like this?

7 months ago - Reply: 4 - Views: 175

Other people logging into messenger

6 months ago - Reply: 2 - Views: 66

Can a fan page be changed back to personal profile

6 months ago - Reply: 2 - Views: 155

I'm getting problem to login my Facebook account

7 months ago - Reply: 8 - Views: 431

How can see All Facebook games?

6 months ago - Reply: 0 - Views: 1

Ads for Person Profile

6 months ago - Reply: 2 - Views: 132

Help me unlock ads account

4 months ago - Reply: 3 - Views: 140

How To Optimal Costs Running Facebook Ads (Part 1)?

6 months ago - Reply: 0 - Views: 1

Can you help me with facebook payment.

8 months ago - Reply: 4 - Views: 211

Facebook Targeted Ads

8 months ago - Reply: 2 - Views: 155

How to increase traffic using FB

6 months ago - Reply: 10 - Views: 582

how to get on-screen version of activity log

6 months ago - Reply: 0 - Views: 1

Facebook Bigpipe Technique Algorithm

5 years ago - Reply: 3 - Views: 257

Help about traffic by run FB ad!

6 months ago - Reply: 1 - Views: 11

Customers support on fb company page

7 months ago - Reply: 2 - Views: 94

My facebook fan pages are unpublished

7 months ago - Reply: 8 - Views: 379

Help me find target audience on facebook

4 months ago - Reply: 11 - Views: 336

Joining New Members to a Group

7 months ago - Reply: 3 - Views: 152

Changing webcam settings for Facebook Live?

8 months ago - Reply: 2 - Views: 135

vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re vé máy bay vé máy bay giá rẻ ve may bay ve may bay gia re