Как получить все комментарии от Disqus?

Я хочу получить все комментарии на CNN, чья система комментариев — Disqus. Например, http://edition.cnn.com/2013/02/25/tech/innovation/google-glass-privacy-andrew-keen/index.html?hpt=hp_c1

Система комментариев требует, чтобы мы нажали «загрузить еще», чтобы увидеть больше комментариев. Я пытался использовать php для анализа html, но не смог загрузить все комментарии, так как используется javascript. Поэтому мне интересно, есть ли у кого-нибудь более удобный способ получить все комментарии с определенного URL-адреса cnn.

Кто-нибудь сделал это успешно? заранее спасибо


person Kenneth Yang    schedule 26.02.2013    source источник


Ответы (3)


API Disqus содержит метод разбиения на страницы с использованием курсоров, которые возвращаются в ответе JSON. Информацию о курсорах см. здесь: http://disqus.com/api/docs/cursors/

Поскольку вы упомянули PHP, что-то вроде этого должно помочь вам начать:

<?php
$apikey = '<your key here>'; // get keys at http://disqus.com/api/ — can be public or secret for this endpoint
$shortname = '<the disqus forum shortname>'; // defined in the var disqus_shortname = '...';
$thread = 'link:<URL of thread>'; // IMPORTANT the URL that you're viewing isn't necessarily the one stored with the thread of comments
//$thread = 'ident:<identifier of thread>'; Use this if 'link:' has no results. Defined in 'var disqus_identifier = '...';
$limit = '100'; // max is 100 for this endpoint. 25 is default

$endpoint = 'https://disqus.com/api/3.0/threads/listPosts.json?api_key='.$apikey.'&forum='.$shortname.'&limit='.$limit.'&cursor='.$cursor;

$j=0;
listcomments($endpoint,$cursor,$j);

function listcomments($endpoint,$cursor,$j) {

    // Standard CURL
    $session = curl_init($endpoint.$cursor);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, 1); // instead of just returning true on success, return the result on success
    $data = curl_exec($session);
    curl_close($session);

    // Decode JSON data
    $results = json_decode($data);
    if ($results === NULL) die('Error parsing json');

    // Comment response
    $comments = $results->response;

    // Cursor for pagination
    $cursor = $results->cursor;

    $i=0;
    foreach ($comments as $comment) {
        $name = $comment->author->name;
        $comment = $comment->message;
        $created = $comment->createdAt;
        // Get more data...

        echo "<p>".$name." wrote:<br/>";
        echo $comment."<br/>";
        echo $created."</p>";
        $i++;
    }

    // cursor through until today
    if ($i == 100) {
        $cursor = $cursor->next;
        $i = 0;
        listcomments($endpoint,$cursor);
        /* uncomment to only run $j number of iterations
        $j++;
        if ($j < 10) {
            listcomments($endpoint,$cursor,$j);
        }*/
    }
}

?>
person Ryan V    schedule 26.02.2013
comment
Большое спасибо!!! Но что нам нужно именно для $thread (URL потока) и $cursor? Кстати, у нас может быть максимум 100 комментариев?? - person Kenneth Yang; 26.02.2013
comment
URL темы — это просто URL страницы, на которой находятся комментарии. В данном случае это cnn.com/2013/02/25/tech/innovation/ — значение курсора извлекается из ответа API и представляет собой следующий набор из 100 комментариев. Скрипт будет работать до тех пор, пока не останется комментариев. - person Ryan V; 27.02.2013
comment
Я установил $shortname как 'cnn' (var disqus_shortname = 'cnn';) и $thread как 'link:‹edition.cnn.com/2013/02/25/tech/mobile/›' и оставил $cursor пустым, но это получается Error parsing json. Я что-то пропустил?? - person Kenneth Yang; 27.02.2013
comment
Также я попытался установить $thread как $thread = 'ident:‹/2013/02/25/tech/mobile/mobile-virtual-reality-android/index.html›'; (показано в исходном коде html CNN), но это не сработало. - person Kenneth Yang; 27.02.2013
comment
Удалите скобки ‹›, они были только заполнителями. Кроме того, ссылки должны быть полными URL-адресами с частью «http://». - person Ryan V; 27.02.2013

Просто дополнение: чтобы получить URL-адрес комментариев disqus на любой найденной странице, запустите этот код JavaScript в консоли веб-браузера:

var visit = function () {
var url = document.querySelector('div#disqus_thread iframe').src;

String.prototype.startsWith = function (check) {
    return(this.indexOf(check) == 0);
};

if (!url.startsWith('https://')) return url.slice(0, 4) + "s" + url.slice(4);

return url;
}();

Поскольку переменная теперь находится в «посещении»

console.log(visit);
person iChux    schedule 10.12.2014

без апи:

#disqus_thread {
  position: relative;
  height: 300px;
  background-color: #fff;
  overflow: hidden;
}
#disqus_thread:after {
  content: "";
  display: block;
  height: 10px;
  width: 100%;
  position: absolute;
  bottom: 0;
  background: white;
}
#disqus_thread.loaded {
  height: auto;
}
#disqus_thread.loaded:after{
    height:55px;
}
#disqus-load {
  text-align: center;
  color: #fff;
  padding: 11px 14px;
  font-size: 13px;
  font-weight: 500;
  display: block;
  text-align: center;
  border: none;
  background: rgba(29,47,58,.6);
  line-height: 1.1;
  border-radius: 3px;
  font-weight: 500;
  transition: background .2s;
  text-shadow: none;
  cursor:pointer;
}

<div class="disqus-comments">
    <div id='disqus_thread'></div>
    <div id='disqus-load'>Load comments</div>
</div>

<script type="text/javascript">


 $(document).ready(function() {
    var disqus_shortname = 'testare-123';

    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
        $('#disqus-load').on('click', function(){ 

        $.ajax({
            type: "GET",
            url: "http://" + disqus_shortname + ".disqus.com/embed.js",
            dataType: "script",
            cache: true
        });

        $(this).fadeOut();
        $('#disqus_thread').addClass('loaded');
    });
});
    /* * * CONFIGURATION VARIABLES * * */
    // var disqus_shortname = 'testare-123';

    // /* * * DON'T EDIT BELOW THIS LINE * * */
    // (function() {
    //  var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
    //  dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
    //  (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    // })();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
person Andreea Tirgovatu    schedule 28.05.2015