Tutorial: Die FriendFeed API mit C# (oder Visual Basic)

Nach den vielen Tutorials zu Facebook heute mal etwas zu dem m. E. vielfach unterschätzten Dienst FriendFeed. Dessen API ist eine feine Sache, da zum einen der Zugriff trotz OAuth relativ unkompliziert ist (es gibt sogar noch einen Basic Auth Zugang, der aber in Kürze abgestellt werden soll und deshalb hier keine Erwähnung findet). Zum anderen hat man via FriendFeed Zugriff auf knapp 60 Social Networks, kann also auf diesem Wege sozsuagen mit einer Schnittstelle sehr viel erreichen – z. B. Flickr, delicious, Digg, Mixx, Last.fm, YouTube uvm.

Als ich für ein Kundenprojekt die FriendFeed Anbindung programmiert habe bin ich fast verzweifelt. Ich habe es nicht geschafft, mit C# Daten via POST an FriendFeed zu senden – GET war kein Problem, da aber Status Updates und Bilduploads POST erfordern musst ich auch dies hinbekommen. Ich hatte bereits vor einiger Zeit eine FriendFeed Anbindung mit PHP realisiert und wusste, dass es eigentlich „ganz einfach“ gehen muss. Des Rätsels Lösung verrate ich unten – jetzt erstmals die Basics:

1. Als erstes muss man seine Application bei FriendFeed registrieren. Man wählt einen Namen und „Installed application“ (nicht „Browser“) sowie eine „FeedBack Group“ (bei der Nutzer der Application Fragen und Kommentare posten können). Ansonsten sind keine Einstellungen notwendig:

http://friendfeed.com/api/register

2. Nach der Registrierung erhält man den Consumer Key sowie das Consumer Secret.

3. Jetzt erstellt man folgendes Form unter C# (oder Visual Basic) – die Express Edition ist ausreichend, hier im Screenshot die 2010er Version:

4. Für die Authentifizierung eines Users ist es einfacher als bei vielen anderen Social Networks (siehe z. B. meine Tutorials zu Twitter oder Facebook). Es ist kein interner Browser notwendig, was die Sache unkomplizierter macht (aber auch die Gefahr mit sich bringt, dass ein App-Entwickler das Passwort des Users abspeichert – aber das ist ein anderes Thema). Für OAuth verwende ich die Klasse, die Eran Sandler dankenswerterweise erstellt hat (siehe Download auf Google Code). Mit folgenden Code lassen sich die Tokens für einen User in FriendFeed ermitteln (hier in C#, Visual Basic siehe unten):

//WebClient anlegen
WebClient myWebClient = new WebClient();

//oAuth anlegen
OAuth.OAuthBase oAuth = new OAuth.OAuthBase();

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

//ggf Umlaute in PW fixen
string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };
string Passwort=textBoxPassword.Text;
StringBuilder escaped = new StringBuilder(Uri.EscapeDataString(Passwort));
for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++)
{
  escaped.Replace(UriRfc3986CharsToEscape[i],
  Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
}
Passwort = escaped.ToString();
String FFReqParameters = "ff_username=" + textBoxUsername.Text
  + "&ff_password=" + Passwort;

String OAuthReqParameters = "";
String RequestMethod = "GET";

//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://friendfeed.com/account/oauth/ia_access_token?"
  + FFReqParameters;

Uri APIUri = new Uri(APIUrl);

// 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);

// die Signatur fehlt noch im vorbereiteten Request
OAuthReqParameters = OAuthReqParameters + "&" + "oauth_signature=" + signature;
string AntwortString = "";
Byte[] Antwort;

// Senden ...
try
{
  Antwort = myWebClient.DownloadData(
    "https://friendfeed.com/account/oauth/ia_access_token?"
    + OAuthReqParameters);
    AntwortString = System.Text.Encoding.ASCII.GetString(Antwort);
  System.Windows.Forms.MessageBox.Show(AntwortString);
}
catch (Exception ex)
{
  System.Windows.Forms.MessageBox.Show(ex.Message);
  return;
}

//Jetzt das Access-Token gan "mnauell" aus der Antwort filtern
string[] tokensplit = AntwortString.Split(new Char[] { '&' });
foreach (string s in tokensplit)
{
  string[] zeilesplit = s.Split(new Char[] { '=' });
  if (zeilesplit[0] == "oauth_token")
  {
    textBoxAccessToken.Text = zeilesplit[1];
  }
  else if (zeilesplit[0] == "oauth_token_secret")
  {
    textBoxAccessTokenSecret.Text = zeilesplit[1];
  }
}

5. Hat man die Access Tokens des Users ermittelt kann man nun beispielsweise ein Status Nachricht  senden (was noch alles geht siehe offizielle Doku der API).  Wie oben bereits angedeutet kann man da nun verzweifeln, denn FriendFeed akzeptiert POST via C# nicht so einfach. Zuerst habe ich einen Fehler in der OAuth-Signatur vermutet, nach ausführlichem Test und Analyse des Netzwerkverkehrs war mir klar, dass es an dem Request-Header liegt. Hier wartet FreindFeed auf „Content-type: application/x-www-form-urlencoded“, die der .Net WebClient jedoch nicht sendet. Mit folgender Zeile war dann das Problem gelöst:

myWebClient.Headers.Add(
"Content-type: application/x-www-form-urlencoded");

6. Hier nun der komplette Code:

 //WebClient anlegen
 WebClient myWebClient = new WebClient();

 //Wer folgende Zeile vergisst wird verzweifeln:
 myWebClient.Headers.Add("Content-type: application/x-www-form-urlencoded");

 //oAuth anlegen
 OAuth.OAuthBase oAuth = new OAuth.OAuthBase();

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

 //ggf Umlaute in Nachricht fixen:           
 string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };
 string Nachricht = textBoxNachricht.Text;
 StringBuilder escaped =
 new StringBuilder(Uri.EscapeDataString(Nachricht));
 for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++)
 {
   escaped.Replace(UriRfc3986CharsToEscape[i],
   Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
 }
 Nachricht = escaped.ToString();

 string FFReqParameters = "format=xml&body=" + Nachricht;
 string OAuthReqParameters = "";
 string RequestMethod = "POST";

 //die Tokens und Keys
 string AccessToken = textBoxAccessToken.Text;           
 string AccessSecret = textBoxAccessTokenSecret.Text;           
 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 vorliegen           
 string APIUrl = "http://friendfeed-api.com/v2/entry" + "?" + FFReqParameters;
 Uri APIUri = new Uri(APIUrl);

 // 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);

 // die Signatur fehlt noch im vorbereiteten Request
 OAuthReqParameters = OAuthReqParameters + "&" + "oauth_signature=" + signature;

 // Senden ...
 string AntwortString = "";
 Byte[] Antwort;
 try
 {
   Antwort = myWebClient.UploadData(APIUri,
   RequestMethod, Encoding.UTF8.GetBytes(OAuthReqParameters));
   AntwortString = System.Text.Encoding.ASCII.GetString(Antwort);
   System.Windows.Forms.MessageBox.Show("Erfolgt - Antwort: " + AntwortString);
 }
 catch (WebException ex)
 {
   System.Windows.Forms.MessageBox.Show(ex.Message);               
 }
}

Noch ein abschließender Tipp: Die FriendFeed Server sind sehr häufig überlastet. Es lohnt sich also, einen Vorgang zwei oder dreimal zu wiederholen, bevor man einen Fehler im eigenen Code sucht.

Und hier noch die Codebeispiele in VisualBasic:

FriendFeed.vb (dafür benötigen Sie OAuthBase.vb, Details dazu finden Sie hier).

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 API, C#, FriendFeed, Programmierung, Visual Basic abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu Tutorial: Die FriendFeed API mit C# (oder Visual Basic)

  1. Simon A. Frank sagt:

    Hallo Eraser, meine Projektmappen sind immer voller Test und Experimente, deshalb stelle ich hier meist immer nur die „sinnvollen“ Ergebnisse online, d.h. die VB bzw. C#-Dateien und die Klassen (Links siehe oben). Die Formulare sind ja schnell gebastelt und die meisten wollen dies sowieso anders gestalten!

  2. Eraser sagt:

    könnte man deine projekte möglicherweise auch laden, die projektmappe wen schon..?

Kommentar verfassen

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