Skip to content

Instantly share code, notes, and snippets.

@lucahammer
Last active August 29, 2015 14:05
Show Gist options
  • Save lucahammer/a8994008f3ec91e0e33b to your computer and use it in GitHub Desktop.
Save lucahammer/a8994008f3ec91e0e33b to your computer and use it in GitHub Desktop.
import 'dart:html';
import 'dart:async';
import 'dart:convert';
var host = "graph.facebook.com/v1.0"; //Facebook Graph API
var group = "229552893839458"; //Gruppe mit der ich aktuell arbeite
var url = "http://$host/$group"; //URL die Gruppeninfo als JSON zurückgibt
var data; //HTML Element, wo die Daten dargestellt werden
var log; //HTML Element für Log-Einträge
var accessTokenShort = 'USE-YOUR-OWN'; //Access Token with group permissions (testing only!)
var appId ="USE-YOUR-OWN";
var appSecret = "USE-YOUR-OWN"; //TODO: Sollte nie im Clientcode sein!
var accessToken = "USE-YOUR-OWN";
Map posts; //Hier werden die jeweils aktuellen Daten von Facebook gespeichert
int counter = 1; //Hacky Counter, um anzuziegen die wievielte Seite geladen wurde
void main() {
querySelector('#load').onClick.listen(makeRequest); //Wartet darauf, dass auf den Load-Button geklickt wird, woraufhin die Infos geholt werden
data = querySelector('#json_content'); //Wählt das HTML Element, wo die Daten dargestellt werden.
querySelector('#longterm').onClick.listen(getLongTermToken); //wartet auf Klick
querySelector('#posts').onClick.listen(getPosts); //wartet auf Klick
querySelector('#moreposts').onClick.listen(getMorePosts); //Button für mehr Posts
log = querySelector('#log'); //Log-HTML-Element
}
/*void makeRequest(Event e) { //Einfacher get request
var path = url;
HttpRequest.getString(path)
.then(processString)
.catchError(handleError);
}*/
void getPosts(Event e) { //Lädt die erste Seite an Posts
var httpRequest = new HttpRequest(); //neues httpRequest Objekt
var path = "https://graph.facebook.com/v2.1/$group/feed?access_token=$accessToken";
httpRequest
..open('GET', path) //es handelt sich um einen GET request
..onLoadEnd.listen((e)=> getPostsComplete(httpRequest)) //wenn alles geladen ist führe requestComplete aus
..send(''); //kann leer gesendet werden, da nur GET
log.children.add(new LIElement()..text = 'Seite 0 geladen: $path');
}
getPostsComplete(HttpRequest request) {
if (request.status == 200) { //falls alles OK ist mach folgendes
processPosts(request.response); //verarbeite das geladene Ergebnis(JSON) mit processString
}
else { //falls nicht OK gib den Fehlercode aus
data.children.add(new LIElement()..text = 'Failed. Status={$request.status}');
}
}
void processPosts(json){ //Wandelt JSON in eine Dart Map um und gibt die Timecodes der Beiträge als Liste aus
posts = JSON.decode(json);
//data.children.add(new LIElement()..text = posts['data'][1].toString());
for (var i=0; i<posts['data'].length; i++) {
data.children.add(new LIElement()..text = posts['data'][i]['created_time'].toString());
}
}
void getMorePosts(path) { //Lade weitere Seiten
var httpRequest = new HttpRequest();
var path = posts['paging']['next'];
httpRequest
..open('GET', path) //es handelt sich um einen GET request
..onLoadEnd.listen((e)=> getMorePostsComplete(httpRequest)) //wenn alles geladen ist führe requestComplete aus
..send('');
}
getMorePostsComplete(HttpRequest request){
if (request.status == 200) { //falls alles OK ist mach folgendes
processPosts(request.response); //verarbeite das geladene Ergebnis(JSON) mit processString
log.children.add(new LIElement()..text = 'Seite $counter geladen.');
if (counter<30) {
getMorePosts(counter);
counter++;
}
}
else { //falls nicht OK gib den Fehlercode aus
data.children.add(new LIElement()..text = 'Failed. Status={$request.status}');
}
}
void getLongTermToken(Event e) { //Holt sich mithilfe des KurztermToken, den man über den Weblogin bekommt einen Longtermtoken.
var httpRequest = new HttpRequest(); //neues httpRequest Objekt
var path = "https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id=$appId&client_secret=$appSecret&fb_exchange_token=$accessTokenShort";
httpRequest
..open('GET', path) //es handelt sich um einen GET request
..onLoadEnd.listen((e)=> tokenrequestComplete(httpRequest)) //wenn alles geladen ist führe requestComplete aus
..send(''); //kann leer gesendet werden, da nur GET
}
tokenrequestComplete(HttpRequest request) {
if (request.status == 200) { //falls alles OK ist mach folgendes
processToken(request.response); //verarbeite das geladene Ergebnis(JSON) mit processString
}
else { //falls nicht OK gib den Fehlercode aus
data.children.add(new LIElement()..text = 'Failed. Status={$request.status}');
}
}
void processToken(token) { //gibt Longterm Access Token aus. Sollte später direkt in die Datenbank gespeichert werden.
data.children.add(new LIElement()..text = token.toString());
}
void makeRequest(Event e) { //sauberer http request
var path = url; //was abgerufen werden soll
var httpRequest = new HttpRequest(); //neues httpRequest Objekt
httpRequest
..open('GET', path) //es handelt sich um einen GET request
..onLoadEnd.listen((e)=> requestComplete(httpRequest)) //wenn alles geladen ist führe requestComplete aus
..send(''); //kann leer gesendet werden, da nur GET
}
requestComplete(HttpRequest request) {
if (request.status == 200) { //falls alles OK ist mach folgendes
processString(request.response); //verarbeite das geladene Ergebnis(JSON) mit processString
}
else { //falls nicht OK gib den Fehlercode aus
data.children.add(new LIElement()..text = 'Failed. Status={$request.status}');
}
}
processString(String jsonString) { //JSON verarbeiten
Map info = JSON.decode(jsonString); //Dekodiere den JSON String als eine Key-Value Map
//data.children.add(new LIElement()..text = info.toString()); //komplettes JSON in einfachen String umwandeln
data.children.add(new LIElement()..text = info['id']); //Value des Keys id als Listenelement ausgeben
data.children.add(new LIElement()..text = info['name']); //siehe oben
data.children.add(new LIElement()..text = info['description']);
data.children.add(new LIElement()..text = info['privacy']);
data.children.add(new LIElement()..text = info['icon']);
data.children.add(new LIElement()..text = info['updated_time']);
data.children.add(new LIElement()..text = info['email']);
/*for (int i = 0; i < info.length; i++) { //funktioniert nicht
var infoPunkt = info.;
data.children.add(new LIElement()..text = infoPunkt);
}*/
}
handleError(Error error) { //falls etwas schief läuft, sag dass etwas schief lief
data.children.add(new LIElement()..text = 'Request failed. $error');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment