博客园统计阅读量

前言

今天教大家如何统计博客园博客的阅读量。

效果图

侧边栏代码


<script id="worker" type="app/worker">
/**************** worker 任务线程 负责统计总阅读量 ********************/
    console.log("我是worker 任务线程 负责统计总阅读量..");
    //我的博客园地址名称,要是读取不到this.name,默认是我的博客名称
    var myCnblogsName = this.name ? this.name : "jichi";

    //监听主线程发送过来的数据
    //this.addEventListener('message', function (e) {
    //  this.postMessage('主线程发送过来的数据: ' + e.data);
    //}, false);

    //监听发送报错
    //this.addEventListener('messageerror ', function (e) {
    //  this.postMessage('发送数据到主线程报错: ' + e.data);
    //}, false);

    //加载其他 JS 脚本。
    //this.importScripts(""):

    //任务线程内部的全局变量数组,用于保存数据 阅读
    var statisticsArray_read = [];
    
    //任务线程内部的全局变量数组,用于保存数据 评论
    var statisticsArray_comment = [];
    
    //任务线程内部的全局变量数组,用于保存数据 推荐
    var statisticsArray_recommend = [];

    //发送ajax请求博客园
    function getReadData(page){
        //是否还要继续
        var flag = false;
        
        //使用XMLHttpRequest对象请求博客园 
        var xhr = new XMLHttpRequest();            
        xhr.open('GET', "https://www.cnblogs.com/"+myCnblogsName+"/default.html?page=" + page, false);//同步
        xhr.setRequestHeader("Content-Type", "text/html; charset=utf-8"); //设置响应格式
        xhr.onreadystatechange = function() {
          // readyState == 4说明请求已完成
          if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) { 
                var text = xhr.responseText;
                //使用正则处理HTML字符串,需要设置全局标识
                var myRe_read = /阅读(\s*)[(]+\d+[)]/g;
                var resultArray_read = text.match(myRe_read);
                
                //合并到全局变量数组中
                statisticsArray_read = statisticsArray_read.concat(resultArray_read);
                
                var myRe_comment = /评论(\s*)[(]+\d+[)]/g;
                var resultArray_comment = text.match(myRe_comment);
                
                //合并到全局变量数组中
                statisticsArray_comment = statisticsArray_comment.concat(resultArray_comment);
                                
                var myRe_recommend = /推荐(\s*)[(]+\d+[)]/g;
                var resultArray_recommend = text.match(myRe_recommend);
                
                //合并到全局变量数组中
                statisticsArray_recommend = statisticsArray_recommend.concat(resultArray_recommend);
                
                
                //判断这个即可:resultArray.length > 0     如果还要文章集合,则返回true
                if(resultArray_read && resultArray_read.length > 0){
                    flag = true;
                }
          }
        };
        xhr.send();
        
        return flag;
    }


    //循环调用getReadData,默认最大页数 100 (100页,每页10条记录,相对于1000篇博客,已经够多了吧?)
    for(var i = 1;i < 100;i++){
        //如果返回false则立即跳出循环
        if(!getReadData(i)){ break;}
    }

    //处理全局数组
    for(var i = 0;i < statisticsArray_read.length;i++){
        if(statisticsArray_read[i]){
            //只保留数字部分
            statisticsArray_read[i] = statisticsArray_read[i].match(/\d+/)[0];
        }else{
            statisticsArray_read.splice(i, 1);
        }
        
        if(statisticsArray_comment[i]){
            //只保留数字部分
            statisticsArray_comment[i] = statisticsArray_comment[i].match(/\d+/)[0];
        }else{
            statisticsArray_comment.splice(i, 1);
        }
                
        if(statisticsArray_recommend[i]){
            //只保留数字部分
            statisticsArray_recommend[i] = statisticsArray_recommend[i].match(/\d+/)[0];
        }else{
            statisticsArray_recommend.splice(i, 1);
        }
    }

    //数组求和,需要返回主线程的最终值
    //向产生这个 Worker 线程发送消息。
    var count_read = eval(statisticsArray_read.join("+"));
    var count_comment = eval(statisticsArray_comment.join("+"));
    var count_recommend = eval(statisticsArray_recommend.join("+"));
    
    console.log("统计结束,总阅读量为:"+count_read);
    console.log("统计结束,总评论量为:"+count_comment);    
    console.log("统计结束,总推荐量为:"+count_recommend);

    this.postMessage("{\"count_read\":\""+count_read+"\",\"count_comment\":\""+count_comment+"\",\"count_recommend\":\""+count_recommend+"\"}");

    //关闭 Worker 线程
    this.close();
</script>

<script>  
    $(function($){
        // title提示
        $("#calendar").css("display","none");
        $(".diggit").attr("title","谢谢点赞~~");
        $(".buryit").attr("title","雅蠛蝶~~");

               $("#div_digg .diggit").click(function(){
                      tip.msg("谢谢点赞~~");
               });
        
        //引入图片
        $("#blog-news").prepend("<img style='width: 100px;' src=\"https://pic.cnblogs.com/avatar/1534147/20181111224720.png\">");
        
                //隐藏博客园提供的积分与排名标签,并将内容迁移到指定位置
                $("#sidebar_scorerank").hide();
        $("#profile_block").append("积分:<span style='color: #464646;'>"+$("#sidebar_scorerank").find(".liScore").text().match(/[1-9]\d+/)[0]+"</span><br/>");
        $("#profile_block").append("排名:<span style='color: #464646;'>"+$("#sidebar_scorerank").find(".liRank").text().match(/[1-9]\d+/)[0]+"</span><br/>");



        /**************** worker  主线程  ********************/
        // 先追加一个显示标签
        $("#profile_block").append("总阅读量:<span id='count_read' style='color: #464646;'>统计中...</span><br/>");
        $("#profile_block").append("总评论量:<span id='count_comment' style='color: #464646;'>统计中...</span><br/>");
        $("#profile_block").append("总推荐量:<span id='count_recommend' style='color: #464646;'>统计中...</span><br/>");
           
        //创建一个Blob,读取同个页面中的script标签
         var blob = new Blob([document.querySelector('#worker').textContent]);

        //这里需要把代码当作二进制对象读取,所以使用Blob接口。然后,这个二进制对象转为URL,再通过这个URL创建worker。
        var url = window.URL.createObjectURL(blob);

        //创建worker对象
        var worker = new Worker(url ,{ name : 'jichi'});

        //监听任务线程返回的数据
        worker.onmessage = function (event) {
            var data = JSON.parse(event.data)
            //设置总阅读量
            $("#count_read").text(data.count_read);
            $("#count_comment").text(data.count_comment);
            $("#count_recommend").text(data.count_recommend);
        }

        //error 事件的监听函数。
        worker.onerror = function (event) {
          console.log('error:' + event);
        }

        //messageerror 事件的监听函数。发送的数据无法序列化成字符串时,会触发这个事件。
        worker.onmessageerror = function (event) {
          console.log('messageerror:' + event);
        }

        //发送数据到任务线程
        //worker.postMessage('Hello World');
        /**************** worker  主线程   end  ********************/
    })
</script>

复制即可

统计任意一个博主的阅读量

/**
    输入别人的博客园地址名称
*/
function statistical(myCnblogsName){
    console.log("我是worker 任务线程 正在统计 "+myCnblogsName+" 的博客的总阅读量..");

    //任务线程内部的全局变量数组,用于保存数据
    var statisticsArray = [];

    //发送ajax请求博客园
    function getReadData(page){
        //是否还要继续
        var flag = false;

        //使用XMLHttpRequest对象请求博客园
        var xhr = new XMLHttpRequest();            
        xhr.open('GET', "https://www.cnblogs.com/"+myCnblogsName+"/default.html?page=" + page, false);//同步
        xhr.setRequestHeader("Content-Type", "text/html; charset=utf-8"); //设置响应格式
        xhr.onreadystatechange = function() {
          // readyState == 4说明请求已完成
          if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) { 
            //使用正则处理HTML字符串,需要设置全局标识
                //var myRe = /huanzi-qch(\s*)阅读(\s*)[(]+[1-9]\d+[)]/g;
                var myRe = /阅读(\s*)[(]+[1-9]\d+[)]/g;
                var resultArray = xhr.responseText.match(myRe);

                //合并到全局变量数组中
                statisticsArray = statisticsArray.concat(resultArray);

                //判断这个即可:resultArray.length > 0     如果还有文章集合,则返回true
                if(resultArray && resultArray.length > 0){
                    flag = true;
                }
          }
        };
        xhr.send();

        return flag;
    }


    //循环调用getReadData,默认最大页数 100 (100页,每页10条记录,相对于1000篇博客,已经够多了吧?)
    for(var i = 1;i < 100;i++){
        //如果返回false则立即跳出循环
        if(!getReadData(i)){ break;}
    }

    //处理全局数组
    for(var i = 0;i < statisticsArray.length;i++){
        if(statisticsArray[i]){
            //只保留数字部分
            statisticsArray[i] = statisticsArray[i].match(/[1-9]\d+/)[0];
        }else{
            statisticsArray.splice(i, 1);
        }
    }

    //数组求和,需要返回主线程的最终值
    var count = eval(statisticsArray.join("+"));

    console.log("统计结束,总阅读量为:"+count);
}
statistical("jichi");
posted @ 2022-01-03 17:17  经典鸡翅  阅读(317)  评论(0编辑  收藏  举报