本文项目Github地址:https://github.com/zhouhuanghua/auto-flood-screen

最近,电竞圈LOL届最大的瓜非"蓝公主"莫属。本来,我也只是一名吃瓜群众,感觉都无所谓。但是,后面Baolan的亲妈粉闪现开团:嘲讽皇族官宣香锅退役是蹭热度,抢走了宝蓝生日的风头。这就不能忍了,作为RNG的忠实铁粉,而且还是香锅退役这么隆重的事情。怎么办呢?只能去最多人可以看到的网络直播平台刷"蓝公主"来过瘾一下了。不过,手动去刷的话太慢了没啥效果,作为一名码农,时刻要想到利用程序去处理问题。废话不多说哈,开始搞事情了。

这里以某牙为例,其它的大家可以举一反三。发弹幕最大的问题就是账号登录问题,网站设计者想尽一切办法来阻止机器人行为。但是,道高一尺,魔高一丈,现在连滑动解锁的方式都已经有了解决方案。不过,Huya还没那么复杂,相对来说算比较简单的了。

这里示范了两种实现方式:第一种,自动登录-->用户直接执行程序自动打开浏览器并进入指定的直播间,然后根据配置的账号密码或者手机号实现自动登录,最后开始刷指定的弹幕;第二种,手动登录-->用户首先执行一条cmd命令(或者封装成一段程序)打开浏览器,然后自己手动打开一个直播间登录,最后执行一段程序开始刷指定的弹幕。

老规矩,上镇楼图

首先,有必要给大家介绍一点前置知识。

1、什么是Selenium?

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

这是摘自百度百科的说法,一句话来说就是:通过写代码让程序像人一样去操作浏览器。它依赖具体的浏览器驱动。

2、怎么去定位元素?

Selenium提供了很多方式去定位一个元素,就跟JQuery一样,什么根据id呀class呀tag呀应有尽有,还有css选择器。不过,我最喜欢用的是xpath,为啥呢,因为简单,有手就行。下面来示范一下

首先打开你的Chrome浏览器,进入一个网页,选中指定元素右击,然后点击检查。或者按F12像下面这样操作

这样子之后就会定位到对应得HTML。接着,鼠标放到这一行上面,右击后选择Copy。最后在显示出来的界面点击最后一个Copy XPath,就复制了对应的值了。小伙伴们学会了吗?代码里面都是基于这种方式。

3、驱动和jar包去哪里下载?

驱动:http://npm.taobao.org/mirrors/chromedriver/,下载跟你浏览器一样或者接近的版本。

jar包:http://npm.taobao.org/mirrors/selenium/,我喜欢最新的。

然后,就开始进入今天的主题了。

一、自动登录

talk is cheap,show me the code。

1、(完整代码)自动打开浏览器,进入到指定网页,根据账号密码自动登录。

/*** 自动登录刷弹幕** @author z_hh*/
public class Auto {public static void main(String[] args) throws Throwable {// 设置驱动位置System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe");// 创建一个驱动对象WebDriver driver = new ChromeDriver();// 打开指定网页String url = "https://www.huya.com/17859972";driver.navigate().to(url);// 智能等待一下子driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);// 窗口最大化driver.manage().window().maximize();// 等待,直到登录元素可以点击WebElement loginElement = driver.findElement(By.xpath(".//*[@id=\"nav-login\"]"));WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));wait.until(ExpectedConditions.elementToBeClickable(loginElement));//点击登录loginElement.click();driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);// 切换到登录框里面driver.switchTo().frame("UDBSdkLgn_iframe");// 账号登录accountLogin(driver);// 手机验证码登录
//      mobileLogin(driver);// 发弹幕Utils.send(driver);}private static void accountLogin(WebDriver driver) {// 输入账号driver.findElement(By.xpath(".//*[@id=\"account-login-form\"]/div[1]/input")).sendKeys("13800138000");// 输入密码driver.findElement(By.xpath(".//*[@id=\"account-login-form\"]/div[2]/input")).sendKeys("xx00");// 登录driver.findElement(By.xpath(".//*[@id=\"login-btn\"]")).click();                  }private static void mobileLogin(WebDriver driver) {// 切换到手机验证码登录driver.findElement(By.xpath(".//*[@id=\"login-head-nav\"]/ul/li[2]")).click();// 输入手机号driver.findElement(By.xpath(".//*[@id=\"phone-login-form\"]/div[1]/input")).sendKeys("13800138000");// 发送验证码driver.findElement(By.xpath(".//*[@id=\"phone-login-form\"]/div[2]/span")).click();// 获取验证码输入框的值,直到够了6位数for (;;) {String text = driver.findElement(By.xpath(".//*[@id=\"phone-login-form\"]/div[2]/input")).getAttribute("value") ; if (Objects.nonNull(text) && Objects.equals(text.length(), 6)) {break;}}// 点击登录driver.findElement(By.xpath(".//*[@id=\"phone-login-btn\"]")).click();}
}

2、(完整代码)定时循环发送弹幕。

/*** 通用工具类** @author z_hh*/
public class Utils {/*** 无限循环发送弹幕* * @param driver 驱动*/public static void send(WebDriver driver) {// 弹幕内容String msg = "蓝公主";// 输入框元素WebElement inputElement = driver.findElement(By.xpath(".//*[@id=\"pub_msg_input\"]"));// 发送按钮元素WebElement sendElement = driver.findElement(By.xpath(".//*[@id=\"msg_send_bt\"]"));for (int i = 1; ; i++) {try {// 找到输入框并写入内容(为了不重复,后面拼上次数)inputElement.sendKeys(msg + i);// 点击发送sendElement.click();// 等待10秒钟,并清空输入框TimeUnit.SECONDS.sleep(10);inputElement.clear();} catch (Exception e) {e.printStackTrace();}}}
}

简单补充说明一下

1)驱动的位置,我放在项目的一个文件夹里面,代码写的是相对路径。

2)切换到登录框。这个很关键,要不然定位不到填写账号密码的元素。

3)这里两种登录方式选其一即可。手机验证码登录需要手动配合输入验证码,这里只是为了提供多一种选择以备不时之需。

二、手动登录

既然有了自动登录,为啥还要手动登录呢?有三点原因:(1)自由度比较高;(2)以备不时之需;(3)最重要,分享一个重要的知识点。

打起精神来,这个知识点就是:

有时候我们需要手动打开浏览器,进入到所需的页面,执行一些手动任务,如输入表单、输入验证码,登录成功后,才开始运行自动化脚本。这种情况下如何使用Selenium来接管先前已经打开的浏览器呢?

其实就是,使用Selenium控制已打开的浏览器。针对谷歌浏览器,我们可以利用Chrome DevTools协议:它允许客户检查和调试Chrome浏览器。

怎么使用呢?

1、将Chrome程序添加到计算机的环境变量Path里面。

如图,桌面选中Google Chrome,右击,打开文件所在的位置。

2、在cmd命令窗口输入chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"之后回车,在浏览器自动打开之后,手动进入到指定的直播间并进行登录。

  • remote-debugging-port:可以指定任何打开的端口。
  • user-data-dir:指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。

作为一名程序员,这个操作你也可以用代码完成。

/*** Debug模式打开浏览器** @author z_hh*/
public class OpenChrome {public static void main(String[] args) {try{Runtime.getRuntime().exec("chrome.exe --remote-debugging-port=9527 --user-data-dir=\"C:/selenum/AutomationProfile\"");}catch(Exception e){e.printStackTrace();}}
}

3、(完整代码)创建一个控制已打开浏览器的WebDriver对象。

之后,就可以去刷弹幕了(同第一种方式)。

/*** 刷屏** @author*/
public class Flood {public static void main(String[] args) throws Throwable {// 设置驱动位置System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe");// 配置选项(端口跟打开浏览器时设置的要一样)。还有其它的,此处不做介绍ChromeOptions options = new ChromeOptions();options.setExperimentalOption("debuggerAddress", "127.0.0.1:9527");// 创建一个驱动对象WebDriver driver = new ChromeDriver(options);System.out.println(driver.getTitle());Utils.send(driver);}
}

主体部分讲解完了。最后,送给大家一点补习资料。

三、(完整代码)附上Selenium的一些其它操作

这段代码网上找来的,我写的没这么烂~~~

public class Demo {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", "D:/eclipse_workspace/automation/driver/chromedriver.exe");// chromedriver服务地址WebDriver driver = new ChromeDriver(); // 新建一个WebDriver 的对象,但是new 的是谷歌的驱动String url = "http://www.baidu.com";driver.get(url); // 打开指定的网站//driver.navigate().to(url); // 打开指定的网站        /** * driver.findElement(By.id("kw")).sendKeys(new String[] { "hello" });//* 找到kw元素的id,然后输入hello driver.findElement(By.id("su")).click(); // 点击按扭*/try {/*** WebDriver自带了一个智能等待的方法。 dr.manage().timeouts().implicitlyWait(arg0, arg1);* Arg0:等待的时间长度,int 类型 ; Arg1:等待时间的单位 TimeUnit.SECONDS 一般用秒作为单位。*/driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);} catch (Exception e) {e.printStackTrace();}//获取当前浏览器的信息System.out.println("Title:" + driver.getTitle());System.out.println("currentUrl:" + driver.getCurrentUrl());//执行js脚本String jString = "alert('122')";((JavascriptExecutor) driver).executeScript(jString);//获取单个元素WebElement element = driver.findElement(By.id("wrapper"));System.out.println(element.getAttribute("class"));//获取多个元素List<WebElement> elList = driver.findElements(By.tagName("input"));for (WebElement e : elList) {System.out.println("获取多个元素:"+e.getAttribute("name"));}//定位层级元素WebElement e = driver.findElement(By.cssSelector("#qrcode-item qrcode-item-1"));List<WebElement> list = e.findElements(By.tagName("div"));for (WebElement e1 : list) {System.out.println("定位层级元素:"+e1.getAttribute("class"));}//获取当前的窗口String currentWindow = driver.getWindowHandle();//获取所有的窗口Set<String>  handles = driver.getWindowHandles();//遍历窗口Iterator<String> iterator = handles.iterator();while (iterator.hasNext()) {if (currentWindow == iterator.next())continue;//跳转到弹出的窗口WebDriver driver2 = driver.switchTo().window(iterator.next());driver2.getTitle();}//处理弹出框Alert alert = driver.switchTo().alert();alert.getText();alert.dismiss();//相当于点击取消Alert confirm = driver.switchTo().alert();confirm.getText();confirm.accept();//相当于点击确认Alert prompt = driver.switchTo().alert();prompt.getText();prompt.accept();prompt.sendKeys("测试1");//输入值//处理下拉列表Select select = new Select(driver.findElement(By.id("select")));select.selectByIndex(1);select.selectByValue("西安");select.selectByVisibleText("咸阳");//获取下拉框的全部选项List<WebElement> list2 = select.getOptions();for (WebElement webElement : list2) {webElement.click();//点击下拉框}//处理cookie//添加一个cookieCookie cookie = new Cookie("COOKIE", "NAME","D://COOKIES");driver.manage().addCookie(cookie);//获取cookiesSet<Cookie> set = driver.manage().getCookies();Iterator<Cookie> iterator2 = set.iterator();while (iterator2.hasNext()) {Cookie c = iterator2.next();c.getName();c.getValue();c.getPath();}driver.manage().deleteAllCookies();driver.manage().deleteCookie(cookie);driver.manage().deleteCookieNamed("COOKIE");//等待加载完页面try {driver.manage().timeouts().wait(1);driver.manage().timeouts().implicitlyWait(1,TimeUnit.SECONDS);//等待界面加载完} catch (InterruptedException e2) {e2.printStackTrace();}//模拟鼠标和键盘操作Actions action = new Actions(driver); action.click();action.dragAndDrop(element, e);action.sendKeys(element,"12222").perform();action.click(element);action.keyDown(currentWindow);// driver.quit();// 退出浏览器/*** dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别:第一个close,* 如果打开了多个页面是关不干净的,它只关闭当前的一个页面。第二个quit,* 是退出了所有Webdriver所有的窗口,退的非常干净,所以推荐使用quit最为一个case退出的方法。*/}
}

四、结语

看到香锅被说蹭热度之后气不打一处来,于是写了这段代码。不过,文明社会,人人有责,我们要做一个高尚的喷子,弹幕只发"蓝公主"就好。

使用Selenium实现直播平台的自动刷屏相关推荐

  1. 使用selenium自动爬取斗鱼直播平台的所有房间信息

    使用selenium自动爬取斗鱼直播平台的所有房间信息 文章目录 使用selenium自动爬取斗鱼直播平台的所有房间信息 使用selenium实现动态页面模拟点击 什么是selenium? selen ...

  2. selenium抓取斗鱼直播平台数据

    https://www.cnblogs.com/xinyangsdut/p/7617691.html 程序说明: 抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. ...

  3. python抓取直播源 并更新_Python爬虫实例(二)使用selenium抓取斗鱼直播平台数据...

    程序说明:抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. 过程分析: 进入平台首页,来到页面底部点击下一页,发现url地址没有发生变化,这样的话再使用urlli ...

  4. 【小demo】——直播平台自动发言

    1. 背景 直播平台火热的现在,好多人已经开始直播致富了,但是很多直播新人因为人气等相关原因,就很难在直播平台爆火,有的人想到了买号,刷人气之类的,现在这款小demo就是配套的组件. 2. 前期准备 ...

  5. 直播平台基本功能解读:以呆萌直播为例的技术剖析

    一.登录 呆萌互动直播系统本着简单实用的原则,登录方式直接采用微信第三方 登录,让用户既省去了手机注册的麻烦,也省去了多种选择的困扰,同时,第 三方授权登录后,APP 会自动调取用户微信的昵称和头像, ...

  6. 一文学会 Flink CEP(以直播平台监控用户弹幕为例)

    我们在看直播的时候,不管对于主播还是用户来说,非常重要的一项就是弹幕文化.为了增加直播趣味性和互动性, 各大网络直播平台纷纷采用弹窗弹幕作为用户实时交流的方式,内容丰富且形式多样的弹幕数据中隐含着复杂 ...

  7. 电商直播平台如何借助容器与中间件实现研发效率提升100%?

    作者:鹿玄,阿里云解决方案架构师 前言 直播带货是近期发展非常迅猛的一种新的电商模式.构建一个电商直播平台从技术角度上大致可以分为视频直播服务.CDN.前端(H5/ 小程序).大数据.以及各种业务后台 ...

  8. 鏖战双十一-阿里直播平台面临的技术挑战

    http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 前言:一直以来双十一都是以交易为重心 ...

  9. 在钉钉上怎么手写_胖·评测|亲测!磐度A5数字纸笔手写板能适配多少直播平台?...

    停课不停学,各大科技企业纷纷推出各类教学平台吗,一时之间可谓百家争鸣!但是对于一线教师而言,除了为可怕的直播拥堵与繁琐的直播操作而头痛之外,一个更可怕的事实出现了--解题答疑,没有趁手的好工具怎么搞定 ...

  10. 快手直播平台演进之路

    快手作为目前世界上领先的直播平台,在业务形态不断拓展的过程中,也经历了直播架构的不断演变,从完全采用第三方解决方案,到目前自建源站.自研连麦解决方案.自建超高密度转码集群,搭建起了一套高稳定性的直播架 ...

最新文章

  1. 伪官宣:Envoy 中文指南新鲜出炉
  2. mysql数据库驱动_JDBC 加载mysql数据库驱动
  3. python程序员搞笑段子_程序员才能看得懂的段子,内含表情包,吃饭的时候别点!...
  4. python3-字典中的一些常用方法
  5. SQL基础三(例子)
  6. 1.3 Go语言基础之数据类型
  7. Spring Security:基于MySQL数据库的身份认证
  8. 寻找某个数c语言,C++_C语言实现两个递减数列中寻找某一个数,本文实例讲述了C语言实现两个 - phpStudy...
  9. hard-negative mining 及伪代码实现
  10. Android项目实战(十):自定义倒计时的TextView
  11. 给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理
  12. hadoop 2022 面试题总结了
  13. 【计算理论】正则语言 ( 正则语言运算 | 正则语言封闭性 )
  14. eigen一维向量_Eigen中的矩阵及向量运算
  15. 奖学金评审系统java_奖学金评定系统 - WEB源码|源代码 - 源码中国
  16. 从0学开发笔记-数据库基础
  17. 三行代码将Excel转为任意格式的Word
  18. 安装deepin系统
  19. Android发展趋势分析,droidcon北京2017安卓技术大会参会感悟
  20. e2esoft VCam推流时推送声音

热门文章

  1. windows server 2003 远程拨号服务器
  2. Debian回收站无法删除解决
  3. 经纬财富:昭通炒现货白银技巧
  4. python+mitmdump实战(3/3)(附源码)
  5. Wireshark、Sniffer 两款网络分析工具的比较
  6. Uncaught SyntaxError: Unexpected token lt; 错误完美解决
  7. ftp服务器限制文件大小,ftp服务器设置文件大小
  8. 暗影精灵4电脑win10系统重装+linux双系统安装
  9. 使用Excel批量生成sql,包括日期格式
  10. 冶金矿山数字化价值链分析