disqus / disqus-php

Disqus API bindings for PHP
http://disqus.com/api/
Apache License 2.0
149 stars 73 forks source link

How do you get all the threads listed? #17

Open cyruskafaiwu opened 11 years ago

cyruskafaiwu commented 11 years ago

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);
ghost commented 11 years ago

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

jcubic commented 5 years ago

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.

jcubic commented 5 years ago

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