Tutorial: Aus MS Access mit VBA Fotos nach Facebook uploaden

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:

Facebook API Bilderupload mit VBA

3. Ein Formular anlegen (die Vorschau-Funktion ist nur eine Spielerei, auf die hier nicht weiter eingegangen wird):

Facebook API Bilderupload mit VBA

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

Dieser Beitrag wurde unter Facebook, Graph API, Programmierung, Social Networks, VBA abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

5 Kommentare zu Tutorial: Aus MS Access mit VBA Fotos nach Facebook uploaden

  1. P. Müller sagt:

    Hallo, ist der obige Code gleich oder ähnlich, um Bilder in PICASA hochzuladen? Welche Anpassungen wären ggf. erforderlich

  2. Ralf Hachmann sagt:

    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.

  3. Ralf Hachmann sagt:

    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.

    • Simon A. Frank sagt:

      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?

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.