Facebook API:如何在没有offline_access权限的情况下在用户离线时发布到页面Feed

Joh*_*ika 14 facebook facebook-graph-api

使用Facebook的Graph API,我成功地在用户离线时发布到用户的Feed,只有publish_stream权限.我不需要offline_access权限.我在这里解释了我是如何做到的:Facebook Stream在离线时发布

当用户离开时,我没有成功发布到页面.这是我的情景:

用户U是Page P. P的管理员,授权并安装我的应用程序.U授权我的应用程序并授予我以下扩展权限:

  • publish_stream
  • manage_pages

一旦用户离线,如果我尝试使用相同的技术发布到用户的流(没有offline_access权限)而是发布到页面,我得到"用户没有授权应用程序执行此操作".这是技术:

1)获取我的应用程序的access_token

2)使用我的应用程序的access_token发布到Page P的提要: POST https://graph.facebook.com/ {page_id}/feed

如果在步骤2中使用{user_id}代替{page_id},那么它会毫无问题地发布到用户的Feed.但是,我想发布到Page的Feed.是否有可能做到这一点?或者我是否需要用户的offline_access权限才能执行此操作?

谢谢,约翰尼

Car*_*mDC 7

全流程 - 四页示例(更容易编辑和理解示例)

所以配置只有基本的应用信息......

当你加载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');

?>
Run Code Online (Sandbox Code Playgroud)

的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>
Run Code Online (Sandbox Code Playgroud)

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');
} ?>
Run Code Online (Sandbox Code Playgroud)

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 '<pre>' . $response . '</pre>';

} else echo "failed";


?>
Run Code Online (Sandbox Code Playgroud)


Car*_*mDC 2

问题是您需要使用通过获得的权限提供的页面的访问令牌......

呃...更简单的说法是这样的:

您的应用程序请求“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 '<pre'>;
print_r($userdata);
echo '</pre>';
Run Code Online (Sandbox Code Playgroud)

您应该看到页面 id 及其访问令牌的列表...

通常我会foreach $userdata['data']查找页面 id,然后从该子数组中获取令牌...