Python Facebook API - cursor pagination

后端 未结 3 1454
傲寒
傲寒 2021-02-09 08:10

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

相关标签:
3条回答
  • 2021-02-09 08:55

    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
    
    0 讨论(0)
  • 2021-02-09 09:03

    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.

    0 讨论(0)
  • 2021-02-09 09:08

    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.
    
    0 讨论(0)
提交回复
热议问题