【问题标题】:Facebook Graph Api - Posting to Fan Page as an AdminFacebook Graph Api - 以管理员身份发布到粉丝页面
【发布时间】:2011-04-07 08:39:56
【问题描述】:

我设置了一个脚本,允许用户将消息发布到 Facebook 上的粉丝页面。一切正常,但有一个小问题。

问题:

当帖子添加到页面提要时,它会显示发帖用户的个人帐户。 我希望它显示该页面的帐户(例如,当您是该页面的管理员时,它说它来自该页面)。我发帖时使用的帐户拥有该页面的管理员权限,但它仍显示为个人帖子。

HTTP POST

$url = "https://graph.facebook.com/PAGE_ID/feed";
$fields = array (
    'message' => urlencode('Hello World'),
    'access_token' => urlencode($access_token)
);

$fields_string = "";
foreach ($fields as $key => $value):
    $fields_string .= $key . '=' . $value . '&';
endforeach;
rtrim($fields_string, '&');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

$result = curl_exec($ch);
curl_close($ch);

【问题讨论】:

  • 您知道可以将数组传递给CURLOPT_POSTFIELDS吗?无需自己构建查询字符串和转义内容。 -- 哦,endforeach; 语法看起来很糟糕;x
  • 我当时没有,但我现在这样做了。 :)

标签: facebook facebook-graph-api


【解决方案1】:

据我所知,您只需在调用 stream.publish 时指定一个 uid(即页面 ​​ID)

编辑

看看impersonation

【讨论】:

  • 在使用 Graph API 时,我只能设置以下参数:消息、图片、链接、名称、标题、描述、来源。发件人的 ID 似乎没有选项。 developers.facebook.com/docs/reference/api/post
  • 我认为它从 access_token 获取用户 ID。但是因为我是该页面的管理员,所以我希望 Facebook 能够认识到这一点。不过好像没有。
  • 我确实尝试将页面 ID 指定为 UID,但没有任何反应。无论如何...从您的链接看来,我错过了 manage_pages 权限,所以我现在要试试。
  • 好的...我已授予 manage_pages 的权限,现在可以在帐户中查看我的页面。但是,它仍然像我从我的个人资料而不是管理员发表评论一样发布,在上面添加了我的代码。
【解决方案2】:

答案在于在FB:login 按钮上获得“manage_pages”权限,如下所示:

<fb:login-button perms="publish_stream,manage_pages" autologoutlink="true"></fb:login-button>`

当您获得这些权限后,您就可以获得登录用户作为管理员的所有页面的结构化列表。调用的 URL 是:

https://graph.facebook.com/me/accounts?access_token=YourAccessToken

我讨厌 Facebook 文档,但这里有一个包含一些信息的页面:https://developers.facebook.com/docs/reference/api/ 请参阅该页面上的“授权”和“页面登录”部分。

Jeff Gladnick 在 RIA Forge 上的 CFC 是一个很好的资源(供 Coldfusion 开发人员使用):http://facebookgraph.riaforge.org/

如果您愿意使用,我将以下 UDF 添加到 Jeff 的 CFC:

<cffunction name="getPageLogins" access="public" output="true" returntype="any" hint="gets a user's associated pages they manage so they can log in as that page and post">
    <cfset var profile = "" />
    <cfhttp url="https://graph.facebook.com/me/accounts?access_token=#getAccessToken()#" result="accounts" />
    <cfif IsJSON(accounts.filecontent)>
        <cfreturn DeserializeJSON(accounts.filecontent) />
    <cfelse>
        <cfreturn 0/>
    </cfif>
</cffunction>

返回的是登录用户是管理员的所有页面的结构。它返回页面 NAME、ID、ACCESS_TOKEN 和 CATEGORY(在此上下文中不需要)。

所以,非常重要: ID 是您传递的内容以设置您要发布到哪个页面,而 ACCESS_TOKEN 是您传递的内容以设置您发布的身份。

获得页面列表后,您可以解析数据以获取包含以下内容的三元素数组:

ID - ACCESS_TOKEN - 名称

不过要小心,因为 Facebook ACCESS_TOKEN 确实使用了一些奇怪的字符。 如果您需要任何其他帮助,请告诉我。

【讨论】:

    【解决方案3】:

    Graph API 期望将参数 page_id(粉丝页面的对象 ID)作为参数传递给 API 调用,以获取发布在粉丝页面墙上的事件。官方 Graph API 文档中没有提到任何地方,但它可以工作。我已经用官方 PHP SDK v3.0.1 测试成功了

    所需的应用程序权限是 create_eventma​​nage_pages

    示例如下所示:

    //Facebook/Fan Page Id
    $page_id = '18020xxxxxxxxxx';
    
    //Event Start Time
    $next_month = time() + (30 * 24 * 60 * 60);
    
    //Event Paramaeters
    $params = array(
        'page_id'     =>  $page_id, // **IMPORTANT**
        'name'        => 'Test Event Name',
        'description' => 'This is the test event description. Check out the link for more info: http://yoursite.com',
        'location'    => 'Kottayam, Kerala, India',
        'start_time'  =>  $next_month       
    );
    
    
    $create_event = $facebook->api("/$page_id/events", "post", $params);
    

    【讨论】:

      【解决方案4】:

      因为这是谷歌搜索结果中“facebook 图表不会作为页面发布到页面”的唯一相关帖子,所以我想记下我找到的解决方案。您需要具有 manage_pages 权限的访问令牌。然后调用

      https://graph.facebook.com/<user_id>/accounts?access_token=<access_token>
      

      这将列出用户有权访问的所有页面,并为每个页面提供访问令牌。然后,您可以使用这些令牌作为页面发布。

      【讨论】:

        【解决方案5】:

        要以页面而非用户的身份发布,您需要以下条件:
        权限:

        • publish_stream
        • manage_pages

        要求:

        • 页面id和access_token(上面已经获得了所需的权限就可以得到)
        • 要成为管理员的当前用户(能够检索页面的access_token
        • access_token 和其中一位管理员的long-lived expiration time,如果您想这样做离线(来自后台脚本)

        PHP-SDK 示例:

        <?php
        /**
         * Edit the Page ID you are targeting
         * And the message for your fans!
         */
        $page_id = 'PAGE_ID';
        $message = "I'm a Page!";
        
        
        /**
         * This code is just a snippet of the example.php script
         * from the PHP-SDK <http://github.com/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_info = $facebook->api("/$page_id?fields=access_token");
            if( !empty($page_info['access_token']) ) {
                $args = array(
                    'access_token'  => $page_info['access_token'],
                    'message'       => $message 
                );
                $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
        ?>
        

        这里 connected $user 应该是管理员。

        结果:

        更多信息请关注我的tutorial

        【讨论】:

        • 我似乎对这条线有问题$page_info = $facebook-&gt;api("/$page_id?fields=access_token"); 之后我放置的任何东西都没有执行。这行得通,但显然它不会发布为页面$page_info = $facebook-&gt;api("/me");
        • 谢谢,我一直在寻找一个像这样的简单工作代码。
        【解决方案6】:

        您必须检索用户管理的页面和应用程序的 access_tokens。

        可以通过 Graph API 调用 /{user_id}/accounts 来查询访问令牌。

        更多细节:

        https://developers.facebook.com/docs/facebook-login/permissions/v2.0 -> 参考 -> 页面

        【讨论】:

          【解决方案7】:

          这就是我使用 PHP SDK 4.0 和 Graph API 2.3 的方式:

          /**
           * Posts a message, link or link+message on the page feed as a page entity
           * 
           * @param FacebookSession $session (containing a page admin user access_token)
           * @param string $pageId
           * @param string $message - optional
           * @param string $link    - optional
           * 
           * @return GraphObject
           */
          function postPageAsPage( $session, $pageId, $message = '', $link = '' ){
          	
          	// get the page token to make the post request
          	$pageToken = ( new FacebookRequest( 
          			$session, 
          			'GET', 
          			"/$pageId" . "?fields=access_token"
          	))->execute()->getGraphObject();					
          	
          	return ( new FacebookRequest(
          			$session,
          			'POST',
          			"/$pageId/feed",
          			array(
          				'access_token' => $pageToken->getProperty( 'access_token' ),
          				'message'      => $message,
          				'link'         => $link,
          			)
          	))->execute()->getGraphObject();	
          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-29
            • 2011-12-23
            • 2015-11-23
            • 1970-01-01
            相关资源
            最近更新 更多