Um mit einem Visual Basic (oder C#) auf Facebook zuzugreifen um einfache Aktionen durchzuführen, z. B. ein Post auf die eigene Pinnwand zu schreiben oder einen Termin einzutragen ist kein aufwendiges Framework oder SDK erforderlich, insbesondere, wenn man nur eine „Single User“ Lösung basteln möchte – wie das geht erklärt das folgende Tutorial.
Mit „Single User“ sind hier kleine individualisierte Tools oder Scripte gemeint, die beispielsweise Daten aus Outlook, einer Datenbank oder Excel-Dokument auslesen und diese dann automatisch in Facebook posten. In den letzten Wochen habe ich für einige meiner Kunden solche kleinen Tools erstellt und bin dabei zu der Einsicht gekommen, dass man, wenn solche Tools nur von einem User genutzt werden, bei der Programmierung auf die etwas aufwendigere Benutzerauthentifizierung verzichten kann. Stattdessen ist es hier einfacher, die Zugangsdaten („Access-Tokens“) manuell zu generieren. In dem heutigen ersten Teil des Tutorials skizzieren ich kurz so eine „Single User“-Lösung, im zweiten Teil (der für die kommenden Tage geplant ist) werde ich dann beschreiben, wie man eine einfache Benutzerauthentifizierung realisieren kann.
1. Zuerst muss die neue Anwendung bei Facebook registriert werden:
http://www.facebook.com/developers/createapp.php
2. Der Name der Anwendung ist nicht unwichtig, da dies u.U. angezeigt wird, z. B. unter einem Statusupdate (Tipp: Firmenname oder Name der Website).
3. Nicht unbedingt erforderlich, aber empfehlenswert ist es außerdem unter „Website“ eine sinnvolle URL anzugeben (z. B. die Firmenwebsite), ansonsten sind keine weiteren Einstellungen erforderlich.
4. Nach dem Speichern erhält man dann die „Anwendungs-ID“ bzw. „App-ID“ (genauer: die OAuth client_id; das OAuth client_secret übrigens auch, jedoch benötigt man das nicht dringend, da der Request nicht signiert werden muss).
5. Als nächstes muss der Access-Token generiert werden. Bei dieser „Single-User“ Lösung (vgl. oben) soll dieser manuell generiert werden. Dafür kann mein Tool „Access Token Manager“ benutzen oder einfach folgende URL in den Browser tippen:
https://graph.facebook.com/oauth/authorize?client_id=IhreAppID&scope=publish_stream,offline_access&redirect_uri=http://www.facebook.com/connect/login_success.html&type=user_agent&display=popup
Der Parameter „Scope“ bestimmt die Berechtigungen – in diesem Beispiel kann die App im Namen des Benutzers posten (Details siehe Facebook-Doku). Sobald „Success“ im Browserfenster steht kann der Access Token aus der URL kopiert werden. Wichtig ist, dass das Login unter dem Facebook-Account des Benutzers durchgeführt wird, der später auch das Tool nutzen soll. Mit dem Scope „offline_access“ ist das Token sozusagen unbegrenzt gültig.
6. Nachdem man das Access-Token generiert hat kann man nun mit der Programmierung beginnen. Im folgenden Beispiel verwende ich „Microsoft Visual Basic 2010 Express“ bzw. „Microsoft Visual C# 2010 Express“.
7. Erstellen Sie beispielsweise folgendes Formular mit einer Textbox (txtStatusupdate) und einem Button (cmdSenden):
8. So sieht das in Visual Basic aus:
Dim Nachricht, Antwort As Byte() Dim AccessToken As String = "???" 'postet die Nachricht auf der Wall des Users 'der das AccessToken generiert hat: Dim GraphURL As String = "https://graph.facebook.com/me/feed" 'WebClient anlegen Dim myWebClient As New Net.WebClient 'Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen Net.ServicePointManager.Expect100Continue = False Nachricht = Encoding.UTF8.GetBytes("message=" & txtStatusupdate.Text _ & "&access_token=" & AccessToken) Try Antwort = myWebClient.UploadData(GraphURL, Nachricht) 'Erfolgsmeldung (ID des Posts) in JSON 'MsgBox(System.Text.Encoding.ASCII.GetString(Antwort)) MsgBox("Erfogreich gepostet!") Catch ex As Exception MsgBox(ex.Message) End Try
9. Und so in C#:
byte[] Nachricht = null; byte[] Antwort = null; string AccessToken = ""; //postet die Nachricht auf der Wall des Users //der das AccessToken generiert hat: string GraphURL = "https://graph.facebook.com/me/feed"; //WebClient anlegen System.Net.WebClient myWebClient = new System.Net.WebClient(); //Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen System.Net.ServicePointManager.Expect100Continue = false; Nachricht = Encoding.UTF8.GetBytes("message=" + txtStatusupdate.Text + "&access_token=" + AccessToken); try { Antwort = myWebClient.UploadData(GraphURL, Nachricht); //Erfolgsmeldung (ID des Posts) in JSON //MsgBox(System.Text.Encoding.ASCII.GetString(Antwort)) Interaction.MsgBox("Erfogreich gepostet!"); } catch (Exception ex) { Interaction.MsgBox(ex.Message); }
10. Das war’s. Der zweite Teil folgt in Kürze …. Update am 29.1.2011: der 2. Teil des Tutorials ist fertig!
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
Vielen Dank für das super Tutorial. Ideal zum Lernen (für mich)
Nun ist ja die Anleitung schon einige Jahre alt.
Der Link zur Registrierung von Anwendungen bei FB stimmt nicht mehr.
Gibt es da eine Aktualisierung? Ich konnte bisher im Web nichts finden.
Vielen Dank
LG
Manfred
Vielen Dank für das Feedback. Leider ist vorerst keine Aktualisierung geplant, leider fehlt mir dazu die Zeit. Die Facebook-Seiten dazu sind inzwischen aber sehr gut und ausführlich und vielleicht eine Hilfe:
https://developers.facebook.com/docs/graph-api/
Hallo!
Das Tutorial ist einfach Klasse, habe auch die anderen Teile soweit umgesetzt für meine Anwendung!
Habe jetzt nur ein kleines Problem, ich möchte nicht nur eine Zeile Posten sondern Absätze. Ist ein Turnierprogramm, dort möchte ich dann die 1. Plätze automatisch auf Facebook posten.
z.B.:
Die Sieger sind:
1. Muster Mustermann
2. Demo Demofrau
3. xxx yyyyyyy
4. aaaaaaaaa ffffffffff
Bekomme aber den Zeilenwechsel, bzw. den Absatz nicht hin!
Gruß Roman
Hallo, vielen Dank für das Feedback. Einfach ein „\n“ einfügen, das fügt einen Zeilenumbruch ein! Viel Erfolg, Simon A. Frank
Hallo!
Leider funktioniert das nicht wenn ich „\n“ eingebe wird mir das auch im Facebook so ausgegeben und alles in einer Wurst geschrieben.
zB.: „Das ist ein \nZeilenumbruchtest\nnocheiner\nNächste Zeile \nund noch eine Zeile“
Habe es jetzt über eine RichTextBox gelöst, da funktionieren die Zeilenumbrüche.
Gruß Roman
Hallo,
habe gerade bemerkt, dass ich die VisualBasic.dll hinzufügen muss….
Danke und liebe Grüße
Iris
Hallo,
danke für das tolle Tutorial, leider bekomme ich die Meldung „Error 1 The name ‚Interaction‘ does not exist in the current context“.
Woran kann das denn liegen? Bin eine ziemliche Neueinsteigerin…
Liebe Grüße
Iris
Das mit dem Access-Token funktioniert irgendwie nicht. Ich rufe die obige URL mit meiner AppId auf. Die Seite meldet „Success“ und fordert mich auf, die URL wie ein Passwort zu behandeln… Aber naja… ich komme hierhin: http://www.facebook.com/connect/blank.html
das macht für mich jetzt nicht den Eindruck als sei es so wahnsinnig geheim… Hab ich da was falsch verstanden?
Hi Dave, ja, da hast Du einiges falsch verstanden. Verwende am besten für erste Tests und Generierung des Access-Tokens mein Tool „Access-Token-Manager“:
http://frank-it-beratung.com/blog/access-token-manager/
In weitereführenden Tutorials wird hier dann erklärt, wie Du sowas selbst programmieren kannst.
Wenn noch Fragen sind: gerne, einfach hier posten oder mir per Mail senden!
Hallo,
alles funtkioniert soweit. Allerdins habe ich eine Frage:
Kann nur ICH posten? Eben konnte ich keinen Token mit meinem Test-Account generien. Hab die App dann auf Live gestellt, damit jeder sie nutzen kann – siehe da; der Token ist da!
Soweit so gut. Allerdings wenn ich den Token eintrage, kommt eine Fehlermeldung “Unzulässig”.
Mit meinem Account funktioniert das alles perfekt. Wie muss ich vorgehen, damit ich das Programm veröffentlichen kann und jeder, der das Programm hat, seinen Token eingegeben hat, einen Status posten kann?
Liebe Grüße
Hallo sayokz,
vielen Dank für Dein Feedback. Hier auf der Seite wird die “Single User” Lösung erklärt, d.h. diese geht nur für ein Account (vereinfacht gesagt, Details siehe oben ganz zu Beginn des Artikels).
Eine “Multi-User-Lösung” habe ich in Teil 2 erklärt – diese müsste Dir weiterhelfen?
http://frank-it-beratung.com/blog/2011/01/29/tutorial-ein-facebook-pinnwandeintrag-mit-visual-basic-oder-c-teil-2/
Schöne Grüße,
Simon
Guten Tag, ist es möglich auf der Pinnwand von allen meinen Freunden etwas automatisch zu posten? Wenn JA, kontaktieren Sie mich bitte per Mail. Danke
Hallo Danio, leider hat Facebook diese Funktion in der API wegen dem häufigen Missbrauch im Februar 2013 deaktiviert, Details sind hier nachzulesen (1. Kommetar):
http://frank-it-beratung.com/blog/2012/11/07/facebook-api-posts-auf-pinnwand-von-freunde-bald-nicht-mehr-moglich/
Ich bekomme den Fehler: „Der Remoteserver hat einen Fehler zurückgegeben: (403) Unzulässig.“, jedoch bin ich mir sicher das der Token richtig ist.
Auch die url hab ich zu meiner geändert.
(https://graph.facebook.com/mein.name.01/feed)
Aber trozdem ein echt gutes Tutorial, ein wirklich großes Lob !
Hallo Jack S., vielen Dank für Dein Feedback 🙂
Ich habe es noch nicht genau getestet, aber wegen einer aktuellen Umstellung bei FB könnte es sein, dass nur noch „me“ geht – probiere also mal mit folgender URL – vielleicht kommt dann kein Fehler?
GraphURL = „https://graph.facebook.com/me/feed“
Hallo Mike, vielen Dank 🙂 ich werde das häufig gefragt und habe es deshalb hier mal ausführlicher erklärt: http://frank-it-beratung.com/blog/access-token-manager/
Hi super Tutorial aber ich möchte als “Seite” und nicht als “User” einen Beitrag posten, geht das ? Und wie ?
Per Mail erreichte mich gerade folgende Frage: „Ich bräuchte einen MultiUser-Login. Braucht man dazu zwingend dieses Web-Fenster, bei dem man seine Login-Daten angeben muss? Ich bräuchte das ganze nämlich ohne ein soches Web-Formular.“
Theoretisch bzw. technisch geht es auch ohne. Jedoch ist (vereinfacht gesagt) ein Witz von OAuth, dass der App-Betreiber nicht das Passwort des Users erfährt, sondern eben nur den Access-Token – um entsprechenden Missbrauch zu vermeiden. Würde man also eine App ohne „Web-Fenster“ erstellen würde dies gegen die Facebook-Nutzungsbedingungen verstoßen. Für eine App, die „öffentlich“ vertrieben werden soll also undenkbar – auch weil der ein oder andere User ohne OAuth-Dialog wohl skeptisch werden würden – wobei dies auch nur Augenwischerei ist, da m. E. auch mit Web-Fenster eine kleine „Sicherheitslücke“ besteht. Aber ein weites Feld, vielleicht schreibe ich dazu mal einen ausführlichen Blog-Beitrag.
Hallo Erstmal super tut. aber beim mir kommt nach dem klick auf den button die meldung „Fehlerhafte Remoteanfrage (400)“ was muss ich machen?
Hallo Jakob, vielen Dank … die Fehlermeldung kann viele Ursachen haben – ich vermute, irgendein Tippfehler, z. B. beim AccessToken? Lass Dir mal den String Nachricht ausgeben, z. B. mit MsgBox(Nachricht) oder im Debug-Fenster und schaue an, ob da alles stimmt?
Ist nun online: http://frank-it-beratung.com/2011/11/14/tutorial-mit-c-oder-visual-basic-ein-foto-uploaden-facebook-api-tutorial-teil-4/
Hallo nochmal, bin jetzt etwas weitergekommen mit dem Photo Upload. Mit diesem Beispiel funktioniert es ganz gut: http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data/2996904#2996904 . Es läuft darauf hinaus, dass man den POST selbst bauen muss mit entsprechenden contenttype headern und boundarys. Leider ist es nicht asynchron. Frage mich ob dies auf den webclient übertragen werden kann. Denke aber dass man einfach den header um multipart form-data und boundary deklaration erweitern muss und den selbst gebastelten POST body wie gewohn übergibt?Versuche mich aber erstmal daran folgendes async beispiel: http://msdn.microsoft.com/en-us/library/system.net.webrequest.begingetrequeststream.aspx , mit dem oberen zu verbinden. Gruss
Hallo, der Fotoupload ist so sehr sehr umständlich, das geht einfacher, ich poste das mal schnell …
ich habs geahnt.. 🙂 freue mich eine einfachere lösung zu sehen..
Hallo, vielen Dank für die übersichtlichen Anleitungen. Hat mir sehr weitergeholfen, der einstig in c# ist geglückt. Haben Sie mit dem WebClient auch versucht Fotos in ein album hochzuladen? Ist dies soweit möglich? Mit cURL habe ich mit folgendem Erfolg:
curl.exe https://graph.facebook.com/-AlbumID-/photos -F access_token=XXXXXXX -F source=@test.jpg -F „message=neues photo“
Habe leider kein Erfolg gehabt dies in c# umzusetzen. Hätten Sie eventuell einen Tip wie das Vorgehen in c# ist? Könnte man auch WebClient.UploadDataAsync verwenden um den Upload im Hintergrund abzuwickeln?
Nochmals danke für die beginnerfreundlichen Tutorials
und Schöne Grüße
Danke 🙂 Einen Foto-Upload habe ich noch nie benötigt, aber das müsste auch gehen. Und UploadDataAsync ist natürlich der schönere Weg, den ich normalerweise auch nutze – ist nur ein klein wenig komplizierter, deshalb habe ich hier den einfacheren Weg beschrieben. Aber ich werde mal die nächsten Tage ein Tutorial mit Upload und Async schreiben (ich hoffe, ich finde die Zeit dazu). Schöne Grüße, Simon A. Frank
Danke für die prompte Antwort. Ein eigenes Tutorial dafür wäre natürlich eine feine Sache. Würde mich sehr freuen. Bin selbst gleich an dem Uri parameter gescheitert das von Async gefordert wird sowie an der Dateihandhabung und Enkodierung. Mir fehlt da noch sehr viel allgemeines Verständnis in c#. Naja, kann ja nur besser werden. Freue mich auf Ihren nächsten Beitrag und werde erstmal selbst weiter forschen :).
Gruss
@Michael Wie auch gerade per Mail geschrieben: Tatsächlich war in der ersten Zeile meines C# Codes ein Tippfehler, der jetzt behoben ist. Vielen Dank für den Hinweis!
Ich bekomme immer den Fehler:
„Eine implizite Konvertierung vom Typ „byte[]“ in „byte“ ist nicht möglich.“
Dieser tritt auf, wenn ich ‚Nachricht‘ oder ‚Antwort‘ bestimme.
System.Text habe ich bereits integriert.
@michael Leider kann ich den Fehler nicht nachvollziehen – am besten den Code per Mail an mich senden oder hier posten!
Ich habe das Projekt in einer E-Mail gesendet.
Danke für dei Hilfe
Hallo,
erstmal super Tutorial. 😉
Ich habe eine Frage, undzwar bin ich auf der Suche nach einem Programm, welches es möglich macht, einen Pinnwandeintrag an mehrere Freunde gleichzeitig zu posten (Promotion Zweck).
Für mich sieht ihr Programm so aus, als würde es, es möglich machen, einen Pinnwandeintrag zu schreiben und diese dann an jeden „Freund“ einzeln zu schicken, welchen man in einem Reitermenü auswählen kann.
Ist das so?
Können sie mir dabei helfen?
Liebe Grüße
Michael 😉
Hallo, vielen Dank für das Feedback. Ja, wenn man das im Teil 1 beschriebene mit dem in Teil 3 beschriebene kombiniert ist es relativ einfach möglich, ein solches Tools zu schreiben. Ich schicke Ihnen noch weitere Infos per Mail! Schöne Grüße, Simon A. Frank
Es funktioniert, es war nicht mein Fehler des Codes sondern es lag an mir. Der Code funktioniert. Vielen Dank
Ich würde gerne mit Ihnen zusammen arbeiten. Es geht um ein kleines Projekt für das Windows Phone 7 in VB. Bisher wurde alles von mir vernünftig programmiert, das Design fehlt. Aber ich kann den Tutorial-Code nicht für das Windows Phone 7 umsetzen. Visual Basic für das Windows Phone 7 hat glaube ich kleine Änderungen.
Ich arbeite mit Visual Studios 2010 und den Windows Phone 7 Developer Tools
Vielen Dank für das Feedback. Wegen der Windows Phone Anfrage wende ich mich an Sie per Mail.
Nachricht = Encoding.UTF8.GetBytes(„message=“ & txtStatusupdate.Text _
& „&access_token=“ & AccessToken)
Encoding wurde nicht deklariert, wird bei mir angezeigt. Was tun?
Ein „Import“ fehlt, nämlich „System.Text“ – oder einfach „Nachricht = System.Text.Encoding.UTF8…“ schreiben. Ich hoffe, das löst das Problem?
Ist es möglich eine Nachricht an bestimmte Personen zu versenden?
Nein, das ist derzeit in der API nicht vorgesehen, Facebook wollte das bisher nicht zulassen. Jedoch ist da aktuell Bewegung (z. B. mit dem neuen „Send Button“), vielleicht gibt es das in naher Zukunft…
Weißt du, ob es auch möglich ist direkt auf eine Page einen Post zu setzen? Also nicht auf die Pinnwand des Profils, sondern auf die Pinnwand einer Page.
Mach da jetzt schon eine ganze weile rum, habe es aber bisher nicht geschafft und finde auch bei google keinen wirklichen Ansatz, ob es überhaupt möglich ist.
Ja, das ist möglich, einfach an https://graph.facebook.com/NameDerSeite/feed senden (der Besitzer der Seite muss dies natürlich zulassen). Oder ist das nicht das Problem? Möchtest Du als „Seite“ und nicht als „User“ einen Beitrag posten?
Hey,
das mit dem als Seite posten würde mich auch interessieren. Denn ich Probiere auch schon die ganze zeit herum wie ich einen Access Token ohne Zeitliche Begrenzung bekommen und somit auch noch auf der Fb Seite(admin) posten kann entweder nur eine Textnachricht oder ein bild.
MFG. B.T.
Hallo Béla, kein Problem, ich helfe gerne. Die Frage, ob man in Namen des Users/Admin oder im Namen der Seite postet habe ich im ersten Kommentar auf folgender Seite erklärt:
http://frank-it-beratung.com/blog/access-token-manager/
Um ein Token ohne zeitliche Begrenzung zu bekommen muss Du bei der Erstellung den Scope „offline_access“ wählen – z. B. auch mit meinem Tool, das ebenfalls unter oberen Link zu finden ist.
Hallo, ich würde gerne Teil 2 des Tutorials lesen…
Leider bin ich noch nicht dazugekommen, aber bestimmt im Laufe dieser Woche. Wenn es eilig ist: Ein Codebeispiel für VB ist in meinem Beitrag zu dem FB Acccess Token Tool zu finden: http://frank-it-beratung.com/2010/12/05/facebook-access-token-tool/
Jetzt ist der zweite Teil fertig: http://frank-it-beratung.com/2011/01/29/tutorial-ein-facebook-pinnwandeintrag-mit-visual-basic-oder-c-teil-2/ Freue mich über jedes Feedback!