Usando Tapioca
para acessar APIs
web
FILIPE XIMENES
@xima
github.com/filipeximenes
http://www.vinta.com.br
API
Application Programming
Interface
Como assim?
◇ APIs definem a interface de interação de um
software.
◇ software pode ser:
○ uma classe de Python
○ um banco de dados
○ um hardware
○ um plugin
○ uma biblioteca
○ um serviço web
Ex.: classe do Python
class User(object):
name = ''
email = ''
def update_data(self, name, email):
self.name = name
self.email = email
def talk(self, message):
print('{} says: {}'.format(self.name, message))
Ex.: serviço web
GET /v1/media/000000
HOST: https://api.instagram.com
POST /v1/media/000000/comments
HOST: https://api.instagram.com
DELETE /v1/media/000000/comment/111111
HOST: https://api.instagram.com
Integrando
serviços web
Quero pegar as informações
básicas do usuário depois que
ele fizer login com a conta do
Facebook.
Opções
◇ Opção 1
○ Ler a documentação da API do Facebook.
○ Usar urllib2 do Python para fazer requisições.
◇ Opção 2
○ Ler a documentação da API do Facebook.
○ Usar Requests do Python para fazer
requisições.
◇ Opção 3
○ Procurar uma lib open source que
implemente a API.
○ Ir para o bar comemorar.
Bibliotecas de API ou API
wrappers
◇ O que é?
○ Implementação de uma API web utilizando
uma linguagem de programação.
◇ Pra que serve?
○ Criar uma camada sobre o HTTP usando a
linguagem que você deseja trabalhar.
■ autenticação
■ composição de urls
■ preparação de requisições
■ processar respostas
■ formatar dados
facepy
facepy
from facepy import GraphAPI
graph = GraphAPI(oauth_access_token)
my_links = graph.get(path='me/links', page=True)
for link in my_links:
print(link) # link is a dict
facepy
graph = GraphAPI(oauth_access_token)
endpoint = '{}/{}'.format(user_id, 'statuses')
data = ??
user_data = graph.post(endpoint, **data)
Algumas notas
◇ Teremos que estudar a documentação do
Facepy
○ Requesições
○ Passagem de parâmetros
○ Acesso as respostas
○ Tratamento de excessões
◇ Teremos que estudar a documentação do
Facebook
○ Endpoints e métodos HTTP disponíveis
○ Parâmetros aceitos por cada endpoint
○ Formatação dos dados em cada resposta
python-twitter
python-twitter
import twitter
api = twitter.Api(consumer_key='consumer_key',
consumer_secret='consumer_secret',
access_token_key='access_token',
access_token_secret='access_token_secret')
statuses = api.GetUserTimeline(
user_id=user_uid, count=20,
since_id=id_of_first_tweet)
python-twitter
python-twitter
Algumas notas
◇ Documentação em pydoc
◇ PEP8 completamente ignorada
◇ Sem suporte a paginação
◇ Um método para cada endpoint
◇ Modelos ao invés de dicionários
Preciso que meu sistema
monitore Twitter, Facebook,
Instagram, Blogger e Tumblr para
capturar postagens de usuários.
◇ Autenticação
◇ Requests como motor das requisições
◇ Suporte a paginação
◇ Execeções para status de erro HTTP (403, 500...)
◇ Suporte a hipermidia (links, HATEOAS)
◇ Explorável
◇ Documentação simples
O wrapper ideal
Delicioso e vem em diversos
sabores!
Tapioca Wrapper
tapioca-wrapper
https://github.com/vintasoftware/tapioca-wrapper
O que é?
Um framework para criar
wrappers para APIs web
Demo time!!
tapioca-facebook
Parabéns
agora você já sabe usar
QUALQUER wrapper tapioca
Desenvolvendo
um wrapper
tapioca
O código
Python
https://github.com/vintasoftware/tapioca-
facebook/blob/master/tapioca_facebook/tapioca_fac
ebook.py
Mapeamento dos endpoints
https://github.com/vintasoftware/tapioca-
facebook/blob/master/tapioca_facebook/resource_
mapping.py
◇ Um método para cada endpoints
◇ Explorável
◇ Serialização e deserialização
◇ Utiliza a lib Requests
◇ Suporte a paginação
◇ Suporte a hipermidia
◇ Acesso rápido a documentação
◇ Suporte a excessões
funcionalidades do tapioca
Benchmarking
~250 linhas de código
tapioca-facebook
~1,000 linhas de código
facepy
~6,000 linhas de código
python-twitter
~150 linhas de código
tapioca-twitter
1 hora
tapioca-parse
◇ Ainda precisamos ler a documentação da
API porém não a do wrapper
◇ Divertido de explorar.
◇ Novos "sabores":
○ Quase 100% declarativo.
○ Pouquíssimas linhas de código.
○ Baterias inclúsas.
Notas
v1.0
Thanks!
Perguntas?
@xima
github.com/filipeximenes
ximenes@vinta.com.br
www.vinta.com.br

Usando tapioca para acessar APIs web [PyBR11]