Les API de Twitter en .NET


Envoyer des messages sur Twitter à partir d'une application WinForm en C#

Introduction
Dans cet article, nous allons découvrir comment s'authentifier sur un compte Twitter à partir d'une application WinForm en C# et envoyer (pardon, "tweeter") un message.

Cette technique pourrait par exemple servir à automatiser l'envoi de tweets par une application batch, qui collecterait à intervalles réguliers les actualités et les événements à partir de différents sites (via des web services).

Prérequis
Pour s'interfacer avec Twitter, je vous recommande la librairie TwitterVB disponible en téléchargement sur CodePlex. Cette librairie fonctionne à partir de la version 2.0 du Framework .NET. Outre l'encapsulation complète des fonctions de l'API de Twitter, elle permet également d'accéder aux services de racourcissement d'URL, comme TinyUrl ou TRiM, ce qui n'est pas un luxe vu la taille réduite d'un tweet (140 caractères maximum).

Pour commencer, vous aller devoir enregistrer votre application sur Twitter, via cette adresse: http://twitter.com/oauth_clients
Une fois enregistrée, un code client et un code secret vous seront communiqués. Conservez-les précieusement.

Principes d'authentification via oAuth
oAuth est l'un des deux services d'authentification proposés par Twitter. Etant le plus récent, c'est celui qui est actuellement recommandé. Plusieurs étapes seront nécessaires avant de pouvoir utiliser le service de micro-blogging :

1. L'application fournit à Twitter son code client (ConsumerKey) et son code secret (ConsumerKeySecret)
2. Twitter retourne une URL permettant à l'utilisateur d'accepter ou de rejeter la demande d'accès de l'application
3. Twitter transmet un code PIN
4. L'application retourne le code PIN pour confirmer son identité
5. Twitter renvoie un code d'authentification (OAuthToken) et un code secret (OAuthTokenSecret)

A l'aide de ses quatre informations (ConsumerKey + ConsumerKeySecret + OAuthToken + OAuthTokenSecret), vous pouvez maintenant vous authentifier sur Twitter et envoyer des messages.

Le code source
Une fois téléchargée, ajoutez une référence à la librairie TwitterVB.dll. Nous allons commencer par une petite classe statique qui nous permettra de stocker quelques variables globales qui seront utilisée dans les différents formulaires de notre application.

MainForm.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TweetIt
{
    public class Globals
    {
        // Global settings
        public static string ConsumerKey = "votre clef";
        public static string ConsumerKeySecret = "votre code secret";
        public static string PinCode = string.Empty;
        public static string OAuthToken = string.Empty;
        public static string OAuthTokenSecret = string.Empty;


        // Global instances
        public static TwitterAPI tw = new TwitterAPI();
    }
}

Notre premier formulaire (MainForm.cs) servira à afficher la page de login de Twitter. Il se compose d'un contrôle WebBrowser (ctlWebBrowser) et d'un bouton Next (cmdNext).

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.IO;
using System.Text;
using System.Windows.Forms;
using TwitterVB2;
using Microsoft.VisualBasic;
namespace TweetIt
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            cmdNext.Enabled = false;
            try
            {
                // Get an authorization link from Twitter.
                string url = Globals.tw.GetAuthorizationLink(Globals.ConsumerKey, Globals.ConsumerKeySecret);
                ctlWebBrowser.Navigate(url);
                cmdNext.Enabled = true;
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

Ce code est très simple; on fournit via la méthode GetAuthorizationLink() la ConsumerKey et le ConsumerKeySecret et on affiche l'URL retournée dans l'application.
Une fois entré son adresse e-mail et son mot de passe, et après avoir cliqué sur le bouton Allow, un code PIN est affiché. L'utilisateur clique ensuite sur le bouton Next.

Dans l'événement Click ci-dessous, on commence par essayer de récupérer le code PIN affiché dans la page. Si aucun code n'est trouvé, on demande à l'utilisateur de le saisir tant qu'il n'est pas valide, ce qu'on peut vérifier à l'aide de la méthode ValidatePIN(). Si le code PIN est valide, les propriétés OAuthToken et OAuthTokenSecret de la classe TwitterAPI sont initialisées.

private void cmdNext_Click(object sender, EventArgs e)
{
string htmlBuffer = ctlWebBrowser.Document.Body.InnerHtml;
int pos = htmlBuffer.IndexOf("id=oauth_pin");
bool isValid = false;
string input = string.Empty;
// The PIN code looks like this:
// <DIV id=oauth_pin>3352515 </DIV>
if (pos > 0) {
input = htmlBuffer.Substring(pos + 13, 7);
}
isValid = Globals.tw.ValidatePIN(input);
while (!isValid)
{
input = Microsoft.VisualBasic.Interaction.InputBox("Please enter your PIN code", "Authentication", "", this.Left, this.Top);
isValid = Globals.tw.ValidatePIN(input);
if (input.Length == 0) isValid = true;
}
if (isValid && input.Length > 0)
{
try
{
Globals.OAuthToken = Globals.tw.OAuth_Token;
Globals.OAuthTokenSecret = Globals.tw.OAuth_TokenSecret;
this.Hide();
MonitorForm aForm = new MonitorForm();
aForm.Show();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n" + ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else {
Application.Exit();
}
}

Nous pouvons à présent afficher le formulaire de saisie du message. Celui-ci comprend une TextBox multi-lignes (txtMessage) et un bouton Tweet (cmdTweet). Deux méthodes suffisent pour s'authentifier et envoyer un message:

private void cmdTweet_Click(object sender, EventArgs e)
{
if (txtMessage.Text.Length == 0) return;
try
{
Globals.tw.AuthenticateWith(Globals.ConsumerKey, Globals.ConsumerKeySecret, Globals.OAuthToken, Globals.OAuthTokenSecret);
Globals.tw.Update(txtMessage.Text);
txtMessage.Text = string.Empty;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n" + ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Enfin, pour terminer, voici la méthode à utiliser pour raccourcir une URL et l'inclure dans votre message:

string longUrl = "votre url";
string shortUrl = string.Empty;
shortUrl = Globals.tw.ShortenUrl(longUrl, TwitterVB2.Globals.UrlShortener.TinyUrl, shortUrl);

Conclusion
TwitterVB est une des librairies les plus complètes à ce jour pour interfacer un programme .NET avec Twitter, que ce soit une application web ou desktop.

Commentaires