Archive for the ‘Facebook’ Category

Symfony2 und die Facebook php sdk 4

16. März 2015

Um in Symfony2 mit der neuen Facebook PHP SDK zu arbeiten, muss man zunächst die library über den composer hinzufügen. Man fügt also im composer.json unter require eine Zeile hinzu:

  1. "facebook/php-sdk-v4" : "4.0.*",

und dann den composer updaten lassen (“php composer.phar update”). Wenn alles geklappt hat, kann man nun in seinem Controller wenn benötigt oben die Facebook Klassen via “use” hinzufügen:

  1. use Facebook\FacebookSession;
  2. use Facebook\FacebookRedirectLoginHelper;
  3. use Facebook\FacebookRequest;
  4. use Facebook\FacebookResponse;
  5. use Facebook\FacebookSDKException;
  6. use Facebook\FacebookRequestException;
  7. use Facebook\FacebookAuthorizationException;
  8. use Facebook\GraphObject;

Und dann lassen sich die Klassen ohne Pfad einfach ansprechen, beispielsweise

  1. FacebookSession::setDefaultApplication($id, $secret);

Was ich dann festgestellt habe, ist dass Symfony mit dem Session Handling von Facebook so nicht klarkommt, irgendwann wirft es dann eine Exception:

  1. FacebookSDKException: Session not active, could not store state.

Dies lässt sich aber sehr einfach beheben, denn in Symfony2 ist die Session sowieso immer aktiv, ein Prüfen des Session Status braucht es nicht:

  1. $helper = new FacebookRedirectLoginHelper( $this->generateUrl( 'facebooklogin', array(), true ) );
  2. $helper->disableSessionStatusCheck();

Danke vielmals an den Stackoverflow Beitrag von SammyK, der die 3 optionen sehr gut beschreibt.

Hahahahaha neue Facebook PHP SDK

06. Mai 2014

Weils so lustig ist, hat Facebook beschlossen, still und heimlich eine neue PHP SDK einzuführen. Und neben den üblichen Problemen (schlechte Doku, keine Beispielscripts) gibt getLoginUrl nun nicht mehr die altbekannte Facebook User ID zurück sondern eine “App Scoped User ID” – eine völlig neue ID die irgendwie im Zusammenhang mit der aktuellen APP ID generiert wird.
Wer also ein Login aufgrund der bestehenden Facebook User Id implementiert hat, wird sich in Zukunft so RICHTIG freuen.

Was ich bisher gefunden habe ist der hinweis, dass die alte SDK noch bis April 2015 funktionieren soll: https://developers.facebook.com/docs/apps/upgrading#upgrading_v2_0_user_ids

Und ein einziges echtes Beispielscript ist mir bisher über den Weg gelaufen, dafür is das richtig gut und übersichtlich: http://metah.ch/blog/2014/05/facebook-sdk-4-0-0-for-php-a-working-sample-to-get-started/

Facebook php sdk: getUser = 0

25. Februar 2014

Ich habe ja schonmal einen Artikel zum Thema “getUser liefert 0 zurück” geschrieben, aber seit neuestem hilft mir auch das nicht weiter. Egal was ich auch mache, beim ersten Versuch liefert, trotz erfolgreichem Erteilen der entsprechenden Rechte, getUser 0 zurück. Mir wars nach langem Suchen und Probieren dann zu blöd, ich habe als Fehlerquelle die Funktion getCode in base_facebook.php ausgemacht. Und wenn man die etwas modifiziert, klappt es auch wieder mit getUser:

  1. protected function getCode() {
  2. if (!isset($_REQUEST['code']) || !isset($_REQUEST['state'])) {
  3. return false;
  4. }
  5. //return $_REQUEST['code'];
  6. if ($this->state === $_REQUEST['state']) {
  7. // CSRF state has done its job, so clear it
  8. $this->state = null;
  9. $this->clearPersistentData('state');
  10. return $_REQUEST['code'];
  11. }else{
  12. return $_REQUEST['code'];
  13. }
  14. self::errorLog('CSRF state token does not match one provided.');
  15. return false;
  16. }

Nicht die sauberste Lösung, aber nichts anderes hat mein Problem gelöst.

iOS Facebook App Browser erkennen

16. Oktober 2013

Letztens habe ich festgestellt, dass die iOS originale Facebook App einen eigenen “Browser” hat. Das heißt, wenn man im Facebook auf einen Link klickt, öffnet sich nicht der Safari oder ein anderer Browser, sondern die Facebook App nutzt quasi einen eigenen Browser – und der kann natürlich einige Dinge nicht, beispielsweise ignoriert er auf dem iphone die media queries zum Thema “orientation”. Sehr ungünstig das. Anscheinend kann man das Öffnen in Safari nicht erzwingen, deshalb habe ich behelfsmäßig ein browser detect gebaut. Im HTTP_USER_AGENT werden namlich über Facebook ein paar interessante Daten mitgeliefert udn so kann man feststellen, ob man sich gerade im Facebook Browser am iPad oder am iPhone befindet:

  1. if(preg_match('/FBIOS/i',$_SERVER['HTTP_USER_AGENT']){
  2. //facebook browser
  3. if(preg_match('/iPad/i',$_SERVER['HTTP_USER_AGENT'])){
  4. //facebook browser via ipad
  5. echo "iPad!";
  6. }else{
  7. //facebook browser via iphone
  8. echo "iPhone!";
  9. }
  10. }

Falls es wen interessiert, der HTTP_USER_AGENT liefert am ipad folgendes zurück:

  1. Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465 [FBAN/FBIOS;FBAV/6.5.1;FBBV/377040;FBDV/iPad3,6;FBMD/iPad;FBSN/iPhone OS;FBSV/7.0;FBSS/2; FBCR/;FBID/tablet;FBLC/de_DE;FBOP/1]

Facebook Kommentar Box: Einträge sortieren

05. Juli 2013

Standardmäßig wird offenbar nach irgendeinem merkwürdigen Kriterium namens “social” sortiert – um die Sortierung nach Zeit (absteigend) zu implementieren fügt man ein order_by=”reverse_time” ein. Is eh simpel, aber vielleicht braucht mans mal wieder.

Facebook PHP SDK: getUser liefert 0 zurück beim ersten Aufruf

31. Januar 2013

Das Problem: beim Facebook Login kommt es manchmal zu Problemen. Obwohl der User sich authentifiziert hat, gibt getUser 0 zurück.

Auf meiner Seite klickt der User auf LOGIN und wird zu der URL weitergeleitet, die ich mit $facebook->getLoginUrl generiert habe. Er wird dann von Facebook nach einer Authentifizierung der App gefragt und wenn er diese authentifiziert, wird er zurück geleitet auf meine login.php. Hier wird nun getUser abgefragt und da sollte dann EIGENTLICH die FacebookUserId drinstehen. Tut sie aber bei einem frischen User nicht. Mein Script war so ausgelegt, dass im Fall dass getUser nur 0 zurückgibt, erneut weitergeleitet wird auf getLoginUrl. Dies leitet dann wieder zurück auf die login.php und so ergibt sich ein hin und her, bei dem schnell die meisten Browser (Chrome als erstes) abspringen und einen Umleitungsfehler melden.

Die Lösung: ein javascript redirect. Klingt furchtbar, ist auch so, aber half mir, das Problem zu lösen. Gibt mir getUser beim ersten mal 0 zurück, dann zeige ich eine Seite mit einem kurzen Hinweis (“..blabla.. Probleme mit Facebook… blabla … hier klicken…”) an. Diese Seite sehen aber die wenigsten, weil sie direkt einen javascript redirect (location.href = …) hat, direkt wieder zur getLoginUrl. Also macht eigentlich auch nichts anderes als mein alter redirect, aber offenbar reicht die kurze Unterbrechung, um Facebook zur Besinnung zu bringen, denn plötzlich ist getUser auch nicht mehr 0 sondern liefert die tatsächliche ID des Nutzers zurück!

Kurz zusammengefasst: wenn getUser = 0, dann eine Seite dazwischenbauen die mit location.href zurück auf getLoginUrl verweist!

“Permalink” zu einem einzelnen Facebook Post (Wallpost)

03. September 2012

Es ist leicht, wenn mans weiß. Aber wissen muss mans erstmal. Ich habe die Wallposts einer Facebook Seite ausgelesen:

  1. require_once 'facebook.php';
  2. $fb = new Facebook(array(
  3.           'appId'  => APP_ID,
  4.           'secret' => APP_SECRET,
  5.             'cookie' => true
  6.         ));
  7. $at = $fb->getAccessToken();    
  8. $url = 'https://graph.facebook.com/PAGE_ID/feed?limit=10&access_token='.$at;
  9. $contents = file_get_contents($url);
  10. $FBdata = json_decode($contents);

Und festgestellt, dass nicht überall ein Link mitgegeben wird. Daher habe ich ihn selbst zusammengebaut:

  1. foreach($FBdata->data as $k => $data){
  2.     if($data->message){
  3.         $id_arr = explode("_", $data->id); //get the post ID from PAGEID_POSTID
  4.         $msg = $data->message; // the message
  5.         $msg = explode("###", wordwrap($msg,50, "###")); //short it down to 50 characters
  6.         $link = 'https://www.facebook.com/PAGEURL/posts/'.$id_arr[1];
  7.         echo "<a href='".$link."'>".$msg[0]."...</a>";
  8.     }
  9. }

Damit lautet der Permalink zu einem Beitrag https://www.facebook.com/PAGEURL/posts/POSTID.

 

Facebook JavaScript SDK: stream.publish in $.post auf einem mobilen device

13. August 2012

Das hier funktioniert auf iOs / Android:

  1. var obj = {
  2.         method: 'stream.publish',
  3.         link: 'http://www.test.de',
  4.         picture: picture,
  5.         name: 'Dies ist ein Wallpost!',
  6.         caption: 'Der Wallpost Untertitel',
  7.         description: 'Jahaaa, die Description lorem ipsum dolor sit amet... ',
  8.         action_links: [{ text: 'Bäm!', href: 'http://www.test.de' }]
  9.     };    
  10.     FB.ui(obj);

Das hier nicht:

  1.     $.post('somelink.php', {id: id}, function(text){
  2.          var obj = {
  3.             method: 'stream.publish',
  4.             link: 'http://www.test.de',
  5.             picture: picture,
  6.             name: 'Dies ist ein Wallpost!',
  7.             caption: 'Der Wallpost Untertitel',
  8.             description: 'Jahaaa, die Description lorem ipsum dolor sit amet... ',
  9.             action_links: [{ text: 'Bäm!', href: 'http://www.test.de' }]
  10.         };    
  11.         FB.ui(obj);        
  12.     });

Ich habe dafür bislang keine Erklärung, meine Lösung wird so aussehen, dass ich in der mobilen Version meiner Seite das ganze überhaupt nicht mit der JavaScript SDK mache sondern über einen PHP Link:

  1. $app_id = '4444444444444';
  2. $redirect = 'http://www.xxx.xx/somelink.php';
  3. $link = 'http://www.test.de';
  4. $message = 'Dies+ist+ein+Wallpost!';
  5. $caption = 'aaaa';
  6. $desc = 'bbbbbbb';
  7. $name = 'cccc';
  8. $url= "https://www.facebook.com/dialog/feed?app_id=".$app_id."&redirect_uri=".$redirect."&link=".$link."&message=".$message."&picture=".$picture."&caption=".$caption."&description=".$desc."&name=".$name;
  9. header("Location:".$url);

Facebook registration plugin – innerhalt einer Lightbox

27. Juli 2012

Weil der Umgang mit Facebook und seinen social plugins noch nicht schwierig genug ist, habe ich mir in meiner grenzenlosen Vermessenheit gedacht, ich mache das Ganze noch eine Stufe schwieriger. Ich wollte, dass denen, die sich neu registrieren auf meiner Seite, das register plugin in einer Lightbox angezeigt wird. Ich muss völlig WAHNSINNIG gewesen sein, als ich diesen Plan gefasst habe.

Weil es das bisher beste Lightbox plugin ist, das mir je begegnet ist, habe ich mich für die jquery ColorBox entschieden. Die bringt eigentlich alle Features mit, die ich brauche, insbesondere die Möglichkeit, das Aussehen völlig an die eigenen Vorstellungen anzupassen. Ich habe also im header meiner Seite folgendes Script aufgerufen:

$(document).ready(function(){
$.colorbox({href: ‘register.html’, opacity:0.6, onComplete: function(){ FB.XFBML.parse(); } });
});

Damit wird beim Laden der Seite direkt die ColorBox aufgerufen und darin wird die register.html angezeigt, die sieht folgendermaßen aus:

  1.         <div id="register">
  2.             <div width="500" height="300" fb_only="true" onvalidate="validate"
  3.                         data-fields="[{'name':'name'}, {'name':'email'},
  4.                           {'name':'agb', 'description':'Ich akzeptiere die AGB', 'type':'checkbox'}]"
  5.                         data-redirect-uri="/register.php">
  6.             </div>
  7.         </div>

Durch das asynchrone Laden des Contents muss man diesen Facebook Code neu parsen, dazu ist der onComplete Teil da: FB.XFBML.parse() stellt sicher, dass das registrieren Formular auch wirklich jedes mal angezeigt wird.

PS: was hier jetzt so leicht aussieht, hat mich in Wahrheit natrülich mehrere Stunden gekostet.

Facebook “Freunde einladen” in einem page tab

29. Juni 2012

Eigentlich ergab meine Recherche, dass man den apprequets dialog von Facebook in einem Seitenreiter nicht benutzen kann. Das stimmt theoretisch auch, wenn man die Methode aufruft, öffnet sich zwar das Fenster, die Einladungen werden aber nicht verschickt. Allerdings kann man dieses Problem relativ leicht umgehen:

1. Man gibt der App auch eine Canvas URL, dieselbe wie für den page tab auch. Nun funktioniert das Freunde einladen auch im page tab, wenn diese allerdings auf den request klicken, werden sie zur Applikation (nicht zum Seitenreiter) weitergeleitet

2. Man richtet auf der index.php eine Weiterleitung ein, wenn der Parameter fb_source gesetzt ist. Der ist in einer Applikation immer gesetzt, im Seitenreiter nie. So leitet man all jene, die über Freundschaftsinvites kommen, einfach weiter.

  1. if($_REQUEST['fb_source']){
  2.     die("<script>window.top.location = 'http://www.facebook.com/PAGENAME/app_XXXXXXXXX'; </script>");
  3. }