Wegen der vielen Anfragen zu meinem Tutorial „Facebook API mit MS Access und VBA“ hier ein weiters kurzes VBA-Tutorial. Dies beschreibt, wie man mit VBA aus MS Access (oder anderen Office-Anwendungen) via Facebook API automatisiert Bilder hochladen kann, z. B. in Alben, auf die Pinnwand oder als Event-Bilder. Das war übrigens relativ kompliziert: um die richtige Codierung für die Binärdaten zu finden benötigte ich mit VBA mehrere Anläufe … ich empfehle jedem, genau zu überlegen, ob es wirklich VBA sein muss – mit „echten“ Programmiersprachen C# oder meinetwegen VB ist das deutlich einfacher (siehe meine Tutorials zu Facebook mit C# und VB).
Die Access-Datenbank meines VBA Beispiels besteht nur aus dem Name des Bildes, dem Dateinamen und Pfad (in meinem Beispiel liegt das Fotos einfach im Dateisystem, anderes wäre natürlich denkbar).
Das Foto wird in meinem Beispiel in ein Default-Album hochgeladen (vgl. Kommentare im Quellcode unten). Selbstverständlich kann man auch in ein bestimmtes Album uploaden. Um ein Event mit einem Foto auszustatten muss …“/EVENT_ID/picture“ gewählt werden.
So geht’s:
1. App anlegen und Access Token generieren (diese Vorbereitungsarbeiten habe ich in einem älteren Artikel beschrieben, Punkt 1-6).
2. Eine Access-Datenbank mit ID, Bildname, Dateiname und Pfad anlegen:
3. Ein Formular anlegen (die Vorschau-Funktion ist nur eine Spielerei, auf die hier nicht weiter eingegangen wird):
4. Eine Schaltfläche hinzufügen und den Code-Editor starten – So sieht der Code aus:
Dim nDatei As Integer Dim bBuffer() As Byte Dim bSendBuffer() As Byte Dim sPostData, sDateiDaten, sBildName As String Dim sDateiName, sDateiPfad As String Dim sUrl As String Dim sAccessToken As String ' Zufallswert für die 'Grenzen' des Multipart-Posts Const BOUNDARY As String = "1111-2222-3333-4444" ' Daten aus der DB bzw. dem Formular lesen: sDateiName = Form_Bilder.Dateiname sBildName = Form_Bilder.Bildname sDateiPfad = Form_Bilder.Pfad ' folgende Daten könnte man auch aus der DB lesen ' in diesem Beispiel wurde darauf verzichtet sAccessToken = "..." ' durch /me/photos wird ein neues Album (Name=Name der App) ' erstellt. Alternativ könnte man auch /ALBUM_ID/photos ' für ein bestimmtes Album angeben sUrl = "https://graph.facebook.com/me/photos" ' Datei (Foto) binär auslesen nDatei = FreeFile Open sDateiPfad & sDateiName For Binary Access Read As nDatei If LOF(nDatei) > 0 Then ReDim bBuffer(0 To LOF(nDatei) - 1) As Byte Get nDatei, , bBuffer sDateiDaten = StrConv(bBuffer, vbUnicode) End If Close nDatei ' Den Multipart-Body des Posts vorbereiten sPostData = "" ' Parameter 1: access_token sPostData = sPostData & "--" & BOUNDARY & vbCrLf & _ "Content-disposition: application/x-www-form-urlencoded; " & _ "name=""access_token""" & vbCrLf & vbCrLf & _ sAccessToken & vbCrLf & _ "--" & BOUNDARY & vbCrLf ' Parameter 2: name (=Name des Bildes) sPostData = sPostData & "--" & BOUNDARY & vbCrLf & _ "Content-disposition: application/x-www-form-urlencoded; " & _ "name=""name""" & vbCrLf & vbCrLf & _ sBildName & vbCrLf & _ "--" & BOUNDARY & vbCrLf ' mehr Parameter? Einfach die vorherigen Zeilen duplizieren ' letzter Paramater - das Bild sPostData = sPostData & "Content-Disposition: form-data; " & _ "name=""source""; filename=""" & sDateiName & """" & vbCrLf & _ "Content-Type: application/octet-stream" & vbCrLf & vbCrLf & _ sDateiDaten & vbCrLf & _ "--" & BOUNDARY & "--" ' in Byte-Array umwandeln bSendBuffer = StrConv(sPostData, vbFromUnicode) MsgBox ("Starte Upload ...") ' via MSXML senden ' nicht vergessen: Unter Extras --> Verweise ' den Microsoft XML 3.0 auswählen Dim xmlhttp As New MSXML2.XMLHTTP30 With xmlhttp .Open "POST", sUrl, False .setRequestHeader "Content-Type", "multipart/form-data; " _ & "boundary=" & BOUNDARY .send bSendBuffer End With ' Rückmeldung ausgeben MsgBox ("Upload beendet - Meldung von Facebook: " _ & xmlhttp.responseText)
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, ist der obige Code gleich oder ähnlich, um Bilder in PICASA hochzuladen? Welche Anpassungen wären ggf. erforderlich
Hallo P. Müller, mit Picasa habe ich es noch nicht ausprobiert, aber sicherlich geht das auch. Die API ist hier beschrieben:
https://developers.google.com/picasa-web/docs/2.0/developers_guide_protocol
Mit meinem Tool „Access Token Manager“ kann man auch Tokens für Picasa erstellen (siehe meinen Kommentar vom 27.2.2012):
http://frank-it-beratung.com/blog/access-token-manager/
Ich hoffe, das hilft weiter?
Moin, es sind doch sehr viel Bilder, die ich in unterschiedlichen Themen-Alben auf insgesamt 4 Fanseiten ablegen möchte. Da reicht es aus, wenn die überwiegende Mehrzahl nur im Album abgelegt wird und nur in Einzelfällen man ein Bild auch auf der Pinnwand der Fanseite postet (irgendein true/false-Switch). Das mit dem Posten auf der USER-Seite habe ich gefunden. Man muss einfach alle Beiträge einer Fanseite auf der User-Seite verbergen.
Ganz herzlichen dank, funktioniert einwandfrei. Könntest Du noch mitteilen, wie man die Ausgabe des hochgeladenen Bildes auf der Pinnwand des User unterdrückt, wenn man Bilder auf seiner Fanpage hochlädt.
Gerne 🙂 Zu Deiner Frage: Ich glaube, das kann man gar nicht verhindern – oder genauer: Ich wollte es noch nie verhindern. Aber vielleicht, wenn man es in ein Album legt, also eine Album-ID angibt? Ansonsten müsste ich das auch mal testen. Oder hast Du inzwischen schon eine Lösung gefunden?