2012-11-01 138 views
2

找了几个小时后,我无法找到这个问题的答案。希望有人能帮助我。我正在使用最新的Facebook PHP SDK(v.3.2.0)。张贴到脸书页面A作为其他脸书页面B用户

我有一家公司的粉丝页面(页面A),该公司的几个人也有粉丝页面(页面B,C,D等)。问题是我们希望将页面B(和C和D)的帖子张贴到页面A,但发件人(帖子用户)应该是页面用户B.

您可以发布到页面墙A作为另一个页面用户B?

我已经竭尽所能,并具有以下工作:

  • 我有一个管理员用户的访问令牌是所有网页的管理员
  • 我有一个扩展的访问令牌能够自动请求60天
  • 我有一个来自/我/帐户请求的所有页面的页面令牌
  • 我有一个所有页面的所有贴子通过/ [page-id] /饲料

最后一部分是循环阵列之上张贴到页A的壁作为用户B,C或D.

我发送POST请求到/ [页-ID-页-A] /有消息和网页B的页面令牌饲料的要求后,我得到一个错误:

未捕获OAuthException:(#200)的帖子,其中的演员是一个网页不能也包括target_id

发帖因为页面用户B到页面B的墙壁工作正常。作为页面用户B发布到页面A不会。文档不清楚,如果这应该工作,但从Facebook的UI这是可能的。

希望有人能指出我正确的方向。我使用的代码在任何想要使用它的人的下面。

<?php 
/* ************************ 
* Helper functions 
************************ */ 
function sortbykey($a, $b) { 
    return $a['time'] - $b['time']; 
} 

/* ************************ 
* Start app 
************************ */ 
// Initialize Facebook 
require_once("facebook.php"); 
$facebook = new Facebook(array('appId' => '<appID>','secret' => '<appSecret>')); 

// Get facebook user (if possible) 
$user_id = $facebook->getUser(); 

$login_params = array(
    'scope' => 'manage_pages,publish_stream', 
    'redirect_uri' => '<app_url>/index.php' 
); 
if($user_id) { 
    // We have a user ID, so probably a logged in user. 
    // If not, we'll get an exception, which we handle below. 
    try { 
    // Get user profile and extended access tokens for requests 
    $user_profile = $facebook->api('/me','GET'); 
    $facebook->setExtendedAccessToken(); 
    $access_token = $facebook->getAccessToken(); 
    } catch(FacebookApiException $e) { 
    // If the user is logged out, you can have a 
    // user ID even though the access token is invalid. 
    // In this case, we'll get an exception, so we'll 
    // just ask the user to login again here. 
    $login_url = $facebook->getLoginUrl($login_params); 
    echo '<div class="login"><a href="' . $login_url . '">login</a></div>'; 
    error_log($e->getType()); 
    error_log($e->getMessage()); 
    } 
} else { 
    // No user, print a link for the user to login 
    $login_url = $facebook->getLoginUrl($login_params); 
    echo '<div class="login"><a href="' . $login_url . '">login</a></div>'; 
} 

if(isset($access_token) && !empty($access_token)){ 
    // Provide logout options 
    $logout_url = $facebook->getLogoutUrl(); 
    echo '<div class="logout"><a href="' . $logout_url . '">logout</a></div>'; 

    // Get user pages and tokens 
    $user_pages = $facebook->api('/me/accounts','GET'); 
    $page_tokens = array(); 
    foreach($user_pages['data'] as $page){ 
    $page_tokens[$page['id']] = $page['access_token']; 
    } 

    // Set challenger ID's and page ID 
    $persons = array('page-ID-B','page-ID-C','page-ID-D'); 
    $page = 'page-ID-A'; 

    // Loop over persons and create stream of messages. 
    $messages = array(); 
    foreach($persons as $person){ 
    $token = $page_tokens[$person]; 
    $feed = $facebook->api('/'.$person.'/feed','GET'); 
    foreach($feed['data'] as $status){ 
     // Add page token to message to post as page and time to sort by 
     $status['token'] = $token; 
     $status['time'] = strtotime($status['created_time']); 
     // Only add messages that aren't imported yet 
     if($status['time'] > $_SESSION['lastupdatetime']) { 
     $messages[] = $status; 
     } 
    } 
    } 
    // Sort by time value in nested array 
    usort($messages,"sortbykey"); 

    // Post messages to timeline 
    foreach($messages as $status){ 

    // Post to MScHALLENGE page based on type 
    switch($status['type']){ 
     case 'status': 
     case 'link': 

     // Build post data 
     $data = array(); 
     if(isset($status['message'])) $data['message'] = $status['message']; 
     if(isset($status['link'])) $data['link'] = $status['link']; 
     // Post to facebook 
     if(!empty($data)){ 
      $data['access_token'] = $status['token']; 
      $post = $facebook->api('/'.$page.'/feed','POST',$data); 
     } 

     break; 

    } 

    // Save last update time 
    $_SESSION['lastupdatetime'] = $status['time']; 
    } 
} 
?> 

回答

1

这是不支持的,因为我最近做了一些测试。即使您是这两个 PageA和PageB的管理员,您也无法将PageA作为PageB(其中“voice”设置为PageB,并且该帖子显示为由PageB创作)。语音(即“由PageB创作”)在您管理的页面上工作,并使用属于相同页面的语音在页面上创建帖子。至少这就是API目前的行为。