Während im ersten und zweiten Teilen des Tutorials zur Facebook API mit C# und Visual Basic nur Daten gesendet wurden, geht es im heutigen dritten Teil darum, Daten auszulesen und aufzubereiten. Als Beispiel soll nicht auf die eigene, sondern auf die Pinnwand eines Freundes ein Update gepostet werden. Die URL für die eigene Pinnwand lautet ja bekanntlich
https://graph.facebook.com/me/feed
für die eines Freundes jedoch
https://graph.facebook.com/[ID des Freundes]/feed
Es muss also die eigene Freundesliste ausgelesen werden, in der Name und ID aller Freunde zu finden sind. Diese Liste hat eine sehr überschaubare Struktur, deshalb kann daran gut gezeigt werden, wie man die von Facebook in JSON gelieferten Daten sinnvoll in C# bzw. Visual Basic verarbeitet (Im vierten Teil des Tutorials folgt dann übrigens ein etwas komplexeres Beispiel, das u.a. das Auslesen des eigenen Newsfeed beinhaltet).
Ich möchte nochmals betonen, dass ich kein SDK verwende sondern ausschließlich die .Net-„Bordmittel“ – das hat diverse Vor- aber natürlich auch einige Nachteile (die vielleicht ein andermal diskutiert werden). Die folgenden Codebeispiele sind in C#, ganz am Ende ist das komplette Beispiel dann auch in Visual Basic zu finden.
1. Als erstes habe ich das Ergebnis des letzten Tutorials um einige Beschriftungen und um einen Command-Button (cmdFreundeLaden) sowie eine Dropdown-Liste (comboFreunde) erweitert:
2. Das Auslesen der Freundesliste (beim Klick auf cmdFreundeLaden) ist nahezu identisch mit dem Senden eines Pinnwandeintrags. Im ersten Schritt soll zum Verständnis die Rückgabe in JSON in einer MessageBox ausgegeben werden:
//Liste der eigenen Freunde auslesen
string GraphURL = "https://graph.facebook.com/me/friends?&access_token="
+ AccessToken;
//WebClient anlegen
System.Net.WebClient myWebClient = new System.Net.WebClient();
//Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
System.Net.ServicePointManager.Expect100Continue = false;
try
{
Antwort = myWebClient.DownloadData(GraphURL);
MessageBox.Show(System.Text.Encoding.ASCII.GetString(Antwort));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
3. Die Liste der Freunde sieht in JSON so aus:
{
"data":
[
{
"name": "Peter Panter",
"id": "123456"
},
{
"name": "Theo Tiger",
"id": "654321"
},
{
"name": "Ignaz Wrobel",
"id": "87654"
}
]
}
4. Mit Hilfe des .Net JSON-Serializer lässt sich dies nun in eine C# Klasse umwandeln. Anders als in JavaScript oder PHP muss jedoch die Klasse zuvor angelegt werden. Das ist aber schnell geschehen. Wichtig ist dabei, den Klassennamen mit [DataContract] und die Eigenschaften mit [DataMember] zu versehen (und damit serilisierbar zu machen):
[DataContract]
public class FriendList
{
[DataMember(Name="data")]
public FriendData[] Friend { get; set; }
}
[DataContract]
public class FriendData
{
[DataMember]
public string id { get; set; }
[DataMember]
public string name { get; set; }
}
5. Das „root“-Element (bzw. Objekt) heißt bei Facebook immer „data“. Mit [DataMember(Name="data")] mappe ich „data“ auf einen lesbareren Namen, in diesem Fall „Friend“. Das ist nicht unbedingt erforderlich, macht aber später den Code übersichtlicher: um dann auf den Namen des ersten Freundes zuzugreifen heißt es so eben nicht „myFriendList.data[0].name“ sondern „myFriendList.Friend[1].name“.
6. Ist die Klasse vorbereitet kann der Rückgabewert (Antwort) wie folgt deserialisiert werden (Hinweis: der JSON-Deserilizer ist ab .Net 3.5 verfügbar; um diesen zu verwenden muss im Menu “Projekt” ein Verweis auf “System.Runtime.Serilization” gesetzt werden).
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(FriendList)); MemoryStream ms = new MemoryStream(Antwort); myFriendList = ser.ReadObject(ms) as FriendList;
7. Zum Test kann nun der Name des ersten Freundes ausgegeben werden:
MessageBox.Show("Name: " + myFriendList.Friend[0].name
+ " / ID: " + myFriendList.Friend[0].id);
8. Jetzt werden alle Namen in die ComboBox gepackt:
// erstes Element ist meine eigene Pinnwand
comboFreunde.Items.Add("me");
for (int i = 0; i < myFriendList.Friend.Length; i++)
{
comboFreunde.Items.Add(myFriendList.Friend[i].name
+ " (ID: " + myFriendList.Friend[i].id + ")");
}
comboFreunde.SelectedIndex = 0;
9. Als Letztes muss nun das Senden des Updates modifiziert werden. Statt
string GraphURL = "https://graph.facebook.com/me/feed";
heißt es nun (Index 0 ist „me“, deshalb -1):
GraphURL = "https://graph.facebook.com/" + myFriendList.Friend[comboFreunde.SelectedIndex - 1].id + "/feed";
10. Das war’s (und es funktioniert natürlich nur, wenn der betreffende Freund Einträge auf seiner Pinnwand zulässt). Hier nochmals der komplette Code in C# und Visual Basic:
C#: FBTutorialTeil3.cs und die Klasse FriendList.cs
Visual Basic: FBTutorialTeil3.vb und die Klasse FriendList.vb
Im vierten Teil des Tutorials folgt dann ein etwas komplexeres Beispiel, das u.a. das Auslesen des eigenen Newsfeed beinhaltet.
Update 14.11.2011: Der vierte Teil ist nun fertig, jedoch geht es nicht um Newsfeeds, sondern um Foto-Uploads. Die Newsfeeds wäre ich in einem sechsten Teil erklären.




Pingback: Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 2) « Frank IT Consulting&Training
Sehr schön, danke =)
Werde ich mir erstmal schön angucken =)
Gruß
Hab es versucht in dev C++ zu Compalieren.. Welche Libaries brauche ich noch?
Das Beispiel ist C# nicht C++ – möglicherweise überlesen?
Auch dort kann man entweder c++ oder C# projekte erstellen. Ich habe selbtsverständlich ein C# Projekt verwendet…
Ok, wunderbar, da müsste es funktionieren. Ganz oben am Ende des Artikel sind zwei Links zu den Quellcodes – hier sieht man auch alle “usings”, die man nich vergessen darf – dann müsste es funktionieren. Wenn es nich klappt: Einfach nochmals melden, ich helfe gerne!
Kann mal das auch für Visual Basic übersetzen, ich will diese seite hier https://graph.facebook.com/100001363520746 in JSON auslesen und die einzelhnden Variablen weiterverarbeiten!
Ist schon übersetzt: Ganz am Ende des Artikels sind zwei Links zu den Beispielen in Visual Basic!
Also ich habe jetzt Versucht das JSON Request zu Deserialisieren, aber leider kennt ehr die ganzen Attribute _ und _ nicht! Was kann ich da machen?
Grüße, Aleksandar Herbrich
Leider verstehe ich die Frage nicht ganz (oder Sitze gerade auf dem Schlauch) – welche Attribute meinst Du?
Der DataContractJsonSerializer Fehlt, ich kan in der endsprechenden namespace leider echt keine JSON namespace finden.
Bin so langsam echt am verzweifeln, welche netversion brauche ich da?? Ich habe glaube Netframework 4 und Visual Studio 2010 Professional.
Es fehlt die gesamte Namespace (habe ich festgestellt)
Ich rede von den Attributen:
DataContract und DataMember
…das müsste eigentlich genügen und
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
aber ich schau mir das nochmals in meinem Projekt an, auf das ich gerade keinen Zugriff habe. Ich melde mich nochmal!
Ich schreibe in Visual Basic und da finde ich das leider nicht als namespace. Aber ich werde nochmal in C# nachsehen
)
Ja, das geht auch in VB und jetzt ist mir die Lösung wieder eingefallen: wenn man nicht zufällig auch den Visual Studio Web Developer installiert hat geht das “automatisch”, ansonsten muss man unter “Verweise” des Projekts die System.Runtime.Serialization hinzufügen!
Vielen dank, du weiß echt nicht wie sehr du mir geholfen hast
)
Vielen dank, ich habe es jetzt geschaft, wer es selber sehen will,
http://update.zentrix.co.cc/facebook_checker/app/explorer/FrindList.aspx?acount=&access_token=
Aber ich habe noch eine kleine Frage, undzwar wie mache ich dass mit den Paging, weil das ist ja (leider) Dynamisch. Ich habe da ja auf seite 1 nur “Vor” und schon ab seite 2 “Vor” und “Zurick”, aber die Statische Klasse kann das ja nicht ohne Excption abbilden oder??
Doch, das ist kein Problem – man muss die Klasse(n) wie folgt verändern. Es macht nichts, wenn “previous” oder “next” leer ist.
[DataContract]
public class FriendList
{
[DataMember(Name="data")]
public FriendData[] Friend { get; set; }
[DataMember(Name="paging")]
public PagingData Paging { get; set; }
}
[DataContract]
public class PagingData
{
[DataMember]
public string next { get; set; }
[DataMember]
public string previous { get; set; }
}
Da hast du Vaiablen vergessen^^
Echt, ich verwendete für mein anderes Modul noch den alten Javascript Deserialisierer und der pakte mir alles schön in eine Directory und das ding war dan sehr mit Fehlern behaftet, leider
.
Aber ich werde es gleich mal umsetzen. Den mit Paging kann ich dann die gesamte Freundesliste holen.
Ich habe übrigens dein Code einwenig umgeändert, access_token ist jetzt ein Get Parameter geworden und me wurde durch Acount ersetzt.
Aber vielendank für diesen hilfreichen Anreiz, den dein Code hat mir echt sehr weiter geholfen!!!!
Ich habe da ein kleines Problehm, den “next” läst sich in Visual Basic leider nicht Declarieren
Kanst du mir ein Deserialisirungs Modell für den Facebook Feed schreiben. Ich hänge da irgendwie etwas fest.
ok, das Problehm habe ich gelößt ich habe nur die [] vergessen, also nicht next sondern [next]
Hallo, ich bin schon viel weiter gekommen und habe ein Deserialisierungs Model für ein Facebook Account erstellt.
Aber da gibt es ein Feld:
“interested_in”: [
"female"
],
wie deserialisiere ich das, ist das eine Array, oder einer eine Unterklasse, und was ist das Item “female” den überhaupt in vb.net Quellcode??
ja, das ist ein Array, also mit []! Wenn es nicht klappt schicke es mir per Mail, dann helfe ich gerne!
Hey, super tutorial, habe lange nach sowas gesucht
Nun zu meinem Problem: Der Code kommt mit Sonderzeichen aller Art (zB dem “è”) nicht zurrecht. Wie muss ich den Code verändern, damit ich auch bei Freunden mit solchen Namen keine Fehler bekomme?
LG
Hallo Christian, vielen Dank
zu der Sache mit den Umlauten habe ich mal einen extra Beitrag geschrieben:
http://frank-it-beratung.com/blog/2011/07/16/oauth-probleme-mit-umlauten-losungen-fur-php-perl-c/
so müsste es eigentlich gehen!
Hallo Simon,
irgendwas stimmt mit dem Code für Vb bei dem angegeben Post aber nicht die Zeile
“New () {“!”, “*”, “‘”, “(“, “)”}”
ist nicht richtig.
Die “()” Klammern mag er nicht. “Es wird ein Typ erwartet”
Könntest du evtl. nachhsehen woran das Liegt?
LG und vielen Dank
Christian