Facebook在没有publish_stream权限的情况下发布到我的Page Wall

时间:2011-06-10 17:56:13

标签: php javascript facebook

我有一个网络应用程序,允许人们直接注册或通过Facebook注册插件使用他们的Facebook凭据。我希望能够将网站上发布的信息复制到我网站的Facebook粉丝页面。到目前为止,如果我有一个没有登录到Facebook的用户,它将发布到我的页面墙上没有问题显示它来自我的网站应用程序。但如果此人登录到Facebook,但尚未授予我的应用程序publish_stream权限,则会收到权限错误。无论如何,如果我没有与用户的适当许可,只是强迫帖子来自我的网站应用程序?如果我的Facebook页面上的每个帖子都来自应用程序而且从来没有来自用户,我会很高兴,但我找不到任何文档显示如何完成或甚至可以完成。

修改

以下是我正在使用的代码,如果此人未登录Facebook,我将发布到我自己的墙上。我已经授权该应用发布。

$attachment = array('message' => $notes,
                    'name' => 'Backcountryride.com',
                    'caption' => "Community Driven Transportation",
                    'link' => 'http://backcountryride.com',
                    'description' => $description,
                    'picture' => 'http://backcountryride.com/images/vanlogo.jpg'
                    );
    $result = $facebook->api('/backcountryride/feed/','post',$attachment);

EDIT2

这是我用来实例化$ facebook对象的代码:

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

$session = $facebook->getSession();

$me = null;
// Session based API call.
if ($session) {
  try {
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
  }
}

谢谢!

3 个答案:

答案 0 :(得分:3)

您要找的是“应用登录”。您可以为应用而不是用户获取会话。不容易找到,几周前我偶然发现了它。然后你只需使用你通常使用的功能,但使用“app”会话而不是“用户”会话。

https://developers.facebook.com/docs/authentication/#app-login

答案 1 :(得分:2)

这不再有效。去这里,https://stackoverflow.com/a/11102147/704647

因此,通过一些更多的研究,我能够拼凑出一个解决这个问题的方法。为了做到这一点,我需要使用图形API和传统REST API的组合。在授予我的应用程序发布到我的墙上的权限后,我使用以下代码将我的网站上的条目发布到我的墙上。

$url = "https://graph.facebook.com/oauth/access_token";
$client_id = "XXXXXXXXXXXXXX";
$client_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$postString = "client_id=$client_id&client_secret=$client_secret&type=client_cred";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postString);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
$token = curl_exec($curl);
curl_close($curl);

$message = rawurlencode($description.'. Notes:'.$notes);
$url = "https://api.facebook.com/method/stream.publish";
$postString = "message=$message&uid=XXXXXXXXXXXXX&$token";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postString);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
$response = curl_exec($curl);
curl_close($curl);

很少有值得注意的事情。 1.其余的api $ postString中的uid是你的facebook PAGE的uid。您不需要target_id,因为当uid是页面时,它只能发布到自身。 2.您的$ message必须是rawurlencoded,因为这是其余api接受的格式。 3.这将作为您的APP发布到您的页面,而不是发布到您网站的用户。要做到这一点,您需要拥有所有用户的publish_stream权限。或者使用ui对话框来获取每个帖子。如果您想要做的就是发布到您自己的OWN页面墙,那么这两个看起来都有点过分了。

由于我在很多地方都看到过这个问题的变化没有得到答复(我把这个答案发布在一个)我认为值得在这里发布这个答案。

如果您不确定如何授予您的应用程序访问Facebook页面墙的权限,请执行以下两步操作。我是从this post

得到的

我首先必须使用此网址授权离线访问(替换“MYAPIKEY”):http://www.facebook.com/login.php?api_key=MYAPIKEY&connect_display=popup&v=1.0&next=http://www.facebook.com/connect/login_success.html&cancel_url=http://www.facebook.com/connect/login_failure.html&fbconnect=true&return_session=true&session_key_only=true&req_perms=read_stream,publish_stream,offline_access

然后,我需要使用此网址向“PAGE”授予“publish_stream”权限(替换“MYAPIKEY”和“THEPAGEID”):http://www.facebook.com/connect/prompt_permissions.php?api_key=MYAPIKEY&v=1.0&next=http://www.facebook.com/connect/login_success.html?xxRESULTTOKENxx&display=popup&ext_perm=publish_stream&enable_profile_selector=1&profile_selector_ids=THEPAGEID

希望这有助于某人。

答案 2 :(得分:0)

我以前的解决方案不再有效,但确实如此,https://stackoverflow.com/a/11102147/704647