2012-01-11 1 views
1

팬 페이지의 모든 댓글을 가져와야합니다. 벽뿐만 아니라 앨범, 사진, 메모 등에서도 볼 수 있습니다.팬 페이지의 모든 댓글을 검색하는 방법

그런 식으로이 문제를 해결했습니다. 먼저 팬 페이지의 모든 대상 (앨범, 음표 등)을 가져옵니다. 두 번째로 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

어떤 사실 상태들 속도가 느려지거나 FQL 다중 쿼리 또는 객체 ID 검색이 느려 집니까? [Batch Requests] (http://developers.facebook.com/docs/reference/api/batch/)를 사용하여 객체 ID를 가져 옵니까? –

+0

개체 ID 검색은 매우 빠릅니다 (일괄 요청 덕분에). 그러나 FQL 쿼리가 너무 느립니다. 아마 그것은 100 개 이상의 대상과 200 개 이상의 게시물에 대해 수행되기 때문일 수 있습니다. – Oleg

+1

당신은 아마, 페이스 북은 천천히 너무 많은 소스에서 데이터를 얻을 필요가 맞습니다. 나는 지옥처럼 느린 단순한 SQL 쿼리를 많이 보았다. 어쩌면 당신은이 작업을 병렬로 실행할 수있는 몇 가지 쿼리를 분할하여 속도를 높일 수 있습니다 ... –

답변

0

나는 당신이 의견을 수집 할 수 있습니다 거기에서 https://graph.facebook.com/userid/feed이 .IT는 JSON 배열을 반환하는 사용자의 모든 피드를 얻기 위해, 아래의 그래프 API 방법을 사용할 수 있다고 생각, 등 등

+0

제 질문을 더 자세히 읽어주십시오. ** ** 페이지 ** (현재 사용자가 아님)의 ** 댓글 ** (게시물이 아님)에 대해 질문했습니다. – Oleg

+0

Noow facebook은 요청을하려면 액세스 토큰이 필요합니다. { "오류"{ "메시지"는 "액세스 토큰이 리소스를 요청할 필요가있다." "타입": "OAuthException" "코드"104 } 를} – B4NZ41