Facebook API

0

Witam.
Piszę aplikację na Facebooka wykorzystując PHP SDK.

Chciałbym, aby moja aplikacja po uzyskania pozwolenia od użytkownika publikowała posty w jego imieniu.

O ile kod do publikowania jest łatwo dostępny w internecie, o tyle zdobycie ACCESS_TOKEN danego użytkownika kompletnie mnie przerasta.

Najgłębsze zakamarki internetu przeszukane, a sposób podany w dokumentacji na stronach Facebooka nie działa (błąd związany z brakiem dostępu do zmiennej STATE).

Jeśli ktoś jest w stanie pomóc to będę bardzo wdzięczny :)

P.S.
Próbowałem już bardzo wiele kodów, ale generalnie mam wrażenie, że najbardziej trafne były te podobnego do tego (ten konkretnie służy do pobierania ACCESS_TOKEN dla mojej własnej aplikacji, a mnie chodzi o ACCESS_TOKEN użytkownika, którego ID posiadam):

 
	$token_url = "https://graph.facebook.com/oauth/access_token?" .
		"client_id=ID_MOJEJ_APLIKACJI".
		"&client_secret=SEKRET_MOJEJ_APLIKACJI".
		"&grant_type=client_credentials";
		
	$AccessToken = file_get_contents($token_url);
0
 
    <?
    $app_id = "ID_APLIKACJI";
    $app_secret = "SEKRET_APLIKACJI";

    require('include/fb/facebook.php');

    $facebook = new Facebook(array(
      'appId'  => $app_id,
      'secret' => $app_secret,
      'cookie' => true,
    ));

       try
          {
          $me = $facebook->api('/me');
          }
       catch (FacebookApiException $e)
          {
          error_log($e);
          }

       if ($me)
          {
          $my_url = "http://pepesz.pl/test.php";
          
          session_start();
          

          if (!isset($_REQUEST['code']))
             {
             $_SESSION['state'] = md5(uniqid(rand(), TRUE));
       
             $dialog_url = 'https://www.facebook.com/dialog/oauth?'.
                         'client_id='.$app_id.
                         '&redirect_uri='.urlencode($my_url).
                         '&scope=publish_stream'.
                         '&state='.$_SESSION['state'];
                         
             echo '<script> window.location.href = "'.$dialog_url.'"; </script>';
             exit();
             }

          if (($_SESSION['state']) && ($_SESSION['state'] === $_REQUEST['state']))
             {
             $code = $_REQUEST['code'];
             $token_url = 'https://graph.facebook.com/oauth/access_token?'.
                            'client_id='.$app_id.
                            '&redirect_uri='.urlencode($my_url).
                            '&client_secret='.$app_secret.
                            '&code='.$code;
       
             $response = file_get_contents($token_url);
             $params = null;
             parse_str($response, $params);

             // 2 PONIŻSZE LINIE POBIERAJĄ INFO O UŻYTKOWNIKU - MOŻNA ODKOMENTOWAĆ
             //$graph_url = "https://graph.facebook.com/me?access_token=".$params['access_token'];
             //$user = json_decode(file_get_contents($graph_url));
             
             echo $params['access_token'];
             }
          else
             {
             echo 'The state does not match. You may be a victim of CSRF.';
             }
          }
       else
          {
          echo '<a href="'.$facebook->getLoginUrl(array('scope' => 'publish_stream,offline_access')).'">ZALOGUJ SIĘ PRZEZ FACEBOOKA</a>';
          }
    ?>

0

Przede wszystkim proszę się na mnie nie denerwować że odświeżam stary temat, ale wyszukiwarka podpowiedziała mi tylko ten, a nowego tematu szkoda/nie warto publikować.
Powyższy kod z postu u mnie nie działa. Wyświetla się: "The state does not match. You may be a victim of CSRF".
Mój kod poniżej z sukcesem umieszcza post na mojej tablicy - fajnie... ale... Nie umiem podpiąć tego pod link zaloguj się i opublikuj . Wchodzę na stronę i od razu wyświetla się strona Facebooka z prośbą mojej aplikacji do akceptacji. A więc... Ktoś ma stronę. Klika w link, akceptuje poprzez Facebooka moją aplikację, ona postuje na jego tablicy i strona przeładowuje się z nową zawartością -np. tresc.html. Mam z tym problem. Jednakże zastanawia mnie inna kwestia samego rozwiązania tego kodu. Ten kodzik na Fb najpierw prosi mnie o uprawnienia do akceptacji mojej aplikacji a potem pyta o to czy użytkownik wyraża chęć opublikowania postu na jego tablicy (bez samej treści postu). Widziałem nie raz strony typu zaloguj aby zobaczyć zawartość i tak naprawdę to tam są wymienione w jednym okienku uprawnienia na które się zgadzamy np: lista zjnaomych, publikowanie postów itp... raz akceptujemy i spokój. Tu użytkownik może się jeszcze rozmyślić czy chce zapostować na swojej tablicy. Coś się zmieniło czy mój kod jest niewłaściwy? Szukałem na stronach zagranicznych, ale kody są tak różne że ciężko było mi coś posklejać, a siedzę całą noc.

<?php

require 'src/facebook.php';

define('FACEBOOK_APP_ID',"XXXXXXXXXX");
define('FACEBOOK_SECRET',"xxxxxxxxx");

$user = null;

$facebook = new Facebook(array(
    'appId' => FACEBOOK_APP_ID,
    'secret' => FACEBOOK_SECRET,
    'cookie' => true
));

$user = $facebook->getUser(); // Get the UID of the connected user, or 0 if the Facebook user is not connected.

if($user == 0) {

    /**
     * Get a Login URL for use with redirects. By default, full page redirect is
     * assumed. If you are using the generated URL with a window.open() call in
     * JavaScript, you can pass in display=popup as part of the $params.
     * 
     * The parameters:
     * - redirect_uri: the url to go to after a successful login
     * - scope: comma separated list of requested extended perms
     */

    $login_url = $facebook->getLoginUrl($params = array('scope' => "publish_stream"));

    echo ("<script> top.location.href='".$login_url."'</script>");

} else {

    try {
            $params = array(
                'message'       =>  "Hurray! This works :)",
                'name'          =>  "This is my title",
                'caption'       =>  "My Caption",
                'description'   =>  "Some Description...",
                'link'          =>  "http://www.strona.pl",
                'picture'       =>  "http://www.strona.pl/75x75.png",
            );

            $post = $facebook->api("/$user/feed","POST",$params);

            echo "Your post was successfully posted to UID: $user";

        }
        catch (FacebookApiException $e) {
           $result = $e->getResult();
        }

}

?>
0

Gubisz jakiś identyfikator, który powinieneś przesyłać. Nie wiem jaki, ale zacznij od lektury nt. czym jest CSRF - to pomoże Ci zabezpieczyć jeszcze wiele Twoich problemów w przyszłości i da jakieś światło na problem.
BTW: Wpisując treść tego błędu - jest mnóstwo wyników z Google. Nie wierzę, że żaden nie jest pomocny.

0

poczytam. w google są odpowiedzi w angielskim języku (to nie problem) ale niestety kody php różnią się na tyle że nie potrafię tego zrozumieć (słabo u mnie z programowaniem). jakby ktoś był chętny pomóc mi prywatnie to proszę o kontakt 506-080-449 . bo czuję że to dość skomplikowane. może nie tyle skomplikowane, co trzeba być na bieżąco z dokumentacją.

1 użytkowników online, w tym zalogowanych: 0, gości: 1