rescue true

18 marzo, 2011

Twitter gem + Apigee: incrementar el rate limit de tu aplicación de Twitter

Filed under: Uncategorized — xurdekio @ 12:22 pm

Estos días he estado inmerso en el desarrollo de una aplicación para Twitter que requería gran cantidad de consultas a la API. Por defecto la API de Twitter tan solo permite 200 queries/hora si no haces las peticiones loggeado y 350 si si lo estas.

En el caso de nuestra aplicación necesitabamos alrededor de 1500 – 2000 queries/hora, lo cual superaba con mucho los limites impuestos. Twitter te permite negociar con ellos tu rate limit, pero lo asocia a una IP o un usuario, lo cual es un problema a la hora de tener la aplicación en varios entornos (distintas IPs) y con varios desarrolladores (distinas API Key).

En este punto nos topamos con Apigee, un servicio para gestionar y monitorizar nuestras APIs que tiene un acuerdo con Twitter para que el rate limit accediendo a través de su servicio sea de 20000 queries/hora. Así que nos registramos, configuramos la API de Twitter y obtenemos un endpoint de la forma: https://tu_api-tu_user.apigee.com. Todas las peticiones que hagamos contra este endpoint seran equivalentes a hacerlas contra el endpoint de la API de Twitter, pero con un rate limit de 20000 queries/hora.

Dicho esto, la gema de twitter que estamos usando es la gema twitter de Jhon Nunemaker, en su versión 1.1.2. Esta gema te permite configurar el endpoint contra el que efectuas las peticiones de la forma

Twitter.configure do |config|
  config.endpoint = "https://tu_api-tu_user.apigee.com/1/"
end

Con este código podemos crear fichero en la carpeta config/initializers para que configure en endpoint al iniciar la aplicación.
En este punto ya tenemos la aplicación lista para realizar miles de queries por hora siempre y cuando no vayan firmadas a través de OAuth.
Si nuestro caso requiere hacer este tipo de peticiones autentificadas, Apigee nos dice que las hagamos a traves del endpoint que ellos nos suministran, pero firmadas como si fuesen al endpoint de Twitter.
Para ello necesitamos desempaquetar la gem con gem unpack twitter dentro del directorio vendor/plugins de nuestra aplicación y editar el fichero twitter/lib/faraday/oauth.rb añadiendo la siguientes siguientes lineas en lugar de las existentes para la construcción de la header

      #Hack para que, aunque estemos usando otro endpoint (lease apigee) la firma oauth se genere para el endpoint original
      url_hack = Addressable::URI.parse(env[:url].to_s.sub(Twitter.endpoint, Twitter::Configuration::DEFAULT_ENDPOINT))
      header = SimpleOAuth::Header.new(env[:method], url_hack, signature_params, @options)

Ahora, si hacemos una petición de rate_limit_status, veremos como Twitter nos informa que disponemos de 20000 queries.
Espero que os haya sido útil e instructivo.

 

2 comentarios »

  1. Gracias por la información, me servirá miles.

    Comentario por Luis Pirir — 10 agosto, 2011 @ 8:12 pm | Responder

  2. Yes un picaro!

    Comentario por Maki — 12 septiembre, 2011 @ 2:06 pm | Responder


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: