In dem heutigen zweiten Teil des Tutoriums geht es darum, wie man eine einfache Multi-User-Lösung bastelt. Der entscheidende Unterschied zum ersten Teil ist dabei, dass das Access-Token generiert werden muss. Auf vielfachen Wunsch sind die Beispiele hier in Visual Basic, ganz unten finden Sie das Ergebnis auch in C#.
1. Ausgangspunkt ist das Ergebnis des ersten Tutorials. Erweitern Sie nun das Form um das Steuerelement WebBrowser (WebBrowser1), das für den Login-Prozess benötigt wird sowie um eine Textbox (txtAccessToken) und eine Schaltfläche, die den Login-Prozess starten soll (cmdLogin).
2. Löschen Sie hier das hart codierte Access Token und ändern Sie das wie folgt:
Dim AccessToken As String AccessToken = txtAccessToken.Text
3. Bei cmdLogin.Click wird die URL zusammengestellt und aufgerufen. Ggf. sollten Sie hier die Berechtigung (Scope) anpassen. Um ein zeitlich nicht begrenztes Token zu verwenden beispielsweise scope=offline_access (Details siehe offizielle Doku).
Dim u As String = "https://graph.facebook.com/oauth/authorize?" 'Anwendungs-ID u = u + "client_id=IhreIDhierEinfügen" 'Berechtigung u = u + "&scope=publish_stream" 'URL, die nach Aufruf angezeigt wird u = u + "&redirect_uri=http://www.facebook.com/connect/login_success.html" 'Login-Typ u = u + "&type=user_agent" u = u + "&display=popup" WebBrowser1.Navigate(u)
4. Das Access-Token wird nach dem Login und der Bestätigung der Berechtigung als Teil der URL angezeigt. Der Event-Handler von WebBrowser1 für „Navigated“ prüft jeweils die URL und extrahiert bei Erfolg das Token. Man könnte hier noch – um sicher zu gehen – den Seitentext auslesen, bei Erfolg steht nur „Success“ auf der Website (siehe dazu auch das kürzlich hier veröffentlichten Screen-Scrapping Tutorial).
Private Sub WebBrowser1_Navigated ... Handles WebBrowser1.Navigated
'der Access-Token hängt an der URL
Dim q As String = WebBrowser1.Url.ToString()
'jetzt auslesen
If q.Contains("#access_token=") Then
q = q.Substring(q.IndexOf("access_token=") + 13)
txtAccessToken.Text = q.Substring(0, q.IndexOf("&"))
End If
End Sub
5. Nun müsste es funktionieren und so aussehen:
Hier nochmals der gesamte Quelltext in C# und Visual Basic:
FBTutorialTeil2.cs und FBTutorialTeil2.vb
Update am 18.2.2011: Nun ist auch der 3. Teil des Tutorials online.





Pingback: Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 1) « Frank IT Consulting&Training
Hallo,
das Tutorial gefällt mir sehr gut, werde es die Tage mal ausprobieren.
Ich habe aber da eine Frage und zwar on sie evtl noch ein Tutorial schreiben können, wie man ein bisschen mehr auf Facebook macht, also zum Beispiel Aktuelles auslesen, also die Neuigkeiten, wie man zB auf den Smartphone apps immer angezeigt bekommt.
Schönen Gruß,
Dominic
Vielen Dank für das Feedback – gute Idee, kann ich mal bei Gelgenheit machen!
Das wäre nämlich richtig cool
habe nämlich vor ein kleines App für Windows zu schreiben, womit ich halt die Neuigkeiten angezeigt bekomme, oder alle meine Freunde einsehen kann =)
Freue mich auf weitere Tutorials …
Schönen Gruß,
Dominic
Mich würde auch stark interessieren, wie ich zB meinen eigenen Feed oder ähnliches auslese.
Ich dachte, das müsste ganz einfach sein, bekomme es aber leider überhaupt nicht hin
Ok, ich habe mehrere Mails und Anfragen deswegen bekommen und werde das in einem dritten Teil erklären!
publish post
ist es möglich mit der GraphApi in .NET c# an ein Facebook Mitglied (nicht aber der aktuell accesstoken inhaber) welches der AppId das Vertrauen geschenkt hat auf die Pinwand zu posten?
Wenn ja wie?
Merci
Norbert
Ja, das ist möglich (und ein “Vertrauen” ist gar nicht notwendig). Wenn also X und Y Freunde sind (und Y erlaubt, dass Freunde auf seine Pinnwand posten) kann sich X z. B. mit dem in diesem Tutorial beschriebenen Tool ein Access-Token generieren (Permission: “publish_stream” oder “offline_access”) und dann auf Y’s Pinnwand posten, indem er statt auf “graph.facebook.com/me/feed” den Username des Freundes angibt. So würde das z. B. für meine Pinnwand aussehen:
string GraphURL = “https://graph.facebook.com/simon.a.frank/feed”;
Wenn der Benutzer keinen Usernamen eingerichtet hat (“Vanity URL”) kann man statt des Usernamens die UserID angeben. Im nächsten Tutorial werde ich kurz erklären, wie man die mit C# ermittel. Manuell kann man sich die IDs aller seiner Freunde mit Hilfe folgender URL anzeigen lassen:
https://graph.facebook.com/me/friends?access_token=GültigesToken
Ich hoffe, das hilft weiter?
In meinem Fall wäre es eine Applikation die an Teilnehmer einer Veranstaltung an die Pinwand posten würde. Der Accesstoken wird vom Veranstalter beim Anmelden an FB generiert.
Ich benutze in meiner WPF Applikation die FB GraphApi und wollte mit folgender Funktion
_app.Api(“/” + uid.ToString() + “/feed/”+post, FacebookApi.HttpMethod.Post);
an die Pinwand schreiben. post wäre dann der Pinwand Contont.
Geht leider nicht.
Könntest du kurz den Code posten?
merci
Ich verwende hier mit Absicht kein SDK (und habe auch mal erklärt, warum, aber das ist ein anderes Thema). Soweit ich das sehe arbeitest Du mit dem C# SDK, das ich auch schon Mal im Einsatz hatte. app.API ist (wenn ich mich richtig erinnere) nur zu Aufruf, nicht zu posten. Es gibt sowas wie app.Post(…). Einige Beispiele sind hier:
http://facebooksdk.codeplex.com/wikipage?title=Code%20Examples&referringTitle=Documentation
Pingback: Tutorial: Auf Facebook mit Visual Basic oder C# bei einem Freund einen Pinnwandeintrag posten (Teil 3) « Frank IT Consulting&Training
Pingback: Facebook-Pinnwandeintrag mit einer C# WPF-Desktopanwendung « UBTBlog
Hallo, ich wollte mal fragen ob man auch ohne zusatzprogramm (bei Facebook), einen Status posten kann. Hab schon massenhaft versucht und programmiert aber immer kam bei Facebook der Fehler zurück, dass mein Browser nicht erkannt werden würde. Mein Code bisher:
public string Post(string url, string pdata)
{
string vystup = null;
try
{
System.Net.WebRequest objRequest;
System.Net.WebResponse objResponse = null;
Stream objStreamReceive;
try
{
objRequest = System.Net.WebRequest.Creat “http://www.facebook.com”);
objRequest.Timeout = 5000;
((HttpWebRequest)objRequest).UserAgent = “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)”;
objResponse = objRequest.GetResponse();
objStreamReceive = objResponse.GetResponseStream();
}
catch (Exception excep)
{
MessageBox.Show(excep.Message);
objResponse.Close();
}
System.Net.ServicePointManager.Expect100Continue = false;
byte[] buffer = Encoding.ASCII.GetBytes(pdata);
HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(“http://www.facebook.com/a/home.php?refid=7″);
WebReq.Method = “POST”;
WebReq.ContentType = “application/x-www-form-urlencoded”;
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Console.WriteLine(WebResp.StatusCode);
Console.WriteLine(WebResp.Server);
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
vystup = _Answer.ReadToEnd();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return vystup.Trim();
}
Hallo, da gibt es gleich zwei Problem: Zum einen ist laut Facebooks Nutzungsbedingungen der automatisierte Zugriff nur über die API erlaubt. Ich würde ein solches Vorgehen deshalb auf keinen Fall empfehlen, es kann schnell zur Sperrung des Users führen. Die technische Seite: Mit dem Request einen UserAgent “vorzutäuschen” ist leider meist nicht genug, den FB prüft mehr als diese Header-Info, z. B. ob Cookies angenommen werden und ggf. sogar, ob JavaScript unterstützt wird – das müsste man in dem Script ebenfalls “vortäuschen”. Möglicherweise würde es klappen, wenn man über die mobile Facebook-Seite (http://m.facebook.com/) so etwas probiert, die ist etwas anspruchsloser – aber auch hier macht man sich bei FB nicht beliebt. Deshalb besser die API benutzen – ist ganz einfach (siehe meine Tutorials). Ich hoffe, ich konnte weiterhelfen, Schöne Grüße, Simon A. Frank
Hallo, entschuldigung das ich jetzt erst antworte, ging aber nicht früher. Hab das jetzt mal mit dieser API probiert und da kam als ich eine neue Application createn wollte geben sie ihre Handy oder Kreditkartennummer an. Muss man das machen? Eigentlich möchte ich nicht das Facebook das weis. Wissen Sie was Facebook dann mit meiner Handynummer macht?
MfG Marius Störch
@Marius Ja, das muss man leider, da führt kein Weg vorbei.
ah okay….naja trotzdem danke
Also ich muss sagen, die Tutorials sind wirklich Klasse und haben mir sehr weiter geholfen.
Was mich persönlich interessieren würde und wo ich schon die ganze Zeit dran verzweifel:
Einen selbst erstellten Pinnwandeintrag via vb zu löschen.
Ich hab schon versucht den Code anzupassen mit den Angaben auf der Developer Seite. Aber irgendwie will das ding nicht.
Wenn ich über das Tutorial einen Pinwandeintrag erstelle, wird als Rückmeldung die ID des Eintrags zurück gemeldet. Aber wie baue ich das ganze nun korrekt in den Code ein?
Gibt es dazu vielleicht einen Tip?
mfg
André
Hallo André, Danke für Deine Feedback
Um einen Pinnwandeintrag zu löschen kannst Du den Code für das Erstellen verrwenden (siehe 1. Teil des Tutorials) – aber folgende Zeilen musst Du abändern:
C#
string GraphURL = “https://graph.facebook.com/COMMENT_ID”;
Nachricht = Encoding.UTF8.GetBytes(“method=delete” + “&access_token=” + AccessToken);
VB:
Dim GraphURL As String = “https://graph.facebook.com/COMMENT_ID”
Nachricht = Encoding.UTF8.GetBytes(“method=delete” & “&access_token=” & AccessToken)
Für COMMENT_ID musst Du natürlich die ID der Statusmeldung setzten. Ich hoffe, das hilft die weiter!
Klasse.
Ich hab Stunden darüber gebrütet, aber die “method=delete” bei “Nachricht” rein zu setzen, darauf bin ich nicht gekommen.
Vielen Dank für das vorzeitige Weihnachtsgeschenk
gerne! Ist ja auch wirklich kompliziert, die Doku von Facebook beschreibt einen anderen Weg (der mit .net ziemlich aufwendig wäre) und gibt nur in einem Nebensatz diesen Trick an.
Könnte es sein, das Facebook wieder was geändert hat? Das mit dem löschen funktioniert nicht mehr
Sorry für die späte Antwort, aber in den letzten Tage war wegen des Umzugs das Blog kurz offline. Ich habe es auch getestet – bei mir geht’s – vielleicht ein temporärer Fehler?