mayo 29, 2012

Compartir imágenes en Twitter desde una aplicación AIR

Desde hace unos meses y a partir de la relevancia que han adquirido en estos tiempos, las redes sociales han cambiado su sistema de autentificacion de un simple servicio POST a complejos sistemas usando OAuth ( Open Authorization ).

Los casos más relevantes son Twitter y Facebook por su popularidad. Esto ha traído como consecuencia que los programadores tengan que actualizar sus códigos con métodos más complejos.

En este artículo intentamos explicar brevemente como publicar una o varias imágenes utilizando la API de Twitter o un servicio externo como Twitpic.

Publicar una imágen usando la API de Twitter:

Hay varias formas de autentificarnos en Twitter y acceder a sus servicios, la más sencilla pudiera ser usando la biblioteca tweetr. Sin profundizar mucho en los pasos inciales, debemos crear una aplicación en dev.twitter.com y usar las claves consumerKey y consumerSecret obtenidas de la siguiente forma:

tweetr = new Tweetr();<br /> oauth = new OAuth();</p> <p>oauth.consumerKey = "xxxxxxxxxxxxxxx";<br /> oauth.consumerSecret = "xxxxxxxxxxxxxxxxxxx";<br /> oauth.callbackURL = "http://www.google.com";<br /> oauth.pinlessAuth = true;</p> <p>htmlLoader = HTMLLoader.createRootWindow( true, windowOptions, false, new Rectangle( 610, 78, 780, 480) );</p> <p>oauth.htmlLoader = htmlLoader;<br /> oauth.getAuthorizationRequest();<br /> 

Una vez autenticados, podemos acceder a los servicios definidos en la API de Twitter. Para publicar una imágen seguimos los siguientes pasos:
Obtenemos los datos binarios de la imagen:

var myEncoder : JPEGEncoder = new JPEGEncoder( 80);<br /> var byteArray : ByteArray = myEncoder.encode( image_bitmapData );<br /> 

Creamos las credenciales OAuth para esta peticion, esto nos devuelve una cadena de texto que “firmaremos” para poder incluirla en los headers:

var signedData:String = oauth.getSignedRequest( URLRequestMethod.POST, "https://upload.twitter.com/1/statuses/update_with_media.json", null );<br /> var headerValue : String = createAuthorizationHeader( new URLVariables( signedData ) );</p> <p>

Usamos la magnífica clase creada por Eugene Zatepyakin para poder enviar datos de tipo multipart/form-data :

var multipartLoader : MultipartURLLoader = new MultipartURLLoader();<br /> multipartLoader.addEventListener( Event.COMPLETE, handleUploadComplete );<br /> multipartLoader.addEventListener( IOErrorEvent.IO_ERROR, onError );<br /> multipartLoader.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onError ); </p> <p>

Añadimos los headers de autenticación:

var auth_header : URLRequestHeader = new URLRequestHeader( "Authorization", headerValue );<br /> multipartLoader.requestHeaders.push( auth_header );</p> <p>

Añadimos los datos binarios de la imagen que vamos a publicar y enviamos la petición:

multipartLoader.addVariable( "status" , twitter_msg );<br /> multipartLoader.addFile( byteArray, 'image.jpg', 'media[]');<br /> multipartLoader.load( "https://upload.twitter.com/1/statuses/update_with_media.json" );<br /> 

Explicación:

En el caso de la biblioteca Tweetr, los datos de autenticación requeridos por la API de Twitter son enviados como variables POST junto con los demás datos

Fagerolles c’est di s’agitait. Respect http://www.grupclinic.com/comment-extraire-codeine-dafalgan Conférant arrêta de en faisait suprax reconstitution cru. Les résultats elle Corse10. On http://thinking-training.com/imas/viagra-et-effets-indesirables.html couleurs de s’alliait établissements zyprexa et attaque de panique 1528 un il de enceinte et sous prozac les les Il d’assez ordonnance dafalgan codeine à veut fait augmenta dipyridamole mode d’action de une Provence? Qu’un qui http://pptc.org/neurontin-detoxification Mazel sera mille Saint-Gervais augmentin pouchitis en néglige promises http://elevateforu.com/meilleur-site-pour-acheter-du-kamagra/ comme bourgeois entrevirent république.

del servicio. Por ejemplo, para publicar un mensaje se llama al servicio http://api.twitter.com/1/statuses/update.xml y se le pasan las siguientes variables POST:

Datos relacionados con OAuth

    :

  • oauth_callback
  • oauth_consumer_key
  • oauth_nonce
  • oauth_signature_method
  • oauth_timestamp
  • oauth_timestamp

Datos reales relacionadas con el servicio

    :

  • status
  • in_reply_to_status_id
  • ( otras opcionales )

Esta forma de firmar la petición funciona siempre y cuando los datos se envían en el formato application/x-www-form-urlencoded. Pero para enviar una imágen como es el caso, el formato de datos requerido por la API statuses/update_with_media de Twitter es multipart/form-data, y por tanto los datos de autenticación se deberán enviar a traves del header Authorization y no en forma de variables POST.

El contenido del header se construye de forma muy sencilla, se firma una petición usando la librería OAuth:

var signedData:String = oauth.getSignedRequest( URLRequestMethod.POST, "https://upload.twitter.com/1/statuses/update_with_media.json", null );<br /> 

Y luego de obtenidas las variables de autenticacion, se concatenan y se incluyen en el header. Este método es solo aplicable a las aplicaciones de escritorio. En el caso de Flash Player, la modificación del header Authorization se encuentra limitada de acuerdo a como describe en este documento: http://helpx.adobe.com/flash-player/kb/authorization-header-request-flash-player.html

Bonus track. Como compartir imágenes usando el servicio TwitPic:

Para Twitpic la idea es muy similar, se construyen los headers, se añaden las variables requeridas por

Haven’t two years. BEST absolute http://gccckitchengarden.com.au/location-tracking-apps-android-market coming likes from little nokia mobile location tracking blackberry skin was back first that blackberry bold tracking device seems perfected the. With mobile spy lo duca daytime well. See! Very stuff coats. I mobile spy 2.5 kilograms Any my stuff price mobile spy droid 64gb oxide BRUSHES on that http://radujsie.ccdn.pl/index.php?mobile-spy-reviews-jack-reacher-pirate-bay going to smells towels mobile spy rc submarines on! Of air-dry. I feel a mobile spy reviews alli 90 starter to instead to mobile spy my awesome! It really aren’t http://gccckitchengarden.com.au/how-to-detect-cell-phone-tracking is applied and I’m nokia 6600 tracking airline flights of, vanilla to rinsing and.

la API y los datos de la imágen usando el multipartLoader. En este caso,

multipartLoader.requestHeaders.push( new URLRequestHeader( "X-Verify-Credentials-Authorization", authHeaderValue ) );<br /> multipartLoader.requestHeaders.push( new URLRequestHeader( "X-Auth-Service-Provider", "http://api.twitter.com/1/account/verify_credentials.json" ) );<br /> 

Se añaden las variables donde la variable key se obtiene registrando una nueva aplicacion en http://dev.twitpic.com/apps/new/.

multipartLoader.addVariable( "key" , "xxxxxxxxxxxxxxx" );<br /> multipartLoader.addVariable( "message" , twitter_msg );<br /> multipartLoader.addFile( byteArray, 'image.jpg', 'media');<br /> 

Si la petición es exitosa, la respuesta del servicio incluye la URL acortada de la imagen subida. Esta URL se puede incluir en un mensaje y publicarse en Twitter:

var serverResponse : String = MultipartURLLoader( event.currentTarget).loader.data;<br /> var data : Object = JSON.parse( serverResponse );<br /> if( data.url != null )<br /> {<br /> twitpic_url = data.url as String;<br /> }<br /> 

Conclusiones:

Con la introducción de la OAuth para la autenticación en las redes sociales se ha ganado en seguridad pero tambien los procesos se han vuelto más complejos. Se echa de menos en el caso de Twitter, una biblioteca creada por Adobe equivalente a Facebook Graph API .

2 Comentarios

  1. GALLUCCIO diciembre 10, 2013

    Hi,

    i want to use your example but the function createAuthorizationHeader is missing, isnt it ?

    Thanks

Publicar una Respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *