0
点赞
收藏
分享

微信扫一扫

使用JavaScript实现B站评论区自动点赞工具的思路

南陵王梁枫 2022-01-23 阅读 97

JavaScript是什么?

JavaScript是跨平台、面向对象的 Web编程脚本语言。绝大多数网站都使用JavaScript,所有现代Web浏览器(无论是桌面、平板还是手机浏览器)都包含JavaScript解释器,这让JavaScript成为有史以来部署最广泛的编程语言。过去十年,Node.js 让浏览器之外的JavaScript编程成为可能,Node的巨大成功意味着JavaScript如今也是软件开发者最常用的编程语言。

Stack Overflow 联合创始人 Jeff Wood 曾说过,任何一个能用 JavaScript 编写的应用系统,最终都必将使用 JavaScript 实现。

为什么JavaScript是网页爬虫的最佳选择

  1. 绝大多数网页都使用JavaScript开发。

  2. 浏览器可以直接运行JavaScript。

  3. 网页内容由HTML编写或JavaScript动态生成,JavaScript可以直接操作DOM,获取网页内容非常容易。

  4. 现在很多网页流行JavaScript动态生成,传统获取网页源代码的方式无法爬取内容,但是对于浏览器中的JavaScript来说根本不存在这种问题。

  5. 不需要设置cookie,因为浏览器已经为我们保存了。

使用JavaScript实现评论区自动点赞

1.使用浏览器自带的开发者工具找到点赞的元素
在这里插入图片描述

2.使用开发者工具多找几个点赞的元素,从中找到共同点
document.querySelectorAll("div.info > span[class='like ']")
上面这段JavaScript代码获取了所有能看见的点赞元素,这是一个数组。
3.触发一个点赞事件
document.querySelectorAll("div.info > span[class='like ']")[0].click()
上面这段JavaScript代码演示了给第一条评论点赞。
4.批量点赞

let likebtns=document.querySelectorAll("div.info > span[class='like ']");//获取点赞元素列表
let likebtnsiter=likebtns.entries();//数组转换为迭代器
let ccgjtimer=setInterval(()=>{//定时器每隔1000毫秒执行点赞
	let nextele=likebtnsiter.next();
	if(nextele.done){//元素点赞完成清除定时器
		clearInterval(ccgjtimer);
		alert("点赞完毕!");
		return;
	}
	nextele.value[1].click();//执行点赞事件
},1000);

感兴趣的小伙伴可以复杂上面的代码找一个视频,实验一下点赞效果。这就是JavaScript的魅力,没有复杂的逻辑,短短11行代码就完成了评论批量点赞,为了防止被B站制裁我们使用定时器每隔1000毫秒执行一次点赞操作。

Tampermonkey扩展的使用

为了点赞每次要打开开发者工具运行代码非常不方便。幸好有Tampermonkey这个扩展可以帮助我们解决这个问题。Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器,它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。

1.安装Tampermonkey

以edge浏览器为例,在地址栏输入地址:https://microsoftedge.microsoft.com/addons/search/Tampermonkey
安装绿黑版本。安装后需要启用Tampermonkey扩展
在这里插入图片描述

2.在Tampermonkey中添加新脚本,并把点赞代码复制粘贴到// Your code here…位置

最终结果如下:

https://www.bilibili.com/video/*
// @icon         https://www.google.com/s2/favicons?domain=bilibili.com
// @grant        none
// ==/UserScript==

(function() {
    use strict;

    let likebtns=document.querySelectorAll("div.info > span[class='like ']")
    let likebtnsiter=likebtns.entries();
    let ccgjtimer=setInterval(()=>{
        let nextele=likebtnsiter.next();
        if(nextele.done){
            clearInterval(ccgjtimer);
            alert("点赞完毕!");
            return;
        }
        nextele.value[1].click();
    },1000);
})();" class="  language-javascript">// ==UserScript==
// @name         B站评论区点赞
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match

在浏览器中JavaScript作为爬虫的问题

可以看出来只要是在浏览器中的操作JavaScript都很方便,但是由于浏览器的安全限制,JavaScript有无法直接读写本地文件,无法跨域请求的问题。还好现在有Nodejs可以帮助我们解决这个问题。但是在这里我想提出另一种解决方案NW.js (原名 node-webkit)和Electron,他们是基于 Chromium 和 node.js 的应用运行时,通过它可以用 HTML 和 JavaScript 编写原生应用程序。它还允许你从 DOM 调用 Node.js 的模块 ,实现了一个用所有 Web 技术来写原生应用程序的新的开发模式。

后记

后来我又想了一下,我发现还是想复杂了,其实不用写的那么复杂,只需要判断点赞按钮是否存在就行了。

史上最简单的点赞代码如下:

setInterval(()=>{
   let likebtn=document.querySelector("div.info > span[class='like ']");
   if(likebtn){
       likebtn.click();//点赞事件
   }
}1000

有细心的网友发现这只能点赞加载出来的网页,后来我继续顺着这个思路发现想点赞所有的评论也很简单。思路是这样的,如果找到【点赞】按钮就点击它,如果找不到【点赞】按钮就寻找【点击查看】按钮,如果找到【点击查看】按钮就点击它,然后就会加载新的评论,如果【点击查看】里的评论被点完了就寻找【下一页】按钮,如果找到【下一页】按钮就点击它,当找不到【下一页】按钮时说明加载的评论已经点赞完毕,我们需要向下滚动滚动条加载新的评论。

let zancount=0;
  setInterval(()=>{
      let likebtn=document.querySelector("div.info > span[class='like ']");
      if(likebtn){
          console.log('点赞',zancount++,'次');
          likebtn.click();//点赞事件
      }else{
          console.log('1.没有找到【点赞】按钮,尝试寻找【查看更多】按钮!');

          let morebtn=document.querySelector("a.btn-more");
          if(morebtn){
              console.log('找到【查看更多按钮】!');
              morebtn.click();//查看更多事件
          }else{
              console.log('2.没有找到【查看更多】按钮,尝试寻找【下一页】按钮!');
              let nextbtn=document.querySelector("div.paging-box > a.next");
              if(nextbtn){
                  console.log('找到【下一页】按钮!');
                  nextbtn.click();//下一页事件
              }else{
                  console.log('3.没有找到【下一页】按钮!向下滚动!');
                  scrollBy(0,500);//向下滚动500
              }
          }

      }

  },1000);

这里需要说明一下scrollBy(x,y)这个滚动是在当前位置的基础上继续滚动(x,y)的距离,不需要scrollTo(x,y)那样自己计算滚动坐标。

同时这里记录一下如何获取滚动条的位置:

function ScollPostion() {
    var t, l, w, h;
    if (document.documentElement && document.documentElement.scrollTop) {
        t = document.documentElement.scrollTop;
        l = document.documentElement.scrollLeft;
        w = document.documentElement.scrollWidth;
        h = document.documentElement.scrollHeight;
    } else if (document.body) {
        t = document.body.scrollTop;
        l = document.body.scrollLeft;
        w = document.body.scrollWidth;
        h = document.body.scrollHeight;
    }
    return {
        top: t,
        left: l,
        width: w,
        height: h
    };
}
//来源:https://www.cnblogs.com/ban-s/p/js-scroll-coordinate.html
举报

相关推荐

0 条评论