sábado, 27 de outubro de 2012

InterCon 2012 - Social Mining para métricas. Extraindo dados direto dafonte

Oi pessoal, tudo bem? O blog andou um pouco parado nos últimos tempos, mas hoje eu tenho um ótimo motivo para quebrar essa monotonia por aqui, do InterCon 2012! Esta foi a nona edição de um evento que já é bem conhecido pelos profissionais de métricas, publicitários e até desenvolvedores. Eu confesso que não conhecia o evento - essa foi minha primeira participação - mas fiquei muito impressionado com a organização, infra, nível das palestras e todas aquelas coisas que costumam ser criticadas em grandes eventos. Aproveito para deixar meus parabéns ao iMasters e os organizadores!

Alem de ser minha primeira participação, ainda fui convidado a palestrar com meu amigo e colega de trabalho Vitor Franchito sobre Social Mining para métricas por um dos organizadores e também amigo de trabalho, o Leo Naressi. Nosso objetivo era mostrar, de forma prática, como extrair dados das redes sociais e como analisar estes dados para melhor aproveita-los para uma marca, e, claro, minha parte era a extração dos dados =D. Para isso desenvolvi alguns pequenos exemplos que gostaria de compartilhar com vocês!


Acredito que todas as palestras do evento foram filmadas, então pretendo colocar o link do vídeo aqui assim que estiver disponível. Também vamos colocar a apresentação no SlideShare e assim que ficar pronto adiciono aqui. Agora vamos aos exemplos!


O primeiro exemplo apresentado foi sobre os Followers de uma pessoa no Twitter! Esse é bem simples, já que não precisei nem me autenticar na API.

# coding: utf-8
'''Entre com o nome de um usuário Twitter para ver seus seguidores e
quantos seguidores cada um deles têm'''
import json, urllib2, sys
#Requisição para pegar a lista de followers de um usuário.
resp = urllib2.urlopen('http://api.twitter.com/1/followers/ids.json?screen_name=%s' % sys.argv[1])
#Carrega a lista de followers para um dicionário.
followers = json.loads(resp.read())
for follower_id in followers['ids']:
#Requisição para pegar os dados do follower. É possível requisitar até 100 usuários por vez.
resp = urllib2.urlopen('http://api.twitter.com/1/users/lookup.json?user_id=%s' % follower_id)
follower = json.loads(resp.read())[0]
print follower['screen_name'], follower['name'], follower['followers_count']
view raw followers.py hosted with ❤ by GitHub
Para testar o script basta chamar o arquivo com o python e passar o nome de um usuário do Twitter.

O script imprime o ID, username e qtd de followers de cada um dos seguidores. O código esta comentado e é auto explicativo.

O importante é ressaltar que a API do Twitter impõe limites de requests para seus usuários e que esse limite é menor quando não nos autenticamos. Veja mais sobre isso aqui https://dev.twitter.com/docs/rate-limiting/1.1. Outro fator importante é que foi lançada a versão 1.1 da API e as novidades podem ser vistas aqui https://dev.twitter.com/docs/api/1.1/overview

O outro exemplo de Twitter mostra quem deu RT em um determinado post. O código é muito parecido, o que muda mesmo é o endereço para o qual fazemos a requisição.

#coding: utf-8
import urllib2, json, sys
#Requisição para pegar quem deu retweet de um post. O sys.argv[1] é o id do tweet.
resp = urllib2.urlopen('http://api.twitter.com/1/statuses/%s/retweeted_by.json' % sys.argv[1])
#Carrega a resposta para um dicionário.
retweeters = json.loads(resp.read())
#Percorre a lista de quem deu retweet e mostra as informações de cada pessoa.
for retweeter in retweeters:
print retweeter['screen_name'], retweeter['name'], retweeter['followers_count']
view raw retweets.py hosted with ❤ by GitHub
Nesse exemplo a entrada é feita como no anterior, a diferença é que dessa vez entramos com o ID de um post, como por exemplo https://twitter.com/_dp6/status/261804809974317056

O terceiro e último exemplo prático é relacionado a Facebook e tem como objetivo mostrar as pessoas que deram like em um post de uma fan page. Este exemplo não pode ser tão simples quanto os anteriores pois  não é possível pegar estas opções sem autenticação. Para tal é preciso criar um app no Facebook - https://developers.facebook.com/docs/appsonfacebook/tutorial/

Com o App criado já podemos ir para o código. Vejam abaixo:

# coding: utf-8
import webbrowser, urllib, json, sys
def login():
#Dicionário de parâmetros usados para obter code.
args = {
'client_id': '318829251513892',
'redirect_uri': 'http://localhost:5000/',
'scope': 'friends_likes,user_likes,manage_pages'
}
#Abre um navegador para pedir a autorização do usuário.
#Depois de autorizar, o Facebook faz uma chama para a redirect_uri
#O code é enviado em forma de parâmetro na URL.
webbrowser.open('https://graph.facebook.com/oauth/authorize?'
+ urllib.urlencode(args))
#Aguarda a entrada do parâmetro code pela linha de comando.
code = raw_input()
#Adiciona novos parâmetros ao dicionário inicial.
args['code'] = code
args['client_secret'] = '04512624aa679cfc29b8f14ee5d2a23c'
#Faz uma segunda chamada, agora para obter o access_token.
resp = urllib.urlopen('https://graph.facebook.com/oauth/access_token?'
+ urllib.urlencode(args))
#Fatia a string retornada para pegar apenas o código access_token.
access_token = resp.read().split('&')[0].split('=')[1]
#Guarda o access_token em um arquivo.
with open('access_token.txt', 'w') as file:
file.write(access_token)
return access_token
def get_likes(page_username, post_id, access_token):
#Dicionário usado para requisições na API.
args = {'post_id': post_id,
'format': 'json',
'access_token': access_token
}
#Monta a url de chamada, com o nome da pagina, id do post e os parâmetros de chamada.
url = 'https://graph.facebook.com/%s/posts?%s' % (page_username, urllib.urlencode(args))
#Faz a chamada e carrega o resultado para um dicionário Python.
resp = urllib.urlopen(url)
data = json.loads(resp.read())
#Simplifica a massa de dados.
data = data['data'][0]
#Mostra as pessoas que deram Like!
for like in data['likes']['data']:
print like['id'], like['name']
if __name__ == '__main__':
#Verifica se o access_token já foi gravado em arquivo.
#Caso contrário chama a função de login.
try:
access_token = open('access_token.txt').read()
except IOError:
access_token = login()
#Chama a função get_likes com o parâmetro passado na
# linha de comando e o access_token.
get_likes(sys.argv[1], sys.argv[2], access_token)
view raw likes.py hosted with ❤ by GitHub
Ao executar este script pela primeira vez, será aberta uma janela do navegador pedindo permissões para sua App recém criada. Ao conceder as permissões, o Facebook fará uma requisição HTTP para a URL informada na criação de sua App com um parâmetro chamado code. Como não temos um aplicativo web esperando por requisições HTTP, o jeito é pegar o conteúdo deste parâmetro presente no navegador e copia-lo no terminal (e dar enter). Depois disso, usamos esse code na próxima requisição para obter o access token, que será usado em todas as requisições à API. Com isso estamos autenticados e podemos pegar as informações que desejamos.

Este "pulo do gato" relacionado ao parâmetro code eu encontrei no livro Mining the Social Web do escritor Matthew Russell. O livro é muito bom, tem vários exemplos em Python e também mostra varias analises que podemos fazer com estes dados.

Neste exemplo as entradas do script são o nome da fan page e o ID do post.

Estes foram os exemplos práticos da palesta. Falei também sobre como conseguimos pegar informações sobre os compartilhamentos no Facebook, informação que não é disponibilizada pela API, mas este é um assunto bem mais complexo e merece um post só para ele!

Espero que estas informações sejam úteis e que possam ajudar muitas pessoas. Se houverem dúvidas postem aqui no blog que tentarei responder a todas. Assim que os slides e o vídeo estiverem prontos eu publicarei aqui.

Um grande abraço!

Um comentário: