Twitter mit OAuth statt Basic Auth mit C# und .Net – Ein kurzes Tutorial

Nachdem Ende August 2010 das Team von Twitter nun endgültig den Basic Auth Zugang abgestellt hat ist man gezwungen, Tools und Scripte entsprechend anzupassen. Vor einigen Tagen hatte ich dazu ein kurzes Tutorial geschrieben, wie man Perl-Scripts für Twitter auf OAuth umstellt. Heute folgt wie versprochen nun noch das Beispiel für .net mit C#, das damit das Tutorial „Twitter mit C#“ aktualisiert.

Auch hier gilt: Eine  komplette Umstellung auf OAuth ist eine aufwendige Sache. Im Folgenden wird nur ein schneller und einfacher Weg beschrieben, der erklärt, wie man einfache Scripts, die von einem Twitter-Account „benutzt“ werden, mit OAuth versorgt. Bei komplexeren Angelegenheiten empfiehlt es sich möglicherweise, fertige Bibliotheken zu nutzen (vgl. dazu die Links auf den Twitter-Dev Doku-Seiten).

Als erstes müssen Sie Ihr „application“ bei Twitter registrieren:

1. Surfen Sie auf http://dev.twitter.com

2. Loggen Sie sich mit dem Twitter-Account ein, mit dessen Account später auch das Script ausgeführt werden sollen. (Wenn Sie also ein Script schreiben, das direct messages von „peter_panter“ an dessen Follower senden soll, loggen Sie sich als „peter_panter“ ein).

3. Füllen Sie das Registrierungs-Formular aus. Application-Type: Client und Read&Write auswählen (kann ggf. später noch geändert werden, vgl unten).

4. Jetzt erhalten Sie den Consumer Key und das Consumer Secret (dies sind die Zugangsschlüssel für die Anwendung, die  sich nicht ändern würden, wenn Sie einen anderen Benutzer das Script ausführen lassen – in unserem Fall: Würden Sie das Script so ändern, dass nicht „peter_panter“ sondern „theo_tiger“ direct messages versenden soll würde sich der Consumer Key und das Consumer Secret nicht ändern).

5. Klicken Sie auf „My Access Token“. Dann erhalten Sie das Access Token sowie das Access Token Secret für den aktuell eingeloggten User (in unseren Beispiel „peter_panter“. Würde Sie das Script so ändern, dass „theo_tiger“ direct messages versenden soll müssen Sie dessen Access Token und Access Token Secret generieren – dies ginge nicht so einfach mit dev.twitter.com – man müsste dann oAuth komplett implementieren).

Nachdem Sie nun die vier Keys haben kann es in C# losgehen. Im folgenden Beispiel verwende ich Visual C# 2008 Express, mit anderen Versionen müsste dies ähnlich zu realisieren sein.

6. Für die Signatur verwende ich die einfache und deshalb leicht zu benutzende C#-Klasse OAuthBase, die Eran Sandler dankenswerterweise erstellt hat und die auch auf der offiziellen OAuth Homepage empfohlen wird (Download bei googlecode).

7. Ausgangspunkt ist das Projekt „TwitterTutorial“, das ich vor einigen Wochen in diesem Blog veröffentlicht hatte. Dieses erweitere ich nun um eine Schaltfläche „Tweet mit OAuth senden“ (tatsächlich können Sie die alte Taste „Tweet mit Basic Auth senden“ löschen, diese funktioniert seit 1. September 2010 durch die Umstellung der Twitter-API nicht mehr).

8. So sieht nun der Code aus:

// für WebClient
WebClient myWebClient = new WebClient();
Byte[] req, Antwort;

// oAuth
OAuthBase oAuth = new OAuthBase();

// Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
System.Net.ServicePointManager.Expect100Continue = false;

// Für direct message werden die Parameter user (Empfänger)
// und  text (Nachricht) benötigt
String TwitterReqParameters = "user=Simon_A_Frank";

/ Für direct message werden die Parameter text (Nachricht)
// und user (Empfänger) benötigt
String TwitterReqParameters = "user=Simon_A_Frank";
TwitterReqParameters += "&text="
 + HttpUtility.UrlPathEncode(txtTweet.Text.ToString());
// UrlEncode hilft leider nicht, UrlPathEncode hilft ein
// wenig, aber es gibt noch Probleme mit Umlauten und Sonderzeichen
// (vgl. Anmerkungen unten)

// die OAuth ReqParameters – sind noch leer, werden unten generiert
String OAuthReqParameters = "";

// Sonstige Einstellungen
String RequestMethod = "POST";

//die Tokens und Keys
String AccessToken = "???";
String AccessSecret = "???";
String ConsumerKey = "???";
String ConsumerSecret = "???";

// Zeit und Nonce lassen sich mit Hilfe von OAuthBase einfach generieren
String Nonce = oAuth.GenerateNonce();
String Zeitstempel = oAuth.GenerateTimeStamp();

// Die URL muss mit Parametern (auch bei POST!) als String und
// URI vorligen – etwas verwirrend, aber so will es OAuthBase
String APIUrl = "https://twitter.com/direct_messages/new.xml"
  + "?" + TwitterReqParameters;
Uri APIUri = new Uri(APIUrl);

// Zum Test können Sie vorher und nacher die Parameters ausgeben:
Console.WriteLine("OAuthReqParameters – noch leer: " + OAuthReqParameters);

// Jetzt die Signature generieren
// außerdem wird hier die APIUrl normalisiert
// und OAuthReqParameters generiert
String signature = oAuth.GenerateSignature(APIUri, ConsumerKey,
 ConsumerSecret, AccessToken, AccessSecret, RequestMethod,
 Zeitstempel, Nonce, out APIUrl, out OAuthReqParameters);
Console.WriteLine("OAuthReqParameters – mit oauth_ Parameters: "
 + OAuthReqParameters);

// die Signatur fehlt noch im vorbereiteten Request
OAuthReqParameters = OAuthReqParameters + "&"
 + "oauth_signature=" + signature;
Console.WriteLine("OAuthReqParameters – mit Signatur: "
 + OAuthReqParameters);

// Jetzt in byte[] umwandeln:
req = Encoding.UTF8.GetBytes(OAuthReqParameters);

// Senden
try
{
  Antwort = myWebClient.UploadData(APIUrl,"POST", req);
  //Die Antwort von Twitter ausgeben (XML-Daten):
  MessageBox.Show(System.Text.Encoding.ASCII.GetString(Antwort));
}
catch (Exception ex)
{
  //Wenn es nicht klappt Fehler ausgeben
  MessageBox.Show(ex.Message);
}

Noch ein paar Anmerkungen:

  • Leider gehen weder Umlaute noch Sonderzeichen – hier hatte ich noch keine zündende Idee. Auch in OAuthBase wurde hier „rumgebastelt“ – jedoch funktioniert OAuthBase.UrlEncode für Twitter auch nicht. Vielleicht hat jemand hier noch eine gute Idee? (Update 4. November 2010: Jetzt ist das Problem gelöst, Details finden Sie hier).
  • Wenn Sie keine direct message sondern ein Update senden möchten sind folgende zwei Änderungen notwendig:
    String TwitterReqParameters = „update=Hallo Welt, dies ist mein Update“;
    String APIUrl = “ https://twitter.com/statuses/update.xml “ + „?“ + TwitterReqParameters;
  • Wenn Sie bei der Registrierung der App nur „Read“ auswählen wird der falsche Access Token generiert bzw. mit dem Token kann man nur Lesen – auch wenn man das später umstellt; entfernen Sie die Verbindung der Anwendung zu dem Account und stellen Sie diese wieder her; mit dem neuen Token geht es dann.

P.S.

Probleme? Fragen? Anregungen? Ich helfe jederzeit und gerne  – einfach einen Kommentar oder Mail schreiben, die Antwort kommt schnellstmöglich. Unternehmen, die Unterstützung, Beratung oder Schulung bei der API- oder Webprogrammierung, der Social-Media-Entwicklung oder dem Social-Media-Management benötigen finden zudem entsprechende Angebote meiner Firma auf der Website www.Frank-IT-Beratung.de

Dieser Beitrag wurde unter C#, Programmierung, Twitter abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

9 Antworten zu Twitter mit OAuth statt Basic Auth mit C# und .Net – Ein kurzes Tutorial

  1. Pingback: Tutorial: Die FriendFeed API mit C# (oder Visual Basic) « Frank IT Consulting&Training

  2. Pingback: Twitter API mit OAuth und Visual Basic « Frank IT Consulting&Training

  3. Pingback: Twitter mit OAuth und C# – So geht’s auch mit Umlauten und Sonderzeichen « Frank IT Consulting&Training

  4. Christian sagt:

    Es gibt da was, schau mal auf http://blog.nerdbank.net/2009/05/uriescapedatapath-and.html. Binde die Funktion ein und ersetze den Aufruf für das url encoding durch den Aufruf der neuen Funktion.
    Dann funktioniert das Senden von Umlauten und Sonderzeichen.

  5. Danke für das Feedback. Ja, so ähnlich geht das auch in C# jedoch gibt es ein anderes Problem: Der Request muss ja noch signiert werden und das habe ich nach sämtlichen Umwandlungen nicht mehr geschafft.

  6. Michael sagt:

    Bin zwar kein C# Coder aber mit PHP hatte ich auch das Problem. Gelöst wurde es mit dem Call:

    urldecode(utf8_encode(urlencode(„Müller öäüßßß“)))))

  7. Wenn jemand noch eine einfache Idee zu dem Umlaut- und Sonderzeichen-Problem hat freue ich mich auf jeden Hinweis.

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.