Aufgrund einiger Anfragen habe ich schnell diesen vierten Teil des Facebook-Tutorials geschrieben in dem erklärt wird, wie man via C# ein Foto zu Facebook hochladen kann.
1. Die Vorarbeiten werden in Teil 1, Teil 2 und Teil 3 dieses Tutorials erklärt. Jetzt habe ich das Formular mit einem Feld für den Dateinamen und Pfad sowie einer Taste „Fotoupload“ ergänzt (Wer es etwas komfortabler haben möchte und den Dateinamen nicht tippen möchte kann noch den „OpenFileDialog“ bedienen, auf das ich hier verzichtet habe).
2. Statt WebClient.UploadData verwende ich nun UploadFile und poste dies an „https://graph.facebook.com/me/photos“. Statt „me“ kann ich auch die Nummer eines meiner Alben angeben oder sogar den Namen eines meiner Freunde (falls die eine Upload zulassen).
3. Der Parameter „message“ dient zu Bildbeschreibung. Zudem kann man noch Tags, Beschreibungen usw. angeben, Details siehe in der Doku von Facebook Developer.
4. Der komplette Code für das Click-Event auf die Taste „Fotouplaod“ sieht dann folgendermaßen aus:
private void buttonUpload_Click(object sender, EventArgs e) { byte[] Nachricht = null; byte[] Antwort = null; string AccessToken = null; string u = ""; AccessToken = txtAccessToken.Text; if (string.IsNullOrEmpty(AccessToken)) { MessageBox.Show("Bitte erst auf 'Login' klicken"); return; } //postet das Foto unter "Fotos" des ausgewählten Users: string GraphURL = "https://graph.facebook.com/me/photos"; //WebClient anlegen System.Net.WebClient myWebClient = new System.Net.WebClient(); //Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen System.Net.ServicePointManager.Expect100Continue = false; u = "?message=" + txtStatusupdate.Text + "&access_token=" + AccessToken; Nachricht = Encoding.UTF8.GetBytes(u); try { Antwort = myWebClient.UploadFile(GraphURL+u, "POST", textBoxDateiname.Text); //MessageBox.Show(System.Text.Encoding.ASCII.GetString(Antwort)); MessageBox.Show("Foto erfogreich hochgeladen!"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Alternative: FileUploadAsync
In einem Kommentar zum meinem letzten Tutorials wurde ich gefragt, ob dies mit „Async“ nicht schöner wäre – natürlich! Ich wollte es nur nicht unnötig kompliziert machen. Aber wenn hier ein großes Foto hochgeladen wird wäre es natürlich besser, wenn die Anwendung solange nicht „einfriert“ und stattdessen z. B. den Fortschritt anzeigt. Dafür erweitere ich das Formular um eine Taste „Fotoupload (async)“ sowie ein Label, in dem der Fortschritt des Uploads angezeigt werden soll:
Der Code für einen „async“-Upload dazu sieht dann so aus:
private void buttonAsyncUpload_Click_1(object sender, EventArgs e) { byte[] Nachricht = null; string AccessToken = null; string u = ""; AccessToken = txtAccessToken.Text; if (string.IsNullOrEmpty(AccessToken)) { MessageBox.Show("Bitte erst auf 'Login' klicken"); return; } string GraphURL = "https://graph.facebook.com/me/photos"; //WebClient anlegen System.Net.WebClient myWebClient = new System.Net.WebClient(); //Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen System.Net.ServicePointManager.Expect100Continue = false; u = "?message=" + txtStatusupdate.Text + "&access_token=" + AccessToken; Nachricht = Encoding.UTF8.GetBytes(u); //hier werden die Callbacks festgelegt: myWebClient.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgessChange); myWebClient.UploadFileCompleted += new UploadFileCompletedEventHandler(UploadFertig); try { myWebClient.UploadFileAsync(new Uri(GraphURL + u), "POST", textBoxDateiname.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void UploadProgessChange(object sender, UploadProgressChangedEventArgs e) { LabelUpload.Text = e.ProgressPercentage.ToString() + "%"; // Alternativen: e.UserState, e.BytesReceived, e.TotalBytesToReceive,... } private void UploadFertig(object sender, UploadFileCompletedEventArgs e) { MessageBox.Show("Upload fertig!"); //ggf. Rückgabewert auslesen: //byte[] data = (byte[])e.Result; //string textData = System.Text.Encoding.UTF8.GetString(data); //MessageBox.Show("Result: " + textData); }
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
Ich frage mich ja nur was der schwachsing mit „Nachricht“ und den umcoodieren von u zum Byte Array nachricht soll wen die Variable „Nachricht“ ja nicht verwendet wird. Ich versuche seid Tagen den Source zum laufen zu bringen, Fortschritsbalken läuft ja auch aber leider erscheint auf Facebook nie das gepostete bild. Oder brauche ich eine Permission im Socpe zum Posten und wen ja welche. publish_stream und publish_actions sind ja bereits drinnen.
LG, Herbrich
Na ja, „schwachsinnig“ finde ich kein angemessener Kommentar und da hält sich meine Begeisterung in Grenzen, hier zu heflen. Schau Dir mal Teil 1-3 an, dazu gehört das und ist hier übrig geblieben.
Super, Dankeschön! Jetzt geht alles! Das war ja mal ne schnelle Antwort 🙂
Liebe Grüße
Alex
Achja, und mein access token sieht wie folgt aus: „&scope=publish_stream,manage_pages,offline_access“;
Liebe Grüße
Alex 🙂
ok, Details siehe oben. Noch ein Hinweis: Das „offline_access“ Scope gibt es sozusagen nicht mehr, Details siehe:
http://frank-it-beratung.com/blog/2013/04/05/facebook-api-alternative-losungen-fur-unbegrenzt-gultige-access-tokens-als-ersatz-fur-offline_access/
Hallo Simon,
es funktioniert so weit alles super. Weisst du vielleicht wie man Fotos als Fanpage posten kann? Leider wird so nur mein eigener Name angezeigt und nicht der Name der Fanpage.
Hallo Alex, vielen Dank für Dein Feedback 🙂 Zu Deiner Frage: Dies habe ich auf folgender Seite im ersten Kommentar beschrieben:
http://frank-it-beratung.com/blog/access-token-manager/
Hallo Patrick, kein Problem, gerne (ich suche ja immer nach neuen Ideen für Posts, ich muss mich auch bei Dir für den Tipp bedanken). Die Antwort zu Deiner Frage poste ich gleich hier: http://frank-it-beratung.com/blog/2013/01/08/tutorial-eigene-posts-via-facebook-api-mit-visual-basic-abrufen/
Ein weiteres Mal Guten Abend. 🙂
Ich bin Ihnen ein grosses Dankeschön schuldig. Ich häte nicht damit gerechnet einen vollständigen Code samt Tutorial vorgelegt zu bekommen. Ihren Tipp mit C# werde Ich mir zu Herzen nehmen, obwohl für mein Laien-Auge VB eifacher aussieht…
Ihr Code funktionniert (wie Immer) einwandfrei. Jedoch bekomme ich beim Debuggen den Fehler „Illegales Zeichen im Pfad“. Was ich gemacht habe ist Folgendes: Die „….“ bei AccessToken habe ich durch mein eigenes Token ersetzt, welches ich mit Ihrem wunderbaren Tool bekommen habe.
Eines ist vielleicht noch von Bedeutung: Das Token, das ich jetzt verwende, habe ich durch einen klick auf „get Acess-Token for pages and apps“ bekommen. Jenes Token, welches ich durch einen klick auf „get Access-Token“ bekomme, weist beim Debuggen in VB einen PathTooLong-Fehler aus. Beide Token wurden (nur) mit dem Scope „publish_stream“ generiert.
Ich glaube nicht dass das etwas zur Sache tut, aber ich habe noch folgende Zeile hinzugefügt:
ListBox1.Items.Add(Antwort)
Ich weiss nicht wo der Hund begraben liegt…
Ich hoffe ich fange nicht an zu nerven
Mit freundlichen Grüssen aus der Schweiz
Patrick
Hallo Patrick, wenn Du sowieso anfängst zu Programmieren ist vielleicht C# die bessere Wahl. Aber ich habe hier mal schnell zusammengeschrieben, wie die ersten Schritte in Visual Basci aussehen: http://frank-it-beratung.com/blog/2013/01/08/tutorial-eigene-posts-via-facebook-api-mit-visual-basic-abrufen/
Guten Abend,
Danke für die schnelle Antwort. Sie hat in der Tat sehr geholfen. Das Einlesen der Freundesliste kappt nach wie vor perfekt. Jedoch hänge ich ein wenig ihren (VB) Quellcode nicht an die Freundesliste, sondern an den Feed anzupassen. Wie muss ich den Code ausser dem Link noch verändern?
Entschuldigen Sie die etwas umständliche Frage, doch leider habe ich noch keine grosse Erfahrung in Visual Basic.
Mit freundlichen Grüssen
Patrick
Hallo Patrick, Danke für Dein Feedback. Ja, das würde gehen. Du kannst mit „https://graph.facebook.com/me/feed“ alle Posts Deines Feeds auslesen. In dem Feld „application“ siehst Du, welche App das gepostet hat – damit kannst Du die Posts Deiner App herausfiltern. In VB kannst Du dann die ListBox mit „ListBox1.Items.Add(…)“ füllen.
In folgenden Tutorial habe ich erklärt, wie man Daten von Facebook ausliest und weiterverarbeitet (von JSON in eine VB-Klasse) – in dem Tutorial wird die Liste der Freunde ausgelesen, aber mit Deinem Feed geht’s genauso:
http://frank-it-beratung.com/blog/2011/02/18/tutorial-facebook-vb-csharp-pinnwandeintrag-bei-freund/
Ich hoffe, das hilft Dir weiter?
Hallo,
Eines sei schonmal gesagt: Das Tutorial ist über alle Teile hinweg verständlich und übersichtlich erklärt. So wie man sich’s wünscht. Echt eine tolle Arbeit! 🙂
Dennoch habe ich eine Frage: Ist es möglich Einträge auf der „Facebook-Startseite“, Einträge meiner „Facebook-Anwendung“ in eine ListBox in VB zu importieren? Wenn man mit ihrer Methode (die übrigens fabelhaft funktionniert) an seine Pinnwand postet, findet sich ja der Zusatz „via [Deine Anwendung]“ wieder. Genau jene Einträge sollten in eine ListBox eingelesen werden.
Ist das realisierbar?
Liebe Grüsse Patrick
Hey. Mit Hilfe deines 3ten Teils habe ich die aktuelle Class aufgebaut. Nur ich komme nicht in die Abfrage der (ich nenne es mal) 3ten ebene des Json string (z.B. an wen wurde der Post gesendet „to -> data -> name / id“). Wie ich gelesen habe, kommt Irgendwann noch ein Teil für den Newsfeed. Ich denke das wird dann in die Richtung gehen, womit ich mich derzeit befasse 😉
Lg Franz
Hallo Franz, vielen Dank für Dein Lob 🙂 Das geht schon in die Richtung, hier habe ich das mal mit Klassen erklärt – zwar mit C# aber ganz unten ist auch ein Beispiel in VB – ich hoffe, das hilft Dir weiter?
http://frank-it-beratung.com/blog/2011/02/18/tutorial-facebook-vb-csharp-pinnwandeintrag-bei-freund/
Hey,
ich bin echt begeistert, wie ausführlich du deine Anleitungen schreibet. Echt Super. Gibt es eine möglichkeit auch Posts von Facebook in einer Class aufarbeiten zu lassen?
Ich hänge da nämlich ein wenig.
{
„id“: „“,
„from“: {
„name“: „“,
„id“: „“
},
„to“: {
„data“: [
{
„name“: „“,
„id“: „“
}
]
},
„message“: „“,
„actions“: [
{
„name“: „“,
„link“: „“
},
[…]
„count“: 4
}
}
Class postmessage_load
Public Property [postmessage] As newpostmessage
Get
Return m_postmessage
End Get
Set(ByVal value As newpostmessage)
m_postmessage = value
End Set
End Property
Private m_postmessage As newpostmessage
End Class
Public Class newpostmessage
Public Property comments() As datamessage
Get
Return m_comments
End Get
Set(ByVal value As datamessage)
m_comments = value
End Set
End Property
Private m_comments As datamessage
End Class
Public Class datamessage
Public Property data() As datadata
Get
Return m_data
End Get
Set(ByVal value As datadata)
m_data = value
End Set
End Property
Private m_data As datadata
End Class
Public Class datadata
Public Property message() As String
Get
Return m_message
End Get
Set(ByVal value As String)
m_message = value
End Set
End Property
Private m_message As String
End Class
Damit sollte die class ja eigentlich die Kommentare auslesen, oder?
Lg Franz
Hallo Markus, ich habe Dein Beispiel getestet und bin fast wahnsinnig geworden, weil eigentlich alles richtig aussah! Aber nun habe ich endlich den Fehler gefunden: Das „?“ in Deiner Nachricht ist falsch. Anders als in meinen Beispielen, an die die Nachricht per GET gesendet oder mit der URL verbunden werden sendest Du das als „POST“ – da ist das „?“ dann zu viel und macht den Body des Requests ungültig. Langer Reder kurzer Sinn – so sollte es korrekt aussehen:
Nachricht = Encoding.UTF8.GetBytes(“message=” + textBox1.Text + “&access_token=” + AccessToken);
Hallo nochmal, habe die Einstellungen nochmal überprüft und es will immer noch nicht :/
Code:
byte[] Nachricht = null;
byte[] Antwort = null;
string AccessToken = „Page-Access-Token“;
string GraphURL = „https://graph.facebook.com/Page-ID/feed“;
System.Net.WebClient myWebClient = new System.Net.WebClient();
System.Net.ServicePointManager.Expect100Continue = false;
Nachricht = Encoding.UTF8.GetBytes(„?message=“ + textBox1.Text
+ „&access_token=“ + AccessToken);
MessageBox.Show(GraphURL + Nachricht);
try
{
Antwort = myWebClient.UploadData(GraphURL, Nachricht);
MessageBox.Show(System.Text.Encoding.ASCII.GetString(Antwort));
MessageBox.Show(„Erfogreich gepostet!“);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Der Fehler ist entweder (400) Ungültige Anforderung (wenn ich die Page-ID nehme) oder
(403) Unzulässig (wenn ich den Pagenamespace nehme)
Hallo Markus, vielen Dank für Dein Lob & Feedback 🙂 Zu Deiner Frage: Das müsste eigentlich so wie Du es versucht hast funktionieren. Nur ein Hinweis: Um auf einer Seite posten zu können kannst Du also das „normale“ Accesstoken (dann erscheint der Post unter dem Namen „Markus“) oder das Page-Token (dann erscheint der Post unter dem Namen Deiner Seite) verwenden. Das Page-Accesstoken benötigst Du, wenn Du im Namen der Seite posten willst – egal wo – also nicht zum posten auf der Seite. Versuche mal folgendes: Melde Dich ganz normal via Browser bei Facebook an und versuche, als Markus auf die Seite ein Post zu schreiben. Falls das nicht geht hast Du oder der Seiten-Admin das in den Einstellungen deaktiviert – dann geht es natürlich auch nicht via API. Falls das funktioniert generiere ein neues Token mit dem scope „publish_stream“ und versuche es nochmals. Falls es nicht klappt poste oder maile mir die genaue Fehlermeldung, dann helfe ich gerne!
Hallo ich kann mich dem Lob nur anschließen, super verständlich erklärt. Ich habe leider doch eine Frage: Wie kann ich mit der Page-ID und dem Page-Accesstoken auf einer Seite posten?
Ich habe es versucht, indem ich „graph.facebook.com/PAGE_ID/feed“ und im Accesstoken den PageAccessToken verwendet hab aber es funktioniert nicht Hife! 😀
Vielen Dank für das Feedback. Ich bin mir nicht ganz sicher, was Du meinst? Aber wahrscheinlich einen normalen Post mit Bild? Das wäre in Teil 1 und 2 nachzulesen. Oder habe ich Dich falsch verstanden?
Moin!
Sehr schönes Tutorials!
Ich habe dennoch eine Frage: Wie kann ich mir denn beispielsweise zusätzlich das Benutzerbild mit anzeigen lassen in der Freundesliste? Bzw. welchen Link benötige ich dafür?
MfG
Ja, eigentlich schon. Gibt es bei Dir Probleme?
Funktioniert das immernoch?
Ja, da hat er Recht. Die Tutorials sind Gold wert. Vielen Dank.
ja, das ist in der tat wesentlich einfacher.. wow. funktioniert auch super. und sogar mit fortschrittsanzeige! besten dank. der webclient ist schon eine feine erfindung 🙂 das sind eindeutig die besten und verständlichsten tutorials zu dem thema die ich überhaupt gesehen habe.
Alles gute und schöne Grüße
Thomas
vielen Dank für die lobenden Worte & viel Erfolg weiterhin!