Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Facebook API - cursor pagination

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)
like image 737
Utsav T Avatar asked Feb 18 '15 16:02

Utsav T


3 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.
like image 101
runDOSrun Avatar answered Nov 07 '22 19:11

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.

like image 20
Shashank Avatar answered Nov 07 '22 21:11

Shashank


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

like image 28
Eric Frazier Avatar answered Nov 07 '22 20:11

Eric Frazier