Javascript 以管理员身份发布到facebook页面

Javascript 以管理员身份发布到facebook页面,javascript,php,facebook,cordova,facebook-graph-api,Javascript,Php,Facebook,Cordova,Facebook Graph Api,我正在使用Cordova插件在facebook页面上以管理员的身份发布 我拥有在facebook页面上发布所需的所有权限。以下是我拥有的权限列表: 电子邮件、管理页面、公共配置文件、发布操作、发布页面 我正在尝试使用我的应用程序在页面上发布,但每次它都使用用户令牌而不是页面令牌发布 我试过的代码: //提供用户管理的页面列表 $$('#apiTest_fb').on('click', function () { facebookConnectPlugin.api(

我正在使用Cordova插件在facebook页面上以管理员的身份发布

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

电子邮件、管理页面、公共配置文件、发布操作、发布页面

我正在尝试使用我的应用程序在页面上发布,但每次它都使用用户令牌而不是页面令牌发布

我试过的代码:

//提供用户管理的页面列表

$$('#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))
                    }); 
            });
//贴面书

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); }
                        );
                    });
            };
这就是post的样子:

如何使用我的应用程序以管理员身份共享帖子

编辑1:

在页面上发布时,我尝试删除
publish\u操作
并从用户选项卡中删除和添加应用程序,但它仍然使用用户令牌发布。我调试了我的access_令牌和以下内容:

编辑2:

我试着把我的代币传给我,并把它贴在我的墙上。如何使用PHPSDK在facebook页面上发布

我已经尝试过使用PHPSDK将
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'];

你可以有一个永不过期的代币,我想这会解决你的问题

按照以下简单步骤操作:

  • 获得管理员(即您的)延长令牌(2个月有效期)。去 通过链接获取
    长寿命令牌

  • 使用此令牌获取任何页面的永不过期访问令牌

    facebook->api(“/PAGE\u ID?fields=access\u token”)

(您可以使用来检查令牌的有效性)

作为管理员发布很容易,但作为页面发布需要您做更多的工作。要发布为页面,我们需要以下权限:

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
?>
使用/me/accounts连接

如果您正在构建某种类型的应用程序,管理员希望选择其中一个页面来更新其状态,那么使用/me/accounts更好,您可以列出这些页面并在一个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!
}

始终以页面而非管理员的身份与您的页面粉丝交流,粉丝知道(并信任)您的页面(产品),但不需要您

为什么不删除发布操作?不确定为什么要添加它,您只需要发布页面以发布为页面。将使调试更容易。我尝试删除
publish\u操作
。但它仍然使用
user\u-token
发布,即使我在发布时通过了
page\u-token
。请在facebook设置中删除该应用,然后重试。我确信发布行动仍然得到批准。我确信您使用的是用户令牌,我猜sdk只是添加了用户令牌,而忽略了您自己的令牌参数。这就是我所想的。仍然不确定如何传递页面令牌。我已经尝试删除应用程序选项可能插件会自动将用户访问令牌添加到每个请求或其他内容中…检查文档和/或源代码,看看是否有明确的选项可以传递不同的访问令牌,我已经尝试为粉丝页面获取扩展页面令牌,并将其传递到facebook页面上的帖子,但它仍然将
user\u token
传递给post。在这个问题上,我附上了永远不会过期的extended_token的截图。在我使用的PHP中,我想这是一个稳定的版本,你能帮助我使用这个v4 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);
            });
        }
    });
}
$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!
}