API Facebook: как публиковать в фид страницы, когда пользователь находится в автономном режиме без разрешения offline_access - PullRequest
14 голосов
/ 06 марта 2011

Используя API Graph Facebook, я успешно опубликовал в фиде пользователя, пока пользователь находится в автономном режиме только с разрешением publish_stream.Мне не нужно разрешение offline_access.Я объяснил, как я это сделал здесь: Публикация в Facebook Stream в автономном режиме

Я не так успешно выполнил публикацию на странице, когда пользователь выключен.Вот мой сценарий:

Пользователь U - администратор страницы P. P авторизует и устанавливает мое приложение.U авторизует мое приложение и предоставляет мне следующие расширенные разрешения:

  • publish_stream
  • manage_pages

Если пользователь отключен, если я попробую ту же самую техникуЯ использую для публикации в потоке пользователя (без разрешения offline_access), чтобы вместо этого опубликовать на странице, я получаю «Пользователь не авторизовал приложение для выполнения этого действия».Вот техника:

1) получить access_token моего приложения

2) использовать access_token моего приложения для публикации в фиде страницы P: POST https://graph.facebook.com/{page_id}/feed

Если вместо {page_id} на шаге 2 я использую {user_id}, то он без проблем публикует в фиде пользователя.Тем не менее, я хотел бы опубликовать в фиде страницы.Можно ли сделать это?Или мне для этого нужно разрешение offline_access от пользователя?

Спасибо, Джонни

Ответы [ 3 ]

7 голосов
/ 08 марта 2011

Полный поток - четырехстраничный пример (проще для редактирования и понимания для примера)

Так что в конфиге просто есть основная информация о приложении ...

Когда вы загружаете index.php - он перенаправляет на Facebook, чтобы получить авторизацию для страницы .. (вероятно, уже есть это .. но охватывает все базы)

Facebook перенаправляет обратно на redirecturl (backfromfb.php) ...

Facebook возвращает маркер доступа в виде хэша, а не переменной get, поэтому эта страница обновляется хэшем в качестве переменной ...

Затем загружается PageUpdate.php, который обрабатывает циклы по токенам app / admin и находит правильный для страницы, которую вы хотите опубликовать ..

Затем он создает пост и отправляет его ..

Похоже, у вас есть понимание большей части этого ... Так что, надеюсь, это поможет вам с этим последним битом.

config.php

<?php
$config = array(
    'appId' => 'YOUR APP ID',
    'secret' => 'YOUR APP SECRET',
    'cookie' => true;
    );

$baseurl = 'http://yoursite.com/';
$returnpage = 'backfromfb.php';

require_once('library/facebook.php');

?>

index.php

<?php require_once('config.php'); ?>

<html><head><title>Redirecting for auth</title></head><body><script type="text/javascript">
            window.location.href = 'https://www.facebook.com/dialog/oauth?client_id=<?php echo $config['appId']; ?>&redirect_uri=<?php echo $baseurl . $returnpage; ?>&scope=manage_pages&response_type=token';
</script></body></html>

backfromfb.php

<?php
require_once('config.php');
// this page just passes the access token from the hash to a GET arg...
if (!isset($_GET['access_token'])) {
?>
<html><head><title>Redirecting</title></head><body><script type="text/javascript">
            accessToken = window.location.hash.substring(1);
            window.location.href = '<?php echo $baseurl . $returnpage; ?>?' + accessToken;
</script></body></html>
<?php
} else {
require_once('PageUpdate.php');
} ?>

PageUpdate.php

<?php
require_once('config.php');

$pageID = "123456 WHatever you page id is";

$AppToken = array(
    'access_token' =>  $_REQUEST['acess_token']
);

$fb = new Facebook($config);

// Load APP page access rights for user via AppToken
$pageAdmin = $fb->api('/me/accounts', 'GET', $AppToken);

// Find the page access token
foreach ($pageAdmin['data'] as $data) {
    if ($data['id'] == $pageID) {
        $pageToken['access_token'] = $data['access_token'];
        continue;
    }
}

// compile the post
$WallPost = array(
    'message' => 'Test post from my app!'
);  // you can also use 'picture', 'link', 'name', 'caption', 'description', 'source'.... 
    //http://developers.facebook.com/docs/reference/api/


// post to wall
$response = $fb->api($pageID . '/feed','POST',$WallPost);

if($response) {

    echo 'Success!';
    echo '' . $response . '
'; } иначе эхо "не удалось"; ?>
2 голосов
/ 08 марта 2011

Проблема в том, что вам нужно использовать токен доступа для страницы, предоставленной через полученные разрешения ...

Э-э ... Проще сказать, это так:

Ваше приложение запросило разрешение на "manage_pages" - как только вы примете / предоставите разрешение, у вас будет access_token для представления приложений (оффлайн просто сделает expires = 0)

Итак, теперь у вашего приложения есть возможность управлять вашими страницами, но ему нужен токен для конкретной страницы ...

Таким образом, если вы выдадите /me/accounts (или /UID/accounts) с первым токеном, вы получите список страниц, к которым у приложения есть права доступа, и соответствующие токены ...

Оттуда просто возьмите токен страницы и затем введите команду с этим токеном

Использование класса facebook (facebook.php и файл сертификата)

require_once 'library/facebook.php';

$app_id = "YOURAPPID";
$app_secret = "YOURSECRET";

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

$token =  array(
    'access_token' => 'THE Token from app / manage_page auth'
);

$userdata = $facebook->api('/me/accounts', 'GET', $token);

echo ';
print_r($userdata);
echo '
';

Вы должны увидеть список идентификаторов страниц и их токены доступа ...

Обычно я делаю foreach $userdata['data'] и ищу идентификатор страницы, затем беру токен из этого подмассива ...

1 голос
/ 29 июня 2012

Это мой ответ. Выше код не работает для меня. Но я сделал один для себя, это прекрасно работает. Вот код.

Код для серверной части:

<?php
@session_start();
require "fblib/facebook.php";
define('YOUR_APP_ID','');
define('YOUR_APP_SECRET','');
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

if($_SESSION['access_token']!='') {
    $access_token = $_SESSION['access_token'];
$user_id = $_SESSION['user_id'];
} else {
    $access_token = $_REQUEST['access_token'];
    $_SESSION['access_token'] = $_REQUEST['access_token'];
    $user_id = $_REQUEST['user_id'];
    $_SESSION['user_id'] = $_REQUEST['user_id'];
}

$user_id = $_REQUEST['user_id'];

$facebook->setAccessToken($_REQUEST['access_token']);

$post =  array(
    'message' => 'This message is posted with access token - ' . date('Y-m-d H:i:s')
);

// and make the request
$response = $facebook->api('/me/feed', 'POST', $post);
?>

Код для клиентской стороны:

<?php
require "fblib/facebook.php";
define('YOUR_APP_ID','387647494631464');
define('YOUR_APP_SECRET','857f41bdd23c26ae132a1c75a343ddc9');
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();
if ($user) {
    try {
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        // The access token we have is not valid
        $user = null;
    }
}
?>
<div id="fb-root"></div>
<script language="javascript" src="js/jquery-1.7.2.min.js"></script> 
<script>
    var accessToken;
    var uid;
    // Load the SDK Asynchronously
    (function(d){
        var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
        if (d.getElementById(id)) {
            return;
        }
        js = d.createElement('script'); 
        js.id = id; 
        js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        ref.parentNode.insertBefore(js, ref);
    }(document));

    // Init the SDK upon load
    window.fbAsyncInit = function() {
        FB.init({
            appId      : '', // App ID
            channelUrl : '//'+window.location.hostname+'/channel', // Path to your Channel File
            status     : true, // check login status
            cookie     : true, // enable cookies to allow the server to access the session
            xfbml      : true  // parse XFBML
        });

        // listen for and handle auth.statusChange events
        FB.Event.subscribe('auth.statusChange', function(response) {
            if (response.authResponse) {
                // user has auth'd your app and is logged into Facebook
                FB.api('/me', function(me) {
                    if (me.name) {
                        //   document.getElementById('auth-displayname').innerHTML = me.name;
                        accessToken = response.authResponse.accessToken;
                        uid = response.authResponse.userID;
                    }
                })
                //  document.getElementById('auth-loggedout').style.display = 'none';
                //  document.getElementById('auth-loggedin').style.display = 'block';
            } else {
                // user has not auth'd your app, or is not logged into Facebook
                // document.getElementById('auth-loggedout').style.display = 'block';
                // document.getElementById('auth-loggedin').style.display = 'none';
            }
        });

        // respond to clicks on the login and logout links
        document.getElementById('auth-loginlink').addEventListener('click', function() {
            // FB.login();
            FB.login(function(response) {
                // handle the response
            }, {scope: 'offline_access,publish_stream'});
        });
    }

    function gettoken() {
        //  alert("User Token :"+accessToken+", User id :"+uid);          
        $.post('fbpost.php',{access_token:accessToken,user_id:uid},function(data) {
            //  alert(data);
        });
    }
</script>
<?php if (!$user): ?>
    <a href="Javascript:void(0)" id="auth-loginlink">Login with Facebook</a>
<?php else: ?>
    <a href="Javascript:void(0)" id="auth-logoutlink" onClick="FB.logout()" >Logout from Facebook</a>
<?php endif ?>
<a href="Javascript:void(0)"  onclick="gettoken()" >Post Into Wall</a>

Пожалуйста, отключите "Удалить разрешение offline_access:" из настроек приложения fb. выбрав отключить переключатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...