Summer of Dart: Authentifizierte Facebook API Calls und alle Beiträge einer Gruppe abrufen

Heute hat es geregnet und ich habe etwas mehr Zeit als geplant mit dem Dartprojekt verbracht. Gute Fortschritte. Ich kann kurzfristige Access Token in langfristige umwandeln, die aktuellsten 20 Beiträge einer Gruppe abrufen und alle älteren auch. Der Code wird immer chaotischer, aber funktioniert.

Kurzlebigen Token in langlebigen Umwandeln

Eine Login-Routine habe ich immer noch nicht implementiert. Aber über den Graph-Explorer habe ich mir einen kurzelebigen Accesstoken für meinen Account geholt. Mit Gruppen-Berechtigung. Dazu habe ich eine Facebook App erstellt, im Graph Explorer ausgewählt und den ‘Get Access Token’ Button geklickt. Der entstandene Access-Token ist allerdings nur ein paar Stunden gültig. Man kann ihn aber in einen langlebigen (1-2 Monate) umwandeln. Dazu braucht man zum kurzlebigen Token die App Id und das App Secret. Findet man beides bei den App Einstellungen. Hat man diese jeweils als Variablen in seinem Dart Programm gespeichert, kann man über einen HTTP Get Request den langlebigen Token bekommen: https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id=$appId&client_secret=$appSecret&fb_exchange_token=$accessTokenShort

Authentifizierter API Call

Auch hier handelt es sich um einen einfachen Http-Request, an den nach einem ‘?’ der Access Token gehängt wird. “https://graph.facebook.com/v2.1/$group/feed?access_token=$accessToken” ruft etwa die aktuellsten Beiträge einer Gruppe ab.

Weitere Gruppenbeiträge abrufen

Facebook liefert JSON zurück, welches man mithilfe von JSON.decode in ein Dart Objekt umwandeln kann. Die größte Schwierigkeit für mich war sich in der Mischung aus Map und List zurechtzufinden. Ich wollte den Zeitstempel der Beiträge auf der Seite ausgeben, um schnell zu sehen, von wann die geladenen Beiträge sind. Zu denen kommt man mit folgender Konstruktion: “posts['data'][i]['created_time'].toString()”.

  • “posts” ist die Map in die ich die JSON response decodiert habe.
  • “['data']” gibt mir den Value zum Key “data” im “posts” Objekt.
  • “[i]” greift auf das i-te Element (wir befinden uns offensichtlich in einer for-Schleife) der List, welche die Value zum Key “data” im “posts” Objekt ist, zu.
  • “['created_time']” wählt in der Map, welche ein Listenelement ist, welche ein Element einer Map ist, den Value zum Key “created_time” aus.
  • “.toString()” wandelt nun diesen Wert in einen String um, damit er ausgegeben werden kann.

Im Rückgabewert befinden sich auch Links um weiter und zurück zu navigieren, welche ich für den nächsten Http-Request nutze: “var path = posts['paging']['next'];”. Dies wiederhole ich aktuell 30 mal, wobei das Programm abbricht, wenn es keinen “next”-Link mehr gibt. Dies passiert wenn man sich auf der letzten Seite befindet. Daher sollte ich irgendwann eine if-Abfrage einbauen, ob es denn einen Link gibt und sonst ausgeben, dass alle Beiträge geladen wurden.

Wie immer der gesamte Code als Gist. Ihr müsst allerdings eigene Access Token, App Ids und App Secrets einfügen. Und die dann nicht weitergeben.

Diese Mal auch das dazugehörige HTML. Inzwischen gibt es vier Buttons, um unterschiedliche Dinge zu machen.

Weitere Pläne


wallpaper-1019588
Die Parallelwelt-Chroniken des Aristokraten: Neue Details zum Disc-Release bekannt
wallpaper-1019588
My Unique Skill Makes Me OP even at Level 1: Serie erscheint auf Disc
wallpaper-1019588
Twilight Out of Focus: Neues Promo-Video veröffentlicht
wallpaper-1019588
Wind Breaker: Neuigkeiten zum Cast + Visual