How do you get all the threads listed?
cyruskafaiwu opened this issue · 3 comments
How do you get all the threads listed?
I can't figure out the cursor.
Here's my code:
function listThreads($cursor,$incurrences) {
global $setting;
global $disqus;
$incurrences = $incurrences+1;
$params = array('forum' => $setting['disqus_forum'], 'order' => 'desc', 'limit' => 90);
if($cursor != 0) {
$params['cursor'] = $cursor;
}
echo $cursor.'
';
$i = 0;
$threads = $disqus->threads->list($params);
$cursor = $cursor+90;
foreach ($threads as $thread) {
$i = $i+1;
$id = $thread->id;
$title = $thread->title;
$link = $thread->link;
$date = date('Y-m-d H:i:s',strtotime($thread->createdAt."+0000"));
if(mysql_num_rows(mysql_query("SELECT * FROM disqus_threads
where thread_id
= '$id' and title
= '$title'")) == 0) {
$insert = mysql_query("INSERT INTO disqus_threads
(thread_id
,title
,link
,date
) VALUES ('$id','$title','$link','$date')") or die(mysql_error());
}
}
if($i == 90 && $incurrences != 2) {
$cursor = $cursor->next;
listThreads($cursor,$incurrences);
}
}
listThreads(0,0);
I'll share with you a snipet of the the way i use to get comments from Disqus in a symfony 2 project.
more documentation can be found here : http://disqus.com/api/docs/posts/list/
NB: I'm using Guzzle bundle (like cURL), the instance is '$this->client'
public function fetchComment($thread, $order, $cursor, $limit = 100)
{
$fetch = 'posts/list.json?{?forum, api_key, limit, order, cursor, thread}';
if ($order == 'popular') {
$fetch = 'posts/listPopular.json?{?order, forum, thread, api_key, limit}';
}
$request = $this->client->get(
array(
$this->baseUrl.$fetch,
array(
'api_key' => $this->apiKey,
'limit' => $limit,
'forum' => $this->shortname,
'thread' => $thread,
'cursor' => $cursor,
'order' => $order,
)
)
);
$response = $this->sendRequest($request);
if ($response['response'] !== false) {
foreach ($response['response'] as $key => $comment) {
$treeComments = array();
$this->buildTreeComment($response['response'], $treeComments);
}
$response['response'] = $treeComments;
}
return $response;
}
this is the function to build the tree comments (each answer message is under the first message it's related to)
protected function buildTreeComment(array &$comments, array &$treeComments, $currentParentId = 0)
{
$now = new \DateTime();
foreach ($comments as $key => $comment) {
$cmCreatedAt = new \DateTime($comment['createdAt']);
$interval = $cmCreatedAt->diff($now);
if (($diff = $interval->format('%y')) > 0 ) {
$typeDiff = $diff > 1 ? ' ans':' an';
} elseif (($diff = $interval->format('%m')) > 0) {
$typeDiff = 'mois';
} elseif (($diff = $interval->format('%a')) > 0) {
$typeDiff = $diff > 1 ? ' jours':' jour';
} elseif (($diff = $interval->format('%h')) > 0) {
$typeDiff = $diff > 1 ? ' heurs':' heur';
} elseif (($diff = $interval->format('%i')) > 0) {
$typeDiff = $diff > 1 ? ' minutes':' minute';
}
$comment['since'] = sprintf("Il ya %s %s", $diff, $typeDiff);
if ($comment['parent'] == $currentParentId) {
$comment['children'] = array();
$this->buildTreeComment($comments, $comment['children'], $comment['id']);
$treeComments[] = $comment;
}
}
}
hope it helps
Other solution is to modify the library:
instead of:
return $data->response;
use
return $data;
that way you will have access to cursor information see https://disqus.com/api/docs/cursors/
PS: their console is broken it send limit instead of cursor so you can't test if this work there.
after removing ->response I use this code to fetch all data.
function save($fname, $obj) {
$f = fopen($fname, 'w');
fwrite($f, json_encode($obj, JSON_PRETTY_PRINT));
fclose($f);
}
require('disqusapi/disqusapi.php');
$disqus = new DisqusAPI('<SECRET>');
function fetch($options, $fn, $cursor = NULL) {
if ($cursor != NULL) {
$payload = array_merge($options, array('cursor' => $cursor));
} else {
$payload = $options;
}
$res = $fn($payload);
$posts = $res->response;
if ($res->cursor->hasNext) {
$posts = array_merge($posts, fetch($options, $fn, $res->cursor->next));
}
return $posts;
}
$opts = array('forum' => '<name>'); // if you have lot of data use 'limit' => 100
save('posts.json', fetch($opts, function($payload) use ($disqus) {
return $disqus->posts->list($payload);
}));
save('threads.json', fetch($opts, function($payload) use ($disqus) {
return $disqus->threads->list($payload);
}));