Recuperar posts

Segundo a Graph API v2.3, podemos recuperar:

  • /{user-id}/home - Retorna o fluxo de todos os posts criados pelo usuário e seus amigos. O que normalmente se encontra no Feed de Noticia.
  • /{user-id}/feed – inclui tudo que você vê no seu perfil (links compartilhados, checkins, fotos, atualização de status, além de incluir posts criados por amigos no perfil do usuário.
  • /{user-id}/statuses – Retorna apenas a atualização de status postado pelo usuário em seu próprio perfil
  • /{user-id}/posts – retorna os posts criados pelo usuário no seu próprio mural ou nos dos amigos, e pode incluir qualquer conteúdo como links compartilhados, checkins, fotos e atualização de status.

In [1]:
import facebook

In [2]:
import simplejson as json

In [3]:
import requests

O módulo requests é utilizado para fazer requisições HTTP, ele será útil para que possamos requisitar novas páginas com conteúdo do Facebook.

Ele funciona da seguinte maneira:


In [4]:
req = requests.get('http://python.org')

In [5]:
req.status_code # Se o código for 200, a requisição foi realizada.


Out[5]:
200

In [6]:
#req.text

In [7]:
'Python' in req.text


Out[7]:
True

In [8]:
req.close()

'me/feed'

Inclui tudo que você vê no seu perfil (links compartilhados, checkins, fotos, atualização de status, além de incluir posts criados por amigos no perfil do usuário.


In [9]:
import facebook
access_token = 'EAACEdEose0cBAAFGsk2U0Jo1Kn9GZCWuXoMwflMusq2ajIqwcF3VU9vEp2M8y5ZB3stHJ5AAShfQvL72JYV8zGQXGvN5996EXDn9FV2DJvS8FTflaak0UuC6ZAm5HPjI2gsLRVEzdYlftGL93ZBWNVJuWzRnENYY7a3dpALP0AZDZD'

In [10]:
api = facebook.GraphAPI(access_token, version='2.3')

In [11]:
noticias = api.get_object('me/feed')

In [12]:
#print(json.dumps(noticias, indent=4))

In [13]:
for item in range(0, len(noticias['data'])):
    try:
        print(item, '--->', noticias['data'][item]['story'])
    except:
        pass


0 ---> Dino Magri shared a link.
2 ---> Dino Magri shared a link.
5 ---> Dino Magri shared a link.
7 ---> Dino Magri shared a link.
17 ---> Dino Magri shared a link.
18 ---> Dino Magri shared a link.
21 ---> Dino Magri added a new photo.
22 ---> Dino Magri added a life event: Started Working at CCG: Centro de Computação Gráfica.
23 ---> Dino Magri added a life event: Started Working at Informant - Sonhe alto.
24 ---> Dino Magri added a life event: Started Working at LARC - USP.

In [14]:
noticias = api.get_object('me/feed')
while True:
    try:
        for item in range(0, len(noticias['data'])):
            try:
                print(item, '--->', noticias['data'][item]['story'])
            except:
                pass
        noticias = requests.get(noticias['paging']['next']).json()
    except Exception as e:
        print(e)
        break


0 ---> Dino Magri shared a link.
2 ---> Dino Magri shared a link.
5 ---> Dino Magri shared a link.
7 ---> Dino Magri shared a link.
17 ---> Dino Magri shared a link.
18 ---> Dino Magri shared a link.
21 ---> Dino Magri added a new photo.
22 ---> Dino Magri added a life event: Started Working at CCG: Centro de Computação Gráfica.
23 ---> Dino Magri added a life event: Started Working at Informant - Sonhe alto.
24 ---> Dino Magri added a life event: Started Working at LARC - USP.
0 ---> Dino Magri added a life event: Started School at Colégio Puríssimo Coração de Maria.
1 ---> Dino Magri added a life event: Started School at Udesc Joinville.
2 ---> Dino Magri updated his cover photo.
3 ---> Dino Magri updated his profile picture.
4 ---> Dino Magri added a life event from January 11, 1998: Born on January 11, 1998.
'paging'

Exercicio 2 - Altere o programa da aula6-parte5-recuperar ('me/feed') e imprima, além do histórico, o nome, tipo e a hora da criação.

- story
- name
- type
- created_time 

'me/home'

Retorna o fluxo de todos os posts criados pelo usuário e seus amigos. O que normalmente se encontra no Feed de Noticia.


In [15]:
feed_noticias = api.get_object('me/home')

In [16]:
len(feed_noticias['data'])


Out[16]:
25

In [17]:
for item in range(0, len(feed_noticias['data'])):
    try:
        print(item, '---->', feed_noticias['data'][item]['name'])
    except:
        pass


0 ----> Rio Olympics: Sensors, big data to be the next revolution
1 ----> Starting a Blog in 2016? 10 Facts You Need to Know First
2 ----> Tracking the 2016 Presidential Money Race
3 ----> PKpacheco/comunidades-python-latam
6 ----> Useful Scraping Techniques | NPR Visuals
7 ----> The White House requested input on artificial intelligence, and IBM’s response is a great AI 101
8 ----> MBA Big Data
9 ----> Google Joins New SDN/NFV Open Source Networking Project -- Virtualization Review
10 ----> The Making of a Data Scientist
12 ----> Store and read data between dictionary and text file in python
13 ----> Sprout Social Photos
14 ----> What Cost is each State Obsessed with
15 ----> 8 reasons LinuxCon is a must-attend event
17 ----> Big Data Hadoop Interview Questions and Answers's cover photo
18 ----> Sprout Social Photos
19 ----> Percentage of Renewable Energy by Country
20 ----> Open Source OVN to Offer Solid Virtual Networking For OpenStack
21 ----> Introducing BigInsights for Apache Hadoop Basic Plan on Bluemix
23 ----> IBM Watson is helping underfunded Rio Olympics cyclists go for gold | The Memo
24 ----> Sprout Social Photos

In [18]:
feed_noticias['data'][1].keys()


Out[18]:
dict_keys(['created_time', 'is_expired', 'id', 'story_tags', 'updated_time', 'description', 'application', 'status_type', 'name', 'icon', 'from', 'is_hidden', 'type', 'likes', 'shares', 'caption', 'privacy', 'story', 'picture', 'actions', 'link'])

In [19]:
feed_noticias['data'][1]['type']


Out[19]:
'link'

In [20]:
feed_noticias['data'][1]['name']


Out[20]:
'Starting a Blog in 2016? 10 Facts You Need to Know First'

In [21]:
#feed_noticias['data'][1]['application']

In [22]:
feed_noticias['data'][1]['updated_time']


Out[22]:
'2016-08-04T00:45:14+0000'

In [23]:
feed_noticias['data'][1]['created_time']


Out[23]:
'2016-08-04T00:45:14+0000'

In [24]:
# feed_noticias['data'][1]['comments']

In [25]:
feed_noticias['data'][1]['likes']


Out[25]:
{'data': [{'id': '1187147247991781', 'name': 'ต้า แมวเหมียว'},
  {'id': '302423610092357', 'name': 'Michel Arents'},
  {'id': '294298467422804', 'name': 'Barbara Mirorakonto'},
  {'id': '251638271875177', 'name': 'Antonio Pecli'},
  {'id': '10204213570193016', 'name': 'Nilda Castillo Camacho'},
  {'id': '10152218663191943', 'name': 'Haitao Jiang'},
  {'id': '460936354010015', 'name': 'Leynner Roque'},
  {'id': '10206565317243068', 'name': 'Emerson Moreira'},
  {'id': '117772705280449', 'name': 'Ajmad Abbasi'},
  {'id': '724184534321685', 'name': 'Hamzah Abdullah'},
  {'id': '10103700579855137', 'name': 'Gilbert Doan'},
  {'id': '10152875126269349', 'name': 'Yuppier Nguyen'},
  {'id': '10152450434701585', 'name': 'Davide Bennato'},
  {'id': '911828858844802', 'name': 'Ivett Kovács'},
  {'id': '10153995942890177', 'name': 'Harsha Srivatsa'},
  {'id': '760692217337437', 'name': 'Sasikala Senthilnathan'},
  {'id': '367974000034745', 'name': 'Valery Podymov'},
  {'id': '10152218895459079', 'name': 'G J Camargo Gamboa'},
  {'id': '1518973238357915', 'name': 'Huynh Ngoc Phu'}],
 'paging': {'cursors': {'after': 'MTUxODk3MzIzODM1NzkxNQZDZD',
   'before': 'MTE4NzE0NzI0Nzk5MTc4MQZDZD'}}}

Note que só retornamos 25 resultados, porém nosso feed de notícias tem muita informação ainda para ser recuperada!

Não temos um parâmetro específico que podemos informar quantos items queremos, portanto temos que criar mecanismos para parar a captura dos dados.


In [26]:
feed_noticias['paging']


Out[26]:
{'cursors': {'after': 'MTQ3MDI5MzAzNzoxNDcwMjkzMDM3OjI6LTc3OTYxODg1NDA1OTI3NjY2ODE6MTQ3MDI3NzYyNDow',
  'before': 'MTQ3MDM2MTMzNzoxNDcwMzYxMzM3OjE6NDg0ODQyNjk5MDA0Nzc2MjUwOjE0NzAzMjgxNDU6MA=='},
 'next': 'https://graph.facebook.com/v2.3/114873192193820/home?access_token=EAACEdEose0cBAAFGsk2U0Jo1Kn9GZCWuXoMwflMusq2ajIqwcF3VU9vEp2M8y5ZB3stHJ5AAShfQvL72JYV8zGQXGvN5996EXDn9FV2DJvS8FTflaak0UuC6ZAm5HPjI2gsLRVEzdYlftGL93ZBWNVJuWzRnENYY7a3dpALP0AZDZD&limit=25&after=MTQ3MDI5MzAzNzoxNDcwMjkzMDM3OjI6LTc3OTYxODg1NDA1OTI3NjY2ODE6MTQ3MDI3NzYyNDow'}

Da mesma forma que foi feito anteriormente, podemos requisitar a próxima página até que atinja a quantidade desejada.

É importante notar que no meu caso, tenho poucas conexões, desta forma a quantidade de dados é bem inferior se comparado ao facebook de uma pessoa que usa ativamente!!!!

Bônus - Lista de Amigos

Também podemos recuperar as conexões, como por exemplo, uma lista de amigos.


In [34]:
access_token = 'EAACEdEose0cBANbSsjf7TIxMNSvoGZCOZCa2Nbfjso2ZAQwKCrmotS5wEXPZCNvHx7zxqLU30Mn5J9cJdtTDJtALuSfn4mSSmCuASZAPTQy2DE3LSeboUzfZCzTIvJPrcR1E4ScwKyDAPN2mOPx1hNwfKPyYdikzGc32tauaKGMQZDZD'

In [35]:
amigos = api.get_connections("me", "friends")
todos_amigos = []

In [36]:
while True:
    try:
        for amigo in amigos['data']:
            todos_amigos.append(amigo['name'])
        amigos = requests.get(amigos['paging']['next']).json()
    except KeyError:
        break
print(todos_amigos)


['Dino Magri']