Как получить все комментарии фан-страницы - PullRequest
1 голос
/ 11 января 2012

Мне нужно получить все комментарии фан-страницы.Не только со стены, но и из альбомов, фотографий, заметок и т. Д.

Я решил эту проблему таким образом.Сначала я получаю все объекты (альбомы, заметки и т. Д.) Фан-страницы.Во-вторых, я получаю комментарии к каждому объекту, используя несколько запросов 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;
    }

Это решение работает, но не очень быстро.Кто-нибудь знает лучшее решение?

1 Ответ

0 голосов
/ 18 января 2012

Я думаю, что вы можете использовать метод API графика, приведенный ниже, https://graph.facebook.com/userid/feed, чтобы получить все фиды пользователя. Он вернет массив json, оттуда вы сможете собирать комментарии, статусы и т. Д.

...