Python Facebook API – cursor pagination

Question:

My question involves learning how to retrieve my entire list of friends using Facebook’s Python API. The current result returns an object with limited number of friends and a link to the ‘next’ page. How do I use this to fetch the next set of friends ? (Please post the link to possible duplicates) Any help would be much appreciated. In general, I need to learn about the pagination involved the API usage.

import facebook
import json

ACCESS_TOKEN = "my_token"

g = facebook.GraphAPI(ACCESS_TOKEN)

print json.dumps(g.get_connections("me","friends"),indent=1)
Asked By: Utsav T

||

Answers:

Sadly the documentation of pagination is an open issue since almost 2 years. You should be able to paginate like this (based on this example) using requests:

import facebook
import requests

ACCESS_TOKEN = "my_token"
graph = facebook.GraphAPI(ACCESS_TOKEN)
friends = graph.get_connections("me","friends")

allfriends = []

# Wrap this block in a while loop so we can keep paginating requests until
# finished.
while(True):
    try:
        for friend in friends['data']:
            allfriends.append(friend['name'].encode('utf-8'))
        # Attempt to make a request to the next page of data, if it exists.
        friends=requests.get(friends['paging']['next']).json()
    except KeyError:
        # When there are no more pages (['paging']['next']), break from the
        # loop and end the script.
        break
print allfriends

Update: There’s a new generator method available which implements above behavior and can be used to iterate over all friends like this:

for friend in graph.get_all_connections("me", "friends"):
    # Do something with this friend.
Answered By: runDOSrun

Meanwhile I was searching answer here is much better approach:

import facebook
access_token = ""
graph = facebook.GraphAPI(access_token = access_token)

totalFriends = []
friends = graph.get_connections("me", "/friends&summary=1")

while 'paging' in friends:
    for i in friends['data']:
        totalFriends.append(i['id'])
    friends = graph.get_connections("me", "/friends&summary=1&after=" + friends['paging']['cursors']['after'])

At end point you will get one response where data will be empty and then there will be no ‘paging’ key so at that time it will break and all the data will be stored.

Answered By: Shashank

in this example you off set / pagination by one at the time, i think my while loop is simple since it only looking for the pagination key”next” to be none, if doesnt exists means we finish looping, and you will have your results in a list.
in this example i am just looking for all the people call jacob

import requests
import facebook

token = access_token="your token goes here"
fb = facebook.GraphAPI(access_token=token)
limit = 1
offset = 0
data = {"q": "jacob",
        "type": "user",
        "fields": "id",
        "limit": limit,
        "offset": offset}
req = fb.request('/search', args=data, method='GET')

users = []
for item in req['data']:
    users.append(item["id"])

pag = req['paging']
while pag.get("next") is not None:
    offset += limit
    data["offset"] = offset
    req = fb.request('/search', args=data, method='GET')
    for item in req['data']:
        users.append(item["id"])
    pag = req.get('paging')
print users
Answered By: pelos

I couldn’t find this anywhere, these answers seem super complicated and just no way I would even use an SDK if I had do stuff like that when Paging from a simple POST is so easy to start with, however:

FacebookAdsApi.init(my_app_id, my_app_secret, my_access_token)

my_account = AdAccount('act_23423423423423423')


# In the below, I added the limit to the max rows, 250. 
# Also more importantly, paging. the SDK has a really sneaky way of doing this,
# enclose the request in a list() the results end up the same, but this will make the script request new objects until there are no more
#I tested this example and compared to Graph API and as of right now, 1/22 9:47AM, I get 81 from Graph and 81 here. 
fields = ['name']
params = {'limit':250}
ads = list(my_account.get_ads(
           fields = fields,
           params = params,
      ))

Trick from the docs: "NOTE: We wrap the return value of get_ad_accounts with list() because get_ad_accounts returns an EdgeIterator object (located in facebook_business.adobjects) and we want to get the full list right away instead of having the iterator lazily loading accounts."

https://github.com/facebook/facebook-python-business-sdk

Answered By: Eric Frazier
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.