Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 1)

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 „FB 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!

Dieser Beitrag wurde unter C#, Facebook, Graph API, Programmierung, Visual Basic abgelegt und mit , , , , , , verschlagwortet. Setzen Sie ein Lesezeichen auf den Permalink.

30 Antworten auf Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 1)

  1. Pingback: Facebook Access Tokens mit FB Access Token Manager erstellen « Frank IT Consulting&Training

  2. CUK sagt:

    Hallo, ich würde gerne Teil 2 des Tutorials lesen…

  3. Steffen sagt:

    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.

  4. Pingback: Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 2) « Frank IT Consulting&Training

  5. Pingback: Tutorial: Auf Facebook mit Visual Basic oder C# bei einem Freund einen Pinnwandeintrag posten (Teil 3) « Frank IT Consulting&Training

  6. Pingback: Tutorial: Die FriendFeed API mit C# (oder Visual Basic) « Frank IT Consulting&Training

  7. Paul sagt:

    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…

  8. Arbnor sagt:

    Nachricht = Encoding.UTF8.GetBytes(“message=” & txtStatusupdate.Text _
    & “&access_token=” & AccessToken)

    Encoding wurde nicht deklariert, wird bei mir angezeigt. Was tun?

  9. Arbnor sagt:

    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

  10. Michael sagt:

    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

  11. Michael sagt:

    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.

  12. @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!

  13. Thomas sagt:

    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

      • Thomas sagt:

        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

  14. Thomas sagt:

    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

  15. jakob sagt:

    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?

Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>