金氧

Chrome插件:网易云音乐一键全赞

最近帮朋友做了一个Chrome插件,方便做一些批量的动作。对于Chrome插件有兴趣的同学可以看一下。

需求

网易云音乐音乐详情页底部的评论区,一键自动全赞,然后翻页继续全赞直至最后一页。

分析

那么我们以薛之谦的“演员”这首歌页面为例仔细分析一下。首先看页面的URL http://music.163.com/#/song?id=32507038,页面用的锚点,主url music.163.com/ 一直没变过。那么再看页面底部的评论区域,评论区域分为两部分,第一部分是精彩评论,第二部分是最新评论。最新评论下面有翻页按钮,点击第二页后,可以翻页,第二页以后的页面上部没有精彩评论。

实现

由于代码中有注释而且非常短,就不一一解释了,直接上代码吧。
关于Chrome插件的制作可以看着里:如何从零开始写一个 Chrome 扩展?

manifest.json

{
  "name": "云音乐",
  "description": "云音乐",
  "version": "1.0",
  "permissions": [
    "tabs", "http://music.163.com/*"
  ],
  "content_scripts": [
    {
      "matches": ["http://music.163.com/*"],
      "js": ["jquery.min.js", "myscript.js"]
    }
  ],
  "manifest_version": 2
}

myscript.js

window.onhashchange = handleHashchange;
window.onerror = handleError;

var time = new Date().getTime();
var array = new Array();

$(window.frames["contentFrame"].document).ready(function(){
  addButton();
});

function handleHashchange() {
  //console.log("onhashchange");
  location.reload();
}

function handleError() {
  console.log("onerror");
}

function addButton() {
  array = new Array();
  var iptarea = $(window.frames["contentFrame"].document).find(".iptarea");
  //var button = $('<input id="like" class="btn u-btn u-btn-1" type="button" value="全部点赞" />');
  var button = $('<a href="javascript:void(0)" class="btn u-btn u-btn-1 j-flag" >全赞</a>');

  button.click( function () {
    //绑定事件监听评论区域的数据改变
    var cmmts = $(window.frames["contentFrame"].document).find(".cmmts");
    cmmts.bind('DOMNodeInserted', function(e) {
      //console.log('element now contains: ' + $(e.target).html());
      //console.log('element now length:%d contains:%s ', $(e.target).parent().children().length, $(e.target).html());
      //console.log('element now length: ' + $(e.target).parent().children().length);
      //判断是否满一页,然后全部点一页
      //if ($(e.target).parent().children().length == 20) {
      //  like();
      //}
      item($(e.target));
    });

    //当前页一键全赞
    like();
  });
  var input = $('<div>频率<input id="interval" class="" type="text" value="0" />s</div>');
  iptarea.after(input);
  iptarea.after(button);
}

function like() {
  var cmmts = $(window.frames["contentFrame"].document).find(".cmmts").children(".itm");
  //console.log("cmmts.length : %d", cmmts.length);
  //console.log("cmmts.html : %s", cmmts.html());
  for (var i=0;i<cmmts.length;i++){
    var itm = cmmts.eq(i);
    item(itm);
  }
  next();
}

function item(itm) {
    time = new Date().getTime();
    var rp = itm.find(".cntwrap .rp a");
    //console.log(rp.html());
    //console.log(rp.attr("data-type"));
    if(rp.attr("data-type") == "like"){
      //console.log(rp.html());
      var zan = rp.children();
      //console.log(zan.html());
      zan.click();
    }
}

function next() {
  var upage = $(window.frames["contentFrame"].document).find(".u-page").children();
  //console.log("upage.length : %d", upage.length);
  if (upage.length > 0) {
    var znxt = upage.eq(upage.length - 1);
    if(!znxt.hasClass('js-disabled')){
      znxt.html("<span>下一页</span>");
      //console.log("znxt.html : %s", znxt.html());
      znxt.children().click();
    }
  }
  var interval = $(window.frames["contentFrame"].document).find("#interval");
  interval = interval.val() - 0;
  //console.log('interval: %d', interval);
  setTimeout("next()", interval*1000);
}