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.
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
Hallo Iris, schon mal andere Websites probiert? Gehen die problemlos zu laden? Wenn nein ist’s der Firwall! Ansonsten mir einfach das Projekt per Mail schicken, dann werfe ich einen Blick drauf!
Hallo Herr Frank,
woran könnte es liegen, dass mein WebBrowser leer bleibt? Wenn ich die URL fix codiere, kommt die Facebook-Anmeldeseite…
Habe den Code in VB und C# probiert, leider immer ein leeres Feld…
Danke für die Hilfe und liebe Grüße
Iris
Hallo Herr Frank,
weder in VB noch in C# wird mir im Webbrowser etwas angezeigt… Wenn ich als Eigenschaft eine URL eingebe, wird die Seite ausgegeben.
Ich kann mir nicht erklären, woran es liegt. Bin immer wieder den QC durchgegangen.
Kann es mit javascript zu tun haben? Wissen Sie vielleicht Rat?
Liebe Grüße
Iris
klar, kann schon sein, dass das irgendwie geht – wenn ich das nächste Mal was in der Richtung mache werde ich das mal genauer testen!
Hallo Jonny, kein Problem, ich helfe gerne … aber ich sehe leider gar nicht den Unterschied zwischen meinem Post und Deinem vom 1. August. Oder verstehe ich was falsch? Du meinst schon „Portal 03“?
ehm ich meinte den post wo du auf der testseite am 23.März ein Bild gepostet hast “ mit der Küste, so hätte ich das gerne aber es wird nur so angezeigt wie von dem Post von jemand anderen der ein Bild postet am “1. August um 16:22″ wo quasi ein klammer ist und dahinter dann der text steht. mfg JJ
Hallo Jonny, ok, ich verstehe. Ich habe das gleich auf „https://www.facebook.com/Eine.lustige.Testseite“ getestet. Leider kann man mit dem hier beschriebenen Beispiel nur noch Fotos in Alben hochladen und nicht mehr in den Feed als Teil eines Posts – ob das generell deaktiviert wurde weiß ich leider nicht, aber ich werde hier mal recherchieren. Als Workaround wäre denkbar, zuerst das Foto in ein Album hochzuladen, dann die URL ermitteln und in dem Post zu verlinken.
Okay danke. Kriegt man das eigentlich hin das wenn man mit dem Programm ein text schreibt mit den link, dass dann der text und das Bild auch angezeigt wird auf der Page ? bei meinem versuch hatte er nur den link angezeigt aber ich werde es weiter probieren 🙂 mfg Jonny
irgendwie bekommt man da kein Link höchstens von nem Album und andere schaffen das ja auch irgendwie, z.b. Gronkh lädt die bestimmt nicht per hand hoch und benutzt ein programm ;). Wäre ja viel einfacher. mfg Jonny
Hier habe ich meine frage mal genau betitelt 😉
http://www.vb-paradise.de/programmieren/grundlagen/93080-facebook-api-posten-auf-eigene-seite-und-auf-page-seite/
hier trau ich mich net so viel code zu posten fürs Normalposten und halt mit Fotoposten 😉
mfg JJ
ja ich wähle per Combobox aus ob ich mit dem normalen Access-Token arbeiten möchte oder mit Access-Token der Page und dann kann ich die nummer in ein textfeld reinschreiben und wie gesagt geht das normale posten mit „Access-Token der Page“ nur wenn ich ein foto hochlade das macht er mit dem normalen. ich verstehe nur nicht warum schließlich ist es ja fast der selbe code und GraphURL wird am anfang als string gemacht das ich es vorher noch per combobox bestimmen kann 😉
sehr merkwürdig! Ich muss das mal genauer testen und werde mich dann melden.
schon was neues in erfahrung gebracht ?
achja so nebenbei wie könnten man realisieren das man per Page auch angeben kann wann das Bild z.b. veröffentlicht wird ?
dazu muss man ja „scheduled_publish_time“ mit ansprechen mit nem „DateTimePicker“
ganz genau weis ich noch nicht genau wie ich das machen könnte 😉
mfg JJ
ok, da kann ich da ein paar Tipps geben. Leider werde ich erst nächste Woche dazu kommen, das und den „Bug“ zu testen!
okay das wäre sehr nett 😉
Hallo Jonny, leider hatte ich doch keine Zeit für ausführliche Tests. Bist Du selbst irgendwie weitergekommen? Oder besteht das Problem noch immer?
das problem besteht weiterhin , und ich hatte ja schon nach einer lösung geschaut bevor ich hier geschrieben hatte ;)und hatte ja keinen grund gefunden warum er nicht so macht wie ich gern hätte 😉
mfg J
jetzt habe ich das mal geteste – bei mir geht alles bestens. Du kannst mir gerne mal Deine Code senden (per Mail), dann sehe ich mir den mal an – vielleicht entdecke ich einen Fehler!
okay wird gemacht schließlich denke ich das ich alles versucht habe.
habe nochmal geprüft als wie gesagt wurde, nur text posten geht auf normale facebook seite und auf der anderen seite. Foto mit text geht irgendwie nur auf meiner Facebook seite, bei der anderen sagt er zwar kein fehler an aber wenn ich auf absenden drücke sehe ich auch das eine neue benachrichtigung angezeigt wird nur wenn ich drauf gehe ist dann nix da. wie als würde facebook das posting automatisch löschen wegen irgendein fehler.
mfg JJ
okay endlich weis ich was 😉 wenn ich als page ein text veröffentliche zeigt es auch das Page: hatt dies und das geschrieben aber jetzt habe ich gesehen das wenn ich das selbe einfach nur mit einem foto mache das es als mein ich gepostet wird und nicht als page wie ich es ja möchte, nur weis ich nicht wo da der fehler ist 🙂 lg JJ
hier so unterscheide ich ob ich auf „me“ oder auf der page poste:
Sub comboabrufmitfoto()
If ComboBox1.SelectedIndex = 0 Then
GraphURL = „https://graph.facebook.com/me/photos“
End If
If ComboBox1.SelectedIndex = 1 Then
GraphURL = „https://graph.facebook.com/“ & TextBox3.Text & „/photos“
End If
End Sub
bei normalen text klappt es ja auch die unterscheidung:
Sub comboabrufohnefoto()
If ComboBox1.SelectedIndex = 0 Then
GraphURL = „https://graph.facebook.com/me/feed“
End If
If ComboBox1.SelectedIndex = 1 Then
GraphURL = „https://graph.facebook.com/“ & TextBox3.Text & „/feed“
End If
End Sub
und in der textbox kommt die id von der page rein, also ich finde da irgendwie kein fehler.
lg JJ
Ich glaube, Dein Programm ist schon richtig, das schein irgendwas bei Facebook zu sein. Hast Du das schon mal manuell probiert? Kannst Du auf der Seite als Seite ein Text mit Bild posten? Theoretisch geht das (ich habe es gerade auf meine Testseite probiert) aber vielleicht gibt es da eine Seiteneinstellung, die das verhindert? Wenn Du willst kannst Du es mal auf meiner Testseite probieren:
https://www.facebook.com/Eine.lustige.Testseite
ich hatte es ja immer manuell gemacht: „https://www.facebook.com/pages/Die-AGGRessiven/131773093667123“
oder vllt. muss noch mehr einstellen bei der Facebook anwendung worüber ja der poster arbeitet ?
Okay ich greife mal wieder dasThema auf weil es schön wöre wenn es so simpel funktionieren würde ;). Auf deiner Test seite „https://www.facebook.com/Eine.lustige.Testseite“ hast du ja ein Bild hochgeladen vom 23. März, genau so hätte ich es auch gerne. Bei funktionier es mit Bild nur so wie der Beitrag vom „1. August um 16:22“ auf der Seite. mfg JJ
okay ohne Foto geht das Posten als Page nur mit Foto postet er als Jonny grml 😉
Hast Du das Access-Token der Page verwendet? Siehe erster Kommentar hier:
http://frank-it-beratung.com/blog/access-token-manager/
Hi ich hoffe mal das wird noch gelsen 😉
also ich habe dein Programchen etwas erweitert und kriege es nicht hin das er wenn ich per combobox was auswähle das er statt auf „https://graph.facebook.com/me/feed“ halt auf die website „https://www.facebook.com/pages/Die-AGGRessiven/131773093667123“ etwas postet 🙁
Public Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
If ComboBox1.SelectedIndex = 0 Then
GraphURL = „https://graph.facebook.com/me/feed“
End If
If ComboBox1.SelectedIndex = 1 Then
GraphURL = „https://graph.facebook.com/“ & TextBox3.Text & „/feed“
End If
End Sub
mfg JJ
okay ich muss nur noch das ändern was dann im Token mitgeschickt wird.
mfg JJ
na klar, hier wird alles gelesen! Aber wie ich sehe hast Du Dir selbst geholfen…
Hallo Andrej, natürlich helfe ich gerne. Das sind wie Du richtig erkannt hast einige C# Basics: txtAccessToken/txtStatusupdate sind die Namen der Steuerelemente („Texteingabefelder“, siehe erster Screenshot), die Du unter „Eigenschaften->Name“ eingeben musst. Wenn Du das gemacht hast siehst Du auch, wo Du Dein Access-Token eintragen kannst.
Als Lektüre für den Einstieg in C# kann ich Dir noch folgendes kostenloses Buch empfehlen:
http://openbook.galileocomputing.de/visual_csharp_2010/
Wenn Du ganz neu in der Welt des Programmierens bist ist das etwas zu kompliziert, dann empfehle ich als Einstieg Visual Basic – meine Beispiele sind fast immer auch in dieser Sprache erklärt. Hier gibt es auch ein schönes kostenloses Buch:
http://openbook.galileocomputing.de/einstieg_vb_2010/
Weiterhin viel Erfolg, schöne Grüße, Simon
hi simon, das ist eine tolle sache die du programmiert hast.
Aber ich hab 2 probleme.
1. txtAccessToken.Text = q.Substring(0, q.IndexOf(„&“)); <– wird als fehler angezeigt. der name "txtAccessToken" ist im aktuellen Kontext nicht vorhanden.
genau das selbe mit….
u = "message=" + txtStatusupdate.Text + "&access_token=" + AccessToken; <—-
der name "txtStatusupdate" ist im aktuellen Kontext nicht vorhanden.
2. Wo trage ich mein access token ein???
tut mir leid, hätte das gern selber geklärt. aber bin erst seit den 2ten tag mit c# am basteln. Ist komplett neuland für mich. ich hoffe du kannst mir helfen. danke schonmal
andrej
Fehler gefunden.
Der Accesstoken war abgelaufen.
Danke für deine Mühe.
Gruß
André
Hallo Andre, nein, bei mir läuft das weiterhin alles bestens! Schöne Grüße, Simon
Hallo Simon,
das posten von feeds funktioniert wieder mal nicht. Kannst du mal schauen, ob es bei dir noch geht?
Bisher hat alles wunderbar funktioniert und seit ein paar Tagen kann wieder nicht gepostet werden.
Danke
Gruß
André
Hallo André, leider nein, eigentlich löscht man Links genauso wie alles andere (vgl. mein Kommentar vom 14.12.2011). Teste mal, ob Du das Link manuell löschen kannst? Manchmal gibt es da einen Bug und Posts oder Links sind nicht mehr löschbar.
Jetzt weiß ich, warum es nicht klappt.
Ich habe einen Link an der Pinnwand gepostet.
Und dieser lässt sich so nicht löschen.
Mit normalen Feeds geht´s.
Hast du zum Link löschen vielleicht noch einen Tip?
Gruß
André
Hallo André, bei mir geht’s weiterhin, vielleicht wieder ein temporäres Problem?
Und wieder funktioniert das löschen nicht 🙁
Kannst du bitte nochmal schauen, ob´s bei dir klappt?
Ich hab auf die neue Chronik umgestellt. Könnte es damit zu tun haben?
Gruß
André
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?
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 😉
ah okay….naja trotzdem danke 😉
@Marius Ja, das muss man leider, da führt kein Weg vorbei.
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
Pingback: Facebook-Pinnwandeintrag mit einer C# WPF-Desktopanwendung « UBTBlog
Pingback: Tutorial: Auf Facebook mit Visual Basic oder C# bei einem Freund einen Pinnwandeintrag posten (Teil 3) « Frank IT Consulting&Training
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
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
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!
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
Pingback: Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 1) « Frank IT Consulting&Training