以管理员身份发布到 Facebook 页面
Posted
技术标签:
【中文标题】以管理员身份发布到 Facebook 页面【英文标题】:Post to facebook page as Admin 【发布时间】:2015-11-23 00:27:35 【问题描述】:我正在使用 Cordova facebook 插件以管理员身份在 Facebook 页面上发帖。
我拥有在 Facebook 页面上发布所需的所有权限。以下是我拥有的权限列表:
email, manage_pages, public_profile, publish_actions, publish_pages
我正在尝试使用我的应用在页面上发布,但每次发布时都使用用户令牌而不是页面令牌。
我试过的代码:
//给出用户管理的页面列表
$$('#apiTest_fb').on('click', function ()
facebookConnectPlugin.api( "me/accounts", ["manage_pages"],
function (response)
console.log(JSON.stringify(response.data[0].name))
//alert(JSON.stringify(response));
//fb_pages(response);
alert("Manage Pages Permission granted");
,
function (response)
console.log(JSON.stringify(response))
);
);
//用户页面的动态下拉
$$('#apiTest_fb_pages').on('click', function ()
facebookConnectPlugin.api( "me/accounts", ["manage_pages"],
function (response)
console.log(JSON.stringify(response.data[0].name))
//console.log(JSON.stringify(response));
//fb_pages(response);
var select = document.getElementById("selectPage");
for (var i = 0; i < response.data.length; i++)
var opt = response.data[i].name;
var page_val = response.data[i].id;
var el = document.createElement("option");
el.textContent = opt;
el.value = page_val;
select.appendChild(el);
,
function (response)
console.log(JSON.stringify(response.data.name))
);
);
//在选择过程中获取页面access_token
$$('#selectPage').on("change", function()
var selectPage_id = $$(this).val();
console.log(selectPage_id);
window.localStorage.setItem("selectPage_id",selectPage_id);
);
$$('#FBActionPage').on('click', function ()
facebookConnectPlugin.api( window.localStorage.getItem("selectPage_id") + "?fields=access_token", ['publish_pages', 'manage_pages'],
function (response)
var pageToken = JSON.stringify(response.access_token);
//window.localStorage.setItem("fbtokenPage",JSON.stringify(response.access_token));
post_fbPage(pageToken);
,
function (response)
console.log(JSON.stringify(response))
);
);
//发布到面子书
function post_fbPage(pageToken)
console.log(pageToken);
facebookConnectPlugin.getLoginStatus( function(response)
var url = '/'+ window.localStorage.getItem("selectPage_id") +'/feed?method=post&message=' + encodeURIComponent('Test') + '&link=' + 'impalz.co/JMR3a' + '&picture=' + 'www.impalz.com/images/affiliate-1.jpg' + '&caption=' + 'New Product' + '&description=' + 'we would love to know your feedback' +'&access_token=' + pageToken;
facebookConnectPlugin.api(
url,
['publish_pages', 'manage_pages'],
function (response) console.log(response.id),
function (error) console.error(error);
);
);
;
这是帖子的样子:
如何以管理员身份使用我的应用分享帖子?
编辑1:
我尝试在页面上发布时删除 publish_actions
并从用户选项卡中删除和添加应用程序,但它仍然使用用户令牌发布。我调试了我的 access_token 并获得了以下内容:
编辑2:
我尝试将我的令牌传递给facebook php SDK,并将其完美地贴在我的墙上。如何使用 PHP SDK 在 facebook 页面上发帖?
我已经尝试使用 PHP SDK 传递 page_token
和 page_id
在 fb 页面上发帖,但它不起作用。
我尝试在用户 Facebook 墙上发布的代码:
require_once('src/Facebook/autoload.php');
$token = $_POST["token"]; // Used AJAX to post data on server
$fb = new Facebook\Facebook([
'app_id' => 'ID',
'app_secret' => 'SECRET',
'default_graph_version' => 'v2.2',
'default_access_token' => $token,
]);
$linkData = [
'link' => 'http://www.example.com',
'message' => 'User provided message',
];
try
// Returns a `Facebook\FacebookResponse` object
$response = $fb->post('/me/feed', $linkData, $token);
catch(Facebook\Exceptions\FacebookResponseException $e)
echo 'Graph returned an error: ' . $e->getMessage();
exit;
catch(Facebook\Exceptions\FacebookSDKException $e)
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
$graphNode = $response->getGraphNode();
echo 'Posted with id: ' . $graphNode['id'];
【问题讨论】:
为什么不直接删除 publish_actions?不知道你为什么要添加它,你只需要 publish_pages 作为页面发布。将使调试更容易。 我尝试删除publish_actions
。但它仍然使用user_token
发布,即使我在发布时通过了page_token
。
在您的 Facebook 设置中删除该应用,然后重试。我确信 publish_actions 仍然被批准。我确定您使用的是用户令牌,我猜 sdk 只是添加了用户令牌并忽略了您自己的令牌参数。
我就是这么想的。仍然不确定如何传递页面令牌。我已经尝试删除应用选项
也许插件会自动将用户访问令牌添加到发出的每个请求或其他东西……去检查文档和/或源代码,看看是否有明确的选项来传递不同的访问令牌,跨度>
【参考方案1】:
你可以为你的fan page 设置一个永不过期的令牌,我想这会解决你的问题。
按照简单的步骤:
获取管理员(即您的)扩展令牌(有效期为 2 个月)。走 通过获取long-lived token
的链接。
Extending tokens
使用此令牌为任何页面获取永不过期的访问令牌
facebook->api("/PAGE_ID?fields=access_token");
(您可以使用Facebook's Debug Tool来检查令牌的有效性)。
以管理员身份发帖很容易,但以主页身份发帖需要您做更多的工作。要作为主页发布,我们需要以下权限:
publish_stream
manage_pages
我们需要manage_pages
权限来获取页面访问令牌,以便我们可以代表它发布。我们就是这样做的:
<?php
// This code is just a snippet of the example.php script
// from the PHP-SDK <https://github.com/facebook/facebook-php-sdk/blob/master/examples/example.php>
require '../src/facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => 'app_id',
'secret' => 'app_secret',
));
// Get User ID
$user = $facebook->getUser();
if ($user)
try
$page_id = 'page_id';
$page_info = $facebook->api("/$page_id?fields=access_token");
if( !empty($page_info['access_token']) )
$args = array(
'access_token' => $page_info['access_token'],
'message' => "I'm a Page!"
);
$post_id = $facebook->api("/$page_id/feed","post",$args);
else
$permissions = $facebook->api("/me/permissions");
if( !array_key_exists('publish_stream', $permissions['data'][0]) ||
!array_key_exists('manage_pages', $permissions['data'][0]))
// We don't have one of the permissions
// Alert the admin or ask for the permission!
header( "Location: " . $facebook->getLoginUrl(array("scope" => "publish_stream, manage_pages")) );
catch (FacebookApiException $e)
error_log($e);
$user = null;
// Login or logout url will be needed depending on current user state.
if ($user)
$logoutUrl = $facebook->getLogoutUrl();
else
$loginUrl = $facebook->getLoginUrl(array('scope'=>'manage_pages,publish_stream'));
// ... rest of your code
?>
使用 Javascript-SDK 仅使用客户端技术即可实现相同目标:
function postToPage()
var page_id = '000000000000';
FB.api('/' + page_id, fields: 'access_token', function(resp)
if(resp.access_token)
FB.api('/' + page_id + '/feed',
'post',
message: "I'm a Page!", access_token: resp.access_token
,function(response)
console.log(response);
);
);
使用 /me/accounts 连接
如果您正在构建某种CMS,管理员想要选择其中一个页面来更新其状态,那么使用 /me/accounts 会更好,您可以列出页面并将其 access_token 保存在一个 API 中打电话。
$page_id = "XXXXXXXXX";
$page_access_token = "";
$result = $facebook->api("/me/accounts");
foreach($result["data"] as $page)
if($page["id"] == $page_id)
$page_access_token = $page["access_token"];
break;
if( !empty($page_access_token) )
$args = array(
'access_token' => $page_access_token,
'message' => "I'm a Page!"
);
$post_id = $facebook->api("/$page_id/feed","post",$args);
// sucess...
else
// couldn't find the page!
始终以主页而不是管理员的身份与您的主页粉丝交流,粉丝确实知道(并信任)您的主页(产品),但不一定是您!
【讨论】:
我已经尝试获取粉丝页面的扩展页面令牌并将其传递到 Facebook 页面上,但它仍然通过user_token
来发布。有问题我附上了extended_token的截图,它永不过期。在 PHP 中,我使用的是 facebook-php-sdk-v4,我猜这是稳定版本,你能帮我传递页面令牌并使用这个 v4 SDK 发布吗?
我也试过这个代码github.com/facebook/facebook-php-sdk-v4它在我的最后运行良好。起初设置有问题,但我使用此链接寻求帮助 developers.facebook.com/docs/php/gettingstarted/5.0.0 我希望您通过此链接。此处提供了完整的文档、安装说明和示例。以上是关于以管理员身份发布到 Facebook 页面的主要内容,如果未能解决你的问题,请参考以下文章
以用户身份将照片发布到 Facebook 粉丝页面。 iOS Facebook SDK 3.1
Spring 安全重定向到登录页面以获取经过身份验证的 url