Publicar en Twitter con API y autenticación OAuth C#

En Desarrollo, Webmasters por

Este artículo dedicado a la API de Twitter nos enseñará a publicar en Twitter con la autentificación OAuth mediante un programa en C#. Encontraréis el código fuente para su descarga al final del artículo, que consiste en un proyecto para Visual Studio 2010 en C# bajo .Net Framework 4.

Hace unos días publiqué como autentificarse en la API de Twitter con C# empleando el método Application-only que nos da una funcionalidad un tanto limitada ya que sólo podemos “leer” datos. Con este método de autentificación no podemos publicar en Twitter, por lo que esta vez emplearemos el método de autenticación OAuth que si nos permite publicar en Twitter a través de la API.

Publicar en Twitter con API OAuth en C#

Antes de empezar a programar en C# tenemos que tener claros unos conceptos previos que ya hemos comentado en artículos anteriores que trataban sobre como crear una aplicación en Twitter para usar la API y los diferentes métodos de autentificación en la API de Twitter. Una vez tenemos claros esos conceptos previos podemos pasar al siguiente apartado.

Configuración correcta de la aplicación Twitter

En primer lugar debemos configurar correctamente nuestra aplicación Twitter de forma que tenga permisos de “lectura y escritura” y recordad que cada vez que cambiemos los permisos hay que volver a generar los tokens de acceso pulsando el botón “Recreate my access token”.

Nos harán falta los siguientes datos de nuestra aplicación:

  • Consumer key
  • Consumer secret
  • Access token
  • Access token secret

Autentificar la API con OAuth y publicar en Twitter

Aquí es donde está la clave para publicar en Twitter y el proceso de autenticación es sencillo pero requiere el uso de bastantes parámetros por lo que puede resultar confuso a primera vista, pero una vez que nos familiarizamos con ellos es un proceso relativamente sencillo. Iremos analizando uno a uno todos los parámetros para autentificar nuestra petición a la API de Twitter.

Pra una mejor compresión de este texto no está de más leer previamente los artículos de protocolo HTTP para desarrolladores y la segunda parte de protocolo HTTP para desarrolladores.

Análisis de la cabecera HTTP de autentificación OAuth en Twitter

La autenticación OAuth se reduce a tener que enviar una cabecera HTTP con una serie de parámetros. Esta cabecera HTTP es del tipo Authorization con una serie de parámetros OAuth bastante larga. Para hacerse una idea lo mejor es ver un ejemplo de la cabecera de autentificación para luego analizar en profundidad cada elemento:

Authorization: OAuth oauth_consumer_key="TgFJXZXthKo1PaPa2nojVw", oauth_nonce="fd499de05a62321f46992debde57ccb5", oauth_signature="B2mjoFqrH4ErcVvb4PTJ6WTdwdg%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1388241123", oauth_token="2209782272-KRjensh0cvhrndGPza0rnAsSAh7PNDYS7lQ6xyo", oauth_version="1.0"

De esta cabecera ya disponemos de los parámetros oauth_consumer_key (es la consumer key de nuestra aplicación) y oauth_token (es el access token de la aplicación twitter), por eso ya no hablaré de ellos puesto que ya los tenemos listos para usar.

Parámetro oauth_nonce

Es un parámetro de caracteres alfanuméricos y de 32 caracteres de longitud. En un principio Twitter recomendaba emplear una codificación base64 para generar el oauth_nonce, pero como a veces las cadenas codificadas con base64 tienen los caracteres NO alfanuméricos “/” y “=” había que borrarlos, por esto es mucho más cómodo emplear un hash MD5 para este parámetro puesto que cumple nuestros requisitos al ser siempre de longitud 32 y con caracteres alfanuméricos SIEMPRE.

En el programa en C# este parámetro se crea con la función CreateNonce() que lo único que hace es generar un hash MD5 a partir de la fecha y hora actual exacta, por lo que nos aseguramos de que siempre será único.

Parámetro oauth_signature_method

Poco hay que decir de este parámetro puesto que siempre será HMAC-SHA1 que es el método de codificación de la firma que usa la API de Twitter. HMAC-SHA1 es un método de codificación de datos, nada más.

Parámetro oauth_timestamp

Es un parámetro que indica a Twitter cuando fue creada la petición de autenticación. Twitter necesita que sea un valor próximo a la fecha en la que se realiza la petición porque sino descarta esa petición.
Para generar este parámetro se emplea la función CreateTimestamp() que nos da el total de segundos transcurridos desde la fecha de origen UNIX (1 de Enero de 1970) hasta la actualidad. A esta forma de medir el tiempo se la conoce como tiempo UNIX o tiempo POSIX.

Parámetro oauth_version

Este parámetro será siempre 1.0 para cualquier petición a la API de Twitter.

Otros parámetros empleados: status, request_type y resource_url

  • status: es exclusivo de este ejemplo, que recordemos consiste en publicar un nuevo Tweet usando la API y autentificación OAuth. El parámetro estatus no es más que el contenido del Tweet que queremos publicar.
  • request_type: no es más que el tipo de verbo empleado en nuestra petición HTTP, en este ejemplo es del tipo POST.
  • resource_url: es la URL que interpreta nuestra petición a la API, en nuestro caso como se trata de publicar un Tweet la URL es https://api.twitter.com/1.1/statuses/update.json

Parámetro oauth_signature

Lo he dejado de último porque es el más complejo y para poder generarlo necesitamos usar varios de los parámetros que nombramos anteriormente. Este parámetro no es más que una firma que informa a Twitter de la integridad del mensaje (comprueba que no se ha modificado al ser enviado) y al mismo tiempo verifica que la aplicación tiene permisos para interactuar con la cuenta Twitter del usuario. En el programa se emplea la función CreateOAuthSignature(). Esta función codifica con el algoritmo HMAC-SHA1 una cadena de texto con la información de nuestra petición (le llamaremos baseString).

La baseString se genera concatenando los siguientes parámetros con el carácter “&”:

  • oauth_consumer_key
  • oauth_nonce
  • oauth_signature_method
  • oauth_timestamp
  • oauth_token
  • oauth_version
  • status
  • request_type
  • resource_url

Una vez que tenemos nuestra baseString generada procedemos a codificarla con el algoritmo HMAC-SHA1 empleando como llave HMAC los parámetros oauth_consumer_secret y oauth_token_secret concatenados por el carácter “&”, obteniendo como resultado una cadena de texto codificada con base64 que es nuestro parámetro oauth_signature listo para usar.
Twitter c#

Realizar petición HTTP autentificada con OAuth a la API de Twitter

Ya disponemos de todos los parámetros necesarios para formar nuestra cabecera HTTP de autenticación por lo que procedemos a realizar la petición HTTP con el método POST.

En este apartado el código en C# habla por si sólo, ya que realizamos una petición HTTP con POST estándar. Lo único destacable es advertiros de que los caracteres especiales (no alfanuméricos) que pueda contener nuestro Tweet deben ser codificados con la función URLEncode() puesto que la función que trae .Net Framework para esta tarea Uri.EscapeDataString() no codifica caracteres como los paréntesis y da errores.

Hasta aquí con la teoría, como ya puedes descargar el proyecto en C# con el código listo para usar.

Espero que os haya gustado este nuevo tutorial de como publicar en Twitter con la API y autentificación OAuth bajo C#.

Comentarios (6)

hola, al tratar de publicar me aparece un error, ya cree una aplicación en twitter con Read, write, and direct messages pero al presionar enviar tweet me aparece el mensaje no se controlo web exception , error en el servidor remoto 401 no autorizado en la linea WebResponse response = request.GetResponse(); . si me podrías indicar que estoy haciendo mal, muchas gracias

¿Has puesto los datos correctamente?
Tienes que poner los datos de la aplicación Twitter consumer key , consumer secret, access token y access token secret sino no funciona.
Acabo de probar y me funciona correctamente. Si te devuelve ese error es porque no estas poniendo bien los datos.

Y ojo! despues de seleccionar que la app sea de lectura y escritura debes regenrar los access token.

Hola Zeo, Muy buen post, sabes estaba probando con tu código y funciona perfectamente pero cambiando ciertas cosas quise hacerlo pero en vez de utilizar update sencillo con https://api.twitter.com/1.1/statuses/update.json usar el http://upload.twitter.com/1/statuses/update_with_media.json para postear imagenes pero da error de permisos Error en el servidor remoto: (401) No autorizado. no siesi lo haz intentado, y lo curioso es que da el mismo error con las APIS de código abierto que se encuentran por allí,
leyendo acá https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media veo que los cambios son mínimos pero da igual .
pues solo comentaba a ver si habías probado y dado con la solución. saludos.

Yo no he probado para postear con imágenes si te soy sincero. No se que cambios habrás hecho en el código pero eché una visual rápida a la documentación y los cambios que habría que hacer son bastantes.

Siento no poder ayudarte más pero no traté de subir imágenes a Twitter.

Saludos.

Hola Emilio, eso tendrás que trabajarlo tu, siento no poder ayudarte. Te recomiendo que busques una libreria para trabajar con la API en lugar de hacer la programación manualmente, te ahorraras tiempo. Saludos.

Deja un comentario: