Download - Fixing Facebook API - Die schönsten Workarounds (by Klaus Breyer @ AllFacebook Developer Conference)
Dezember 7, 2011 Seite 1 AllFacebook.de Developer Conference - 05.12.2011 Klaus Breyer
Fixing Facebook API - Die schönsten Workarounds
Dezember 7, 2011 Seite 2
Dezember 7, 2011 Seite 3
Dezember 7, 2011 Seite 4
Abstract
• Operation Developer Love: Hilft.
• Codebasis: Besser.
• Heute: Für jeden was dabei.
• Anregungen: Gerne gesehen.
• Fragen: Am Ende.
Dezember 7, 2011 Seite 5
Flash-Layer-Fuckoff
Dezember 7, 2011 Seite 6
Was Agenturen machen: Gewinnspiele
Dezember 7, 2011 Seite 7
Was brauchen Gewinnspiele: E-Mail-Adressen
Dezember 7, 2011 Seite 8
Was haben E-Mail-Adressen:
@
Dezember 7, 2011 Seite 9
• Flash-Einbindung: transparent oder
opaque
• Transparent-Mode: Kein @-Zeichen
im Firefox
• Window-Mode: Flash im
Vordergrund – keine Overlays
• Popup-Elemente: Geblockt, da kein
onclick-Event ausgelöst wurde
è Kein @ in Flash!
Problem
Dezember 7, 2011 Seite 10
Lösung 1: Unsichtbare Inputs und Javascript
• Flash in transparent eingebunden
• Unsichtbare Input-Felder über dem Flash
• Flash aktiviert Javascript zum Einblenden
• Javascript schickt Eingabe zurück
• Problem an der Lösung: In Flash eingebundene Schriften.
• Man könnte jeden einzelnen Buchstaben abgreifen
• Aber: Cursorposition und Darstellung
Dezember 7, 2011 Seite 11
Lösung 2: Das doppelte Lottchen
• E-Mail-Adresse wird nicht in transparent-Flash eingegeben
• Eigener Layer zur Eingabe
• Flash in window-Mode
• HTML
• Javascript wechselt die Layer-Positionen
• Müssen beide schon sichtbar sein, sonst Lag.
• Saubere Lösung, wenn keine andere Möglichkeit für den Kunden akzeptabel ist
Dezember 7, 2011 Seite 12
Was der Nutzer sieht
Dezember 7, 2011 Seite 13
Was eigentlich da ist
Dezember 7, 2011 Seite 14
Das Ergebnis
Dezember 7, 2011 Seite 15
Lösung 3: Permission einholen
• As simple as that.
• Learning für Konzeption
Dezember 7, 2011 Seite 16
Likes
Dezember 7, 2011 Seite 17
Brands wollen Likes
Dezember 7, 2011 Seite 18
Smoother: Inline-Like Button
Dezember 7, 2011 Seite 19
Code
<fb:like href=http://www.facebook.com/skoda! send="false”! width="450”! show_faces="false"></fb:like>!!!
FB.Event.subscribe('edge.create',! !!!function(response) { !!!window.location.reload (); !!!} !!!); !!
!!
Dezember 7, 2011 Seite 20
Klappt auch mit mehreren
Dezember 7, 2011 Seite 21
Auch mit Faces
Dezember 7, 2011 Seite 22
Problem: Empfehlungs-Dialog
Dezember 7, 2011 Seite 23
Lösung: Overlays
Dezember 7, 2011 Seite 24
Scrollbar-Bugs
Dezember 7, 2011 Seite 25
Problem: Scrollbars in Reitern
• Ursachen:
• Javascript SDK resized nicht richtig.
• Content wenige Pixel zu groß
• Check: Per HTTPS eingebunden?
Dezember 7, 2011 Seite 26
Lösung: Overflow hidden / feste Größe
FB.Canvas.setAutoResize();! FB.Event.subscribe('xfbml.render', function(response) {! FB.Canvas.setAutoResize();! });!!!
body {!!margin:0;!!padding:0; !!height:1420px;!!width:520px;!!overflow:hidden;!!}!
Dezember 7, 2011 Seite 27
Kampagnen-Administration
Dezember 7, 2011 Seite 28
Das Problem
• Der Kunde möchte die Inhalte bearbeiten können
• Vergisst aber ständig den Zugang zum Backend
Dezember 7, 2011 Seite 29
Lösungen
• Eigenständiges Back-End
• Scaffolding
• Universell
• CMS-Anbindung
• Abfrage auf Page-Administrator
• Links zum Löschen/Editieren direkt in Reiter
• Einheitliche Lösung
• Kein eigenes Back-End mit eigenem Design nötig
Dezember 7, 2011 Seite 30
Was der Benutzer sieht
Dezember 7, 2011 Seite 31
Was der Seitenadministrator sieht
Dezember 7, 2011 Seite 32
Was der Seitenadministrator machen kann
Dezember 7, 2011 Seite 33
Code
function parse_signed_request($signed_request, $secret) {! list($encoded_sig, $payload) = explode('.', $signed_request, 2); ! // decode the data! $sig = base64_url_decode($encoded_sig);! $data = json_decode(base64_url_decode($payload), true);! if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {! error_log('Unknown algorithm. Expected HMAC-SHA256');! return null;! }! // check sig! $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);! if ($sig !== $expected_sig) {! error_log('Bad Signed JSON signature!');! return null;! }! return $data;!}!!function base64_url_decode($input) {! return base64_decode(strtr($input, '-_', '+/'));!}!
Dezember 7, 2011 Seite 34
Ergebnis
[algorithm] => HMAC-SHA256![expires] => 1321815600![issued_at] => 1321808659![oauth_token] => ![page] => Array! (! [id] => 120959471289306! [liked] => 1! [admin] => 1! )![user] => Array! (! [country] => de! [locale] => de_DE! [age] => Array! (! [min] => 21! )! )![user_id] => 707892557!
Dezember 7, 2011 Seite 35
Bild-Upload
Dezember 7, 2011 Seite 36
Problem
• Profilbildgeneratoren
• Fotowettbewerbe
• User möchten ihre Bilder auswählen
• Die wichtigsten Bilder sind ohnehin in Facebook
• Facebook bietet dafür kein Widget
Dezember 7, 2011 Seite 37
Lösung: Nachbauen
Dezember 7, 2011 Seite 38
Mega-Batch-Requests
Dezember 7, 2011 Seite 39
Problem
• Riesige Batch-Requests werden nicht ausgeführt wegen Limit
• Use-Cases:
• Alle je geposteten Links von allen Freunden
• Auslesen aller Freunde seiner Freunde
Dezember 7, 2011 Seite 40
Lösung: Aufteilen
$members = $facebook->api("/me/friends", "GET", $args);!!$anzmembers = ceil($anzmembers/20);!!foreach ($members[data] as $key => $value) {!
!$requests[$i%$anzmembers] !!.= '{"method":"GET","relative_url":"'.$value[id].'/links"},';!
}!!for ($i=0; $i < count($string); $i++) { !
!$batched_request = "[". substr($requests[$i], 0, -1) . "]";!!
!$post_url = "https://graph.facebook.com/" . "?batch=" !!. $batched_request . "&access_token=" . $access_token !!. "&method=post";!
}!
Dezember 7, 2011 Seite 41
App-Requests
Dezember 7, 2011 Seite 42
Problem
• Die Konzeption sagt: Es müssen genau 3 Leute eingeladen werden
• Früher: App-Requests ohne Nutzer-Limits
• Nur Listen-Vorschläge
• Facebook bietet keine reine Freund-Auswahl
Dezember 7, 2011 Seite 43
Lösung 1: Mechanik ändern
• Limit entfernen
• Beliebig viele Leute einladen lassen können
• First Come – First Served
• Requests gehen unter
• Mehr Reichweite
Dezember 7, 2011 Seite 44
Lösung 2: Nachbauen
Dezember 7, 2011 Seite 45
Lösung 2: Nachbauen
Dezember 7, 2011 Seite 46
Lösung 2: Nachbauen
Dezember 7, 2011 Seite 47
Evercookie
Dezember 7, 2011 Seite 48
Problem
• Man darf per Like-Buttons keine Voting-Gewinner bestimmen
• Voting ohne Installation sehr Betrugsanfällig
• Installation allerdings Hürde
Dezember 7, 2011 Seite 49
Lösung: Evercookie
• Standard HTTP Cookies
• Local Shared Objects (Flash Cookies)
• Silverlight Isolated Storage
• Storing cookies in RGB values of auto-generated, force-cached PNGs using HTML5 Canvas tag to read pixels (cookies) back out
• Storing cookies in Web History
• Storing cookies in HTTP ETags
• Storing cookies in Web cache
• window.name caching
• Internet Explorer userData storage
• HTML5 Session Storage
• HTML5 Local Storage
• HTML5 Global Storage
• HTML5 Database Storage via SQLite
Dezember 7, 2011 Seite 50
Tab-Verlinkungen
Dezember 7, 2011 Seite 51
Was der Kunde bekommt, wenn er einen Tab verlinkt:
Dezember 7, 2011 Seite 52
Was der Kunde eigentlich möchte:
Dezember 7, 2011 Seite 53
Lösung
• OG-Metatags und eine Weiterleitung
• Nebeneffekte
• Durch die Umleitung Favoritenlistung auch von Reitern
• Server-Root macht immer etwas
• OG-Tags sollte man so oder so setzen
• Wiederverwendbar
Dezember 7, 2011 Seite 54
Code
<head xmlns="http://www.w3.org/1999/xhtml"! xmlns:og="http://ogp.me/ns#"! xmlns:fb="http://www.facebook.com/2008/fbml">! <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />! <meta property="og:title" content="ME, MYKITA & I" />! <meta property="og:url" content="<?echo $fb_tab_url;?>" />! <meta property="og:description" content="ME, MYKITA & I" />! <meta property="og:site_name" content="ME, MYKITA & I" />! <meta property="og:type" content="product" />! <meta property="og:image" content="http://buddybrand.eu/mykita/me_mykita_i/images/client.png" />! <meta property="fb:app_id" content="<?echo $fb_app_id;?>" />! <script type="text/javascript">! top.location.href = '<?echo $fb_tab_url;?>';! </script>!</head>!<body>!</body>!</html>!
Dezember 7, 2011 Seite 55
Zeit für Fragen!
Kontakt:
Klaus Breyer
http://facebook.com/klausbreyer
http://twitter.com/klausbreyer
We are hiring:
http://facebook.com/buddybrand
http://buddybrand.de
Dezember 7, 2011 Seite 56
Impressum
buddybrand GmbH Greifenhagener Straße 63 10437 Berlin T.: +49 [0]30 4467793 F: +49 [0]30 446779325 Die in dieser Präsentation dokumentierten Gedanken und Ideen sind stets Eigentum der buddybrand GmbH. Der gesamte Inhalt ist geschützt durch das deutsche Urheberrecht. Eine auch nur auszugsweise Nutzung oder Weitergabe an Dritte bedarf in jedem Fall der ausdrücklichen, schriftlichen Genehmigung durch die buddybrand GmbH.
Klaus Breyer
10