2015-08-28 76 views
12

我正在使用Cordova facebook插件以管理员身份登录Facebook页面。以管理员身份登录Facebook页面

我拥有需要在Facebook页面上发布的所有权限。以下是我有权限的列表:

email, manage_pages, public_profile, publish_actions, publish_pages

我试图使用后我的应用程序页面,但每次它与用户令牌,不与页面令牌发布。

代码我想:

//,带出的网页的用户的列表管理用户的网页

$$('#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)) 
        }); 
      }); 

//在选择合格的

$$('#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)) 
        }); 
      }); 

//动态下拉获得页面的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); } 
         ); 
        }); 
      }; 

这是怎么交的样子:

Screenshot

如何使用我的应用我分享信息的管理?

编辑1:

我试图消除publish_actions和删除,并从用户选项卡中添加应用程序,同时网页上发布,它仍然与发布用户令牌。我调试我和的access_token以下内容我:

Screen_Shot

编辑2:

我想通过我的令牌facebook PHP SDK和其张贴在墙上完美。我如何使用PHP SDK在Facebook页面上发布?

我已经尝试通过page_tokenpage_id使用PHP SDK在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']; 
+0

为什么不只是删除publish_actions?不确定为什么要添加它,您只需要publish_pages作为页面发布。会使调试更容易。 – luschn

+0

我试着删除'publish_actions'。但是,即使我在发布时传递了“page_token”,它仍然会使用'user_token'。 –

+0

删除您的Facebook设置中的应用程序,然后重试。我相信publish_actions仍然被批准。我相信你使用的是用户令牌,我猜测sdk只是添加了用户令牌并且忽略了你自己的令牌参数。 – luschn

回答

2

你可以有一个永远不会过期令牌您fan page,这将解决你的问题,我猜。

按照简单的步骤:

  • 获取管理员的扩展标记(2个月的有效期)(即你的)。去 虽然链接得到long-lived token

Extending tokens

  • 使用该令牌

    facebook-> API( “?/ PAGE_ID字段=的access_token”)获取任何页面从不到期访问令牌;

(您可以使用Facebook's Debug Tool来检查令牌的有效性)。

以管理员身份发帖很简单,但发布为Page需要您从侧面进行更多工作。要发布的页面,我们需要以下权限:

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 /账户连接

如果您正在创建某种CMS管理员想要选择其中一个页面来更新其状态,那么使用/我/帐户更好您可以列出页面并将其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! 
} 

始终与您的网页球迷沟通的页面不是管理员,球迷知道(和信任),您的页面(产品),但不是必需的你!

+0

我已经尝试为粉丝页面获取扩展页面标记并将它传递到Facebook页面上发布,但它仍然会传递'user_token'来发布。在问题中,我附上了从未到期的extended_token的屏幕截图。在PHP中,我使用[facebook-php-sdk-v4](https://github.com/facebook/facebook-php-sdk-v4),我猜是稳定版本,你能帮我传递页面令牌并发布使用这个v4 SDK? –

+0

我也试过这个代码https://github.com/facebook/facebook-php-sdk-v4它在我的最后工作得很好。起初在安装过程中有问题,但我用这个链接来获取帮助https://developers.facebook.com/docs/php/gettingstarted/5.0.0我希望你能通过这个链接。完整的文档,安装说明和示例可在此处获得。 –