Facebook: пост на странице как вопрос страницы (токен доступа / php) - PullRequest
1 голос
/ 30 января 2012

Я полностью разочарован своим первым проектом в Facebook. У меня серьезные проблемы с простой задачей.

Я хочу настроить на моем сервере задание cron (простое), которое будет публиковать что-то умное на странице facebook (не в моем профиле), и оно должно быть опубликовано как страница. Я закодировал себя в углу и теперь совершенно запутался ... Кто-нибудь может помочь, пожалуйста?

Я был почти во всех сообщениях об ошибках и теперь застрял на " OAuthException: Ошибка при проверке приложения. "

Вот что у меня сейчас:

Первый php -> Получает новый токен доступа для доступа к моей странице. Эта часть, кажется, работает нормально, когда я вызываю следующую страницу и получаю новый токен доступа.

<?php
require_once 'facebook.php';

$app_id = "1234....";
$app_secret = "5678....";
$my_url = "http://.../next.php";

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

// known valid access token stored in a database
$access_token = "abc....";

$code = $_REQUEST["code"];

// If we get a code, it means that we have re-authed the user
//and can get a valid access_token.
if (isset($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 . "&display=popup";
    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);
    $access_token = $params['access_token'];

}

// Attempt to query the graph:
$graph_url = "https://graph.facebook.com/me?"
    . "access_token=" . $access_token;
$response = curl_get_file_contents($graph_url);
$decoded_response = json_decode($response);

//Check for errors
if ($decoded_response->error) {
  // check to see if this is an oAuth error:
  if ($decoded_response->error->type== "OAuthException") {
      // Retrieving a valid access token.
      $dialog_url= "https://www.facebook.com/dialog/oauth?"
        . "client_id=" . $app_id
        . "&redirect_uri=" . urlencode($my_url);
      echo("<script> top.location.href='" . $dialog_url
      . "'</script>");
  } else {
      echo "other error has happened";
    }
} else {

  // success
    echo("success" . $decoded_response->name);

}

function curl_get_file_contents($URL) {
    $c = curl_init();
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_URL, $URL);
    $contents = curl_exec($c);
    $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
    curl_close($c);
    if ($contents) return $contents;
    else return FALSE;
}

?>

Далее php -> Прочитать токен доступа и опубликовать на стене. Я получаю токен доступа из строки запроса, но тогда почему я получаю сообщение об ошибке. Мой идентификатор, секрет и идентификатор страницы все в порядке ...

<?php
require_once 'facebook.php';

$app_id = "1234....";
$app_secret = "5678....";
$page_id = "0909....";

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

$access_token = $_GET['code'];
echo($access_token);

try {
    $attachment = array(
                'access_token' => $access_token,
                'message'=> "Hello World"
        );

    $result = $facebook->api('/'.$page_id.'/feed','POST',
$attachment);
    var_dump($result);

} catch(Exception $e) {
    echo $e;
}

?>

Я уверен, что есть более простой способ сделать это ... и способ действительно заставить это работать! Любая помощь приветствуется!

Я следовал этому сценарию Обновить статус страницы Facebook с самой этой страницы и это https://developers.facebook.com/blog/post/500

Спасибо.

Ответы [ 3 ]

6 голосов
/ 09 ноября 2012
// firstly include the fb sdk 

$facebook = new Facebook(array(
                'appId'  => 'your app id',
                'secret' => 'your app secret',`enter code here`
                'cookie' => true,

    ));


$session = $facebook->getUser();
    $loginUrl = $facebook->getLoginUrl(
                    array(
                        'scope' => 'user_status,publish_stream,email,user_location,user_birthday,friends_birthday,manage_pages',
                        'redirect_uri' => 'http://www.example.com/'
                    )
                );

    $logoutUrl = $facebook->getLogoutUrl(
                    array(
                        // any url u want to redirsct onto   
                        'redirect_uri' => 'http://www.example.com/'

                    )
                );

// when redirected from facebook get the code 
    $code = $_GET['code'];

// 

                                        $my_url     = 'http://www.example.com/';

                                        $app_id     = 'your app id ';
                                        $app_secret = 'your app secret ';
                                        // here we have the access token so we will play with it 
                                        if (isset($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);
                                                $user_access_token = $params['access_token'];
                                          }

// here we got the access token of user over here in $user_access_token
// now we will get for our page
//------ get PAGE access token
                                        $attachment_1 = array(
                                            'access_token' => $user_access_token
                                        );
                                        $page_id = 'your page id ';
                                        $result = $facebook->api("/me/accounts", $attachment_1);
                                            foreach($result["data"] as $page) {
                                                if($page["id"] == $page_id) {
                                                    $page_access_token = $page["access_token"];
                                                    break;
                                                }
                                            }

                                        //          write to page wall
                                        try {
                                            $attachment = array(
                                                        'access_token' => $page_access_token,
                                                        'message'=> 'hello world posting like admin!',
                                                        'page_id'=> $page_id
                                                );

                                             $result = $facebook->api('/'.$page_id.'/feed','POST',$attachment);
                                            //$result = $facebook->api('/me/feed','POST', $attachment);
                                            var_dump($result);

                                        } catch(Exception $e) {
                                            echo $e;
                                        }
1 голос
/ 01 февраля 2012

Похоже, из вашего кода вы не получаете токен доступа PAGE, который вам нужен, но вместо этого вы используете токен доступа USER, поэтому API это не нравится.Для получения дополнительной информации о том, как получить токен доступа PAGE от пользователя USER, см. Раздел Страница входа в https://developers.facebook.com/docs/authentication/

0 голосов
/ 13 февраля 2012

После многих часов проб и ошибок вот мое решение, которое работает до сих пор.

<?php

require_once 'facebook.php';

//------ vars
$app_id = "123...";
$app_secret = "abc..."; 
$page_id = "999...";
$my_url = "http://exactly the same as defined /";

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

//------ verification CODE
// this is not pretty -> the code should be received with a another graph query...
// but I couldn't get this to work. Thus I'm using my last known Verification Code
$code = "ABC123...";

//------ get USER access token
if (isset($code)) {
    $token_url="https://graph.facebook.com/oauth/access_token?client_id=" . $app_id 
        . "&client_secret=" . $app_secret 
        . "&code=" . $code 
        . "&redirect_uri=" . $my_url;

    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);
    $user_access_token = $params['access_token'];

} else {
    echo("No code");
}

//------ get PAGE access token
$attachment_1 = array(
    'access_token' => $user_access_token
);

$result = $facebook->api("/me/accounts", $attachment_1);
    foreach($result["data"] as $page) {
        if($page["id"] == $page_id) {
            $page_access_token = $page["access_token"];
            break;
        }
    }

//------ write to page wall
try {
    $attachment = array(
                'access_token' => $page_access_token,
                'message'=> 'hello world!'
        );

    $result = $facebook->api('/me/feed','POST', $attachment);
    var_dump($result);

} catch(Exception $e) {
    echo $e;
}

?>
...