ファンページのコメントをすべて取得する必要があります。壁だけでなく、アルバム、写真、メモなどから。ファンページのすべてのコメントを取得する方法
私はこのような方法でこの問題を解決しました。まず、ファンページのすべてのオブジェクト(アルバム、ノートなど)を取得します。第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;
}
このソリューションは機能しますが、かなり速くはありません。誰かがより良い解決を知っていますか?
などなどの状態、そこからあなたはコメントを収集することができ、.ITはJSON配列を返しますユーザーのすべてのフィードを取得するには https://graph.facebook.com/userid/feed、あなたは下記のグラフAPIメソッドを使用することができると思いますそれを遅くする、FQLのマルチクエリやオブジェクトIDを取得する? [Batch Requests](http://developers.facebook.com/docs/reference/api/batch/)を使用してオブジェクトIDを取得していますか? –
オブジェクトIDの取得は非常に高速です(バッチリクエストのおかげで)。しかし、FQLクエリは遅すぎます。たぶん、それは100以上のオブジェクトと200以上のポストのために実行されるためです。 – Oleg
あなたはおそらく、Facebookは遅すぎるたくさんのソースからデータを取得する必要があります。私は地獄のように遅くなる多くの単純なSQLクエリを見てきました。多分あなたはこのタスクを分割することによってスピードを上げることができます。並列に実行されるかもしれないいくつかのクエリです... –