事情的起因是在b站投稿了一个高级弹幕测试的视频(av9940487),但是由于b站的弹幕池机制是新的弹幕顶掉旧的弹幕,所以导致一些人发的高级弹幕很快就被顶掉了。

所以就想着写个脚本来自动删除属性为普通的弹幕,语言用的是javascript,在chrome的控制台就可以执行这个脚本。

1.删除弹幕的流程分析

判断弹幕A是否为普通弹幕,是则选中。

点击删除弹幕的按钮,弹出二次确认框。

点击确定,成功删除。

2.删除弹幕相关的html代码,js代码

2.1 选中

可通过判断class属性为"item-front"的标签里是否包含“高级”两个字来决定是否勾选该弹幕:

  1. document.getElementsByClassName("item-font")[i].innerHTML.match("高级")
  1. getElementsByClassName("bili-checkbox")[i+1].click()

这里i+1是由于有其他标签也使用了“bili-checkbox”属性。

2.2

用click函数触发点击“删除弹幕”按钮的操作:

  1. document.getElementsByClassName("dele-btn")[0].getElementsByClassName("plain")[0].click();

2.3

点击二次确认框:

  1. document.getElementsByClassName("bili-btn")[2].click();

2.4 将以上的代码根据逻辑组合一下

  1. for (i = 0; i < document.getElementsByClassName("item-attr").length; i++) {
      if(!document.getElementsByClassName("item-font")[i].innerHTML.match("高级")){
        document.getElementsByClassName("bili-checkbox")[i+1].click();
      }
    }
    document.getElementsByClassName("dele-btn")[0].getElementsByClassName("plain")[0].click();
    document.getElementsByClassName("bili-btn")[2].click();

但是由于控制台执行js的代码速度过快,会导致在执行到第7行代码的时候,class属性为“bili-btn”的第3个标签还没加载出来,所以要在执行第7个语句之前让其停顿一下。

利用setTimeout()方法可实现延迟执行

  1. setTimeout(function () {document.getElementsByClassName("bili-btn")[2].click(); }, 1000);

  1. setTimeout("document.getElementsByClassName(\"bili-btn\")[2].click()",1000);

至此,只实现了单页面的批量删除1次,但是我们知道,假设弹幕有N页,就必须让以上代码不断运行,直到第x页不包含普通弹幕,然后跳转至第x+1页继续执行以上删除代码。

3. 实现不断刷新页面,当删除完当前页的普通弹幕时,自动跳转至下一页

结合另一篇文章即可实现:https://www.cnblogs.com/wujiecong/p/11549738.html

  1. var timeout = prompt("设置刷新时间");
  2. var current = location.href;
  3. var page = 0;
  4. var count = 0;
  5. if(timeout > 0)
  6. {
  7. setTimeout('reload()', 1000 * timeout);
  8. }
  9. else
  10. {
  11.   location.replace(current);
  12. }
  13.  
  14. function reload()
  15. {
  16. setTimeout('reload()', 1000 * timeout);
  17. if(count<10){
  18. const regex = /pn=(\d+)/;
  19. page = page +1;
  20. current = current.replace(regex,"pn="+page.toString())
  21. }
  22.   var frame = '<frameset cols=\'*\'>\n<frame src=\'' + current + '\' /></frameset>';
  23.   with(document)
  24.   {
  25. // 引用document对象,调用write方法写入框架,打开新窗口
  26.     write(frame);
  27.   
        setTimeout(function(){
  28.     count = 0
  29.     getFrames = window.frames["0"]
  30.     for (i = 0; i < getFrames.document.getElementsByClassName("item-attr").length; i++) {
  31.       if(!getFrames.document.getElementsByClassName("item-font")[i].innerHTML.match("高级")){
  32.         getFrames.document.getElementsByClassName("bili-checkbox")[i+1].click();
  33.         count = count +1;
  34. }
  35. }
  36.     if(count>0){
  37.       getFrames.document.getElementsByClassName("dele-btn")[0].getElementsByClassName("plain")[0].click();
  38.       setTimeout(function () {
  39.         getFrames.document.getElementsByClassName("bili-btn")[2].click();
  40.       }, 1000);
  41.     }},2000);
  42.     
  43. // 关闭上面的窗口
  44.     void(close());
  45.   };
  46. }

利用js代码自动删除稿件的普通弹幕的更多相关文章

  1. 利用任务计划自动删除指定日期的SQLServer备份文件

    利用任务计划自动删除指定日期的SQLServer备份文件 命令FORFILES [/P pathname] [/M searchmask] [/S]         [/C command] [/D ...

  2. 利用PS脚本自动删除7天之前建立的目录-方法1!

    目前有一个备份目录,目录名称为d:\temp\bak目录,在这目录下,根据备份要求,自动生成了如下目录的列表: 20131012 20131011 20131010 20131009 20131008 ...

  3. 怎么利用idea自带的工具,不需要 重启tomcat或则其他服务,js代码自动生效

    idea中有一个工具:可以直接upload,能让你修改的界面直接可以看到,不需要重启服务. 依次点击的按钮如下: 点击进入的界面这个填的只是一个示例,在各位的电脑上肯定不行,大家依据实际情况填写.

  4. 利用js代码屏蔽f12,右键,粘贴,复制,剪切,选中,操作!!秀!秀!秀!

    koala 专注于个人技术分享 屏蔽f12审查 <script> document.onkeydown = function () { if (window.event && ...

  5. 利用JS代码快速获得知网论文作为参考文献的引用文本

    写论文的时候,发现知网虽然提供了生成参考文献引用标注的功能,但是效率仍然不太高.我就忙里偷闲写了一段简单的脚本,能无延迟地生成这段引用文本.目前支持期刊论文和硕士论文. 代码: (function() ...

  6. 利用js代码:document.forms[0].approval.value='false',当点击 <input type="image"按钮向表单传递不同的参数。

    <form action="flow_myTaskList"> <input type="hidden" name="approva ...

  7. 怎么让Eclipse对html和js代码自动提示

    使用eclipse自带的插件,无需另外安装插件,具体步骤如下1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist修改Auto Activ ...

  8. 【VS Code】中node.js代码自动补全的方法

    原文链接: https://blog.csdn.net/qq_39189819/article/details/91347484

  9. 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样

    去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个问题:能不能把某 ...

随机推荐

  1. java学习笔记(二)分布式框架Dubbo+zookeeper搭建

    参考文章http://www.cnblogs.com/sxjun/p/6963844.html 注意的几个问题: 1.配置dubbo.properties 将以下地址改为你Zookeeper注册的地址 ...

  2. cmake 出现undefined reference to xxx 解决办法

    cmake没怎么用,主要觉得Clion很好用,但是默认clion使用的是cmake.再说一句clion是linux平台上很好用,个人强推. 当你使用clion的时候,如果使用了thread cstl等 ...

  3. SQLite3的安装与使用

    下载地址:https://www.sqlite.org/download.html (下载相对应自已电脑的配置的数据库)(这里 我的电脑是 windows 64位操作系统) 下载完后 解压出来 sql ...

  4. 【JZOJ5605】【NOI2018模拟3.26】Arg

    题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 解题思路 如何求出一个序列的LIS? 对于二分的方法,每次插入一个数,将它放到第一个 ...

  5. PHP:函数和语言结构(转)

    转自:https://www.cnblogs.com/fanqiechaodan/articles/5222366.html 什么是语言结构呢?它和函数有什么不同吗? 1.  什么是语言结构和函数 语 ...

  6. Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法

    Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法  2017年9月6日  原创分享  zencodex  使用 Laravel dingo 做api开发时,涉及 A ...

  7. svn的下载与安装,使用,包教包会!!!

    svn的安装使用说明 下载svn服务器与搭建 高效开发 — SVN使用教程(客户端与服务端安装详解!带图!带注释!安装客户端与服务端的地址可以看上两个链接) svn安装分为两部分,服务端安装与客户端安 ...

  8. fiddler(四)、断点(转)

    前言 先给大家讲一则小故事,在我们很小的时候是没有手机的,那时候跟女神聊天都靠小纸条.某屌丝A男对隔壁小王的隔壁女神C倾慕已久,于是天天小纸条骚扰,无奈中间隔着一个小王,这样小王就负责传小纸条了.有一 ...

  9. [CSP-S模拟测试]:地理课(并查集+线段树分治)

    题目传送门(内部题146) 输入格式 从$geography.in$读入数据. 第一行两个数$n,m$,表示有$n$个点,$m$个时刻.接下来$m$行每行三个数,要么是$1\ u\ v$,要么是$2\ ...

  10. 安卓 API 19 低版本设置自带的圆圈效果

    在 Android API 19 环境下,RadioButton 消除或者自定义自带的圆圈效果的形式来设置: 自定义自身选择图标 android:button="@drawable/sele ...