2012-01-11 9 views
1

ファンページのコメントをすべて取得する必要があります。壁だけでなく、アルバム、写真、メモなどから。ファンページのすべてのコメントを取得する方法

私はこのような方法でこの問題を解決しました。まず、ファンページのすべてのオブジェクト(アルバム、ノートなど)を取得します。第2に、FQLマルチクエリを使用して、各オブジェクトにコミットを取得します。

// Import comment list 
    $facebook = \Yii::app()->facebook->setUserAccessToken(); 
    $commentsColumns = array(
     'xid', 'object_id', 'post_id', 'fromid', 'time', 'text', 'username', 
     'reply_xid', 'post_fbid', 'app_id', 'likes', 'comments', 'user_likes', 
     'is_private', 'id', 
    ); 
    $offset = 0; 
    $limit = 30; 
    while (($offset <= count($objectIdList)) && ($offset <= count($postIdList))) { 
     $currentObjectIdList = array_slice($objectIdList, $offset, $limit); 
     $currentPostIdList = array_slice($postIdList, $offset, $limit); 
     $multiQuery = array(
      'comments' => 
       ' SELECT '.implode(', ', $commentsColumns).' '. 
       ' FROM comment '. 
       ' WHERE ((object_id IN ('.implode(',', $currentObjectIdList).')) '. 
       ' OR (post_id IN ('.implode(',', $currentPostIdList).'))) '. 
       ' AND (time >= ' . $lastCommentTime . ') ' . 
       ' ORDER BY time DESC '. 
       ' LIMIT 1000 ', 
      'users' => 
       ' SELECT uid, name ' . 
       ' FROM user ' . 
       ' WHERE uid IN (SELECT fromid FROM #comments) ', 
      'pages' => 
       ' SELECT page_id, name ' . 
       ' FROM page ' . 
       ' WHERE page_id IN (SELECT fromid FROM #comments) ' 
     ); 
     $multiQueryResult = $facebook->api(array(
      'method' => 'fql.multiquery', 
      'queries' => $multiQuery 
     )); 

     // Parse multi query results 
     $from = array(); 
     foreach ($multiQueryResult as $result) { 
      switch ($result['name']) { 
       case 'comments': 
        $commentList = $result['fql_result_set']; 
        break; 
       case 'users': 
       case 'pages': 
        foreach ($result['fql_result_set'] as $set) { 
         switch ($result['name']) { 
          case 'users': 
           $from[$set['uid']] = $set['name']; 
           break; 
          case 'pages': 
           $from[$set['page_id']] = $set['name']; 
           break; 
         } 
        } 
        break; 
      } 
     } 

     // Save comments to local DB 
     foreach ($commentList as $commentData) { 
      $comment = new Comment(); 
      $comment->fbId   = $commentData['id']; 
      $comment->fbPageId  = $this->fbId; 
      $comment->from   = array(
       'id' => $commentData['fromid'], 
       'name' => isset($from[$commentData['fromid']]) ? $from[$commentData['fromid']] : null, 
      ); 
      $comment->message  = $commentData['text']; 
      $comment->created_time = $commentData['time']; 
      $comment->likes   = $commentData['likes']; 
      $comment->save(); 
     } 

     // Next step 
     $offset = $offset + $limit; 
    } 

このソリューションは機能しますが、かなり速くはありません。誰かがより良い解決を知っていますか?

+0

などなどの状態、そこからあなたはコメントを収集することができ、.ITはJSON配列を返しますユーザーのすべてのフィードを取得するには https://graph.facebook.com/userid/feed、あなたは下記のグラフAPIメソッドを使用することができると思いますそれを遅くする、FQLのマルチクエリやオブジェクトIDを取得する? [Batch Requests](http://developers.facebook.com/docs/reference/api/batch/)を使用してオブジェクトIDを取得していますか? –

+0

オブジェクトIDの取得は非常に高速です(バッチリクエストのおかげで)。しかし、FQLクエリは遅すぎます。たぶん、それは100以上のオブジェクトと200以上のポストのために実行されるためです。 – Oleg

+1

あなたはおそらく、Facebookは遅すぎるたくさんのソースからデータを取得する必要があります。私は地獄のように遅くなる多くの単純なSQLクエリを見てきました。多分あなたはこのタスクを分割することによってスピードを上げることができます。並列に実行されるかもしれないいくつかのクエリです... –

答えて

0

私は実際にどのような

+0

私の質問をもっと慎重に読んでください。私は**ページ**(現在のユーザーではない)の**コメント**(投稿ではない)について尋ねました。 – Oleg

+0

Noowのfacebookはリクエストを行うためにアクセストークンが必要です。 { "エラー":{ "メッセージ": "アクセストークンはこのリソースを要求する必要がある。"、 "タイプ": "OAuthException"、 "コード":104 }} – B4NZ41

関連する問題