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;
    }

此解决方案有效,但速度不是很快。有谁知道更好的解决方案?

4

1 回答 1

0

我认为您可以使用下面给出的图形 API 方法, https://graph.facebook.com/userid/feed来获取用户的所有提要。它将返回一个 json 数组,您可以从那里收集评论、状态等等等等

于 2012-01-18T09:35:25.710 回答