2

何時間も探した後、この質問に対する答えが見つかりません。うまくいけば、誰かが私を助けてくれます。最新の facebook PHP SDK (v.3.2.0) を使用しています。

私は会社のファンページ (ページ A) を持っており、その会社の何人かはファンページ (ページ B、C、D など) も持っています。問題は、ページ B (および C と D) の投稿をページ A に投稿したいが、送信者 (投稿ユーザー) はページ ユーザー B でなければならないことです。

別のページ ユーザー B としてページ ウォール A に投稿できますか?

私はすべてを試しましたが、次のように動作しています:

  • すべてのページの管理者である管理者ユーザーのアクセス トークンを持っています
  • 60 日間自動的にリクエストを実行できる拡張アクセス トークンを持っています
  • /me/accounts リクエストからのすべてのページのページ トークンがあります。
  • /[page-id]/feed を介して、すべてのページのすべてのウォール投稿の配列があります

最後の部分は、配列をループして、ユーザー B、C、または D としてページ A のウォールに投稿します。

/[page-id-page-A]/feed にメッセージとページ B のページ トークンを含む POST リクエストを送信します。リクエストの後にエラーが発生します。

Uncaught 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'];
  }  
}
?>
4

1 に答える 1

1

最近いくつかのテストを行ったため、これはサポートされていません。PageA と PageB の両方の管理者であっても、PageA に PageB として投稿することはできません (「音声」が PageB に設定され、投稿が PageB によって作成されたものとして表示されます)。音声 (つまり、「ページ B によって作成された」) は、管理しているページで機能し、同じページに属する音声でページに投稿を作成します。少なくとも、API は現在そのように動作しています。

于 2012-11-01T21:50:35.943 に答える