使用selenium编写一个斗鱼弹幕机器人,进行封装成exe程序_斗鱼自动发弹幕代码-程序员宅基地

技术标签: 爬虫  python  selenium  软件测试  google drive  

原本设想是使用selenium来编写一个自动化发送弹幕的机器人。来代替我发送弹幕来进行弹幕抽奖等。代码如下

# coding: UTF-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pyperclip
from selenium.webdriver.support.wait import WebDriverWait         #实例化1个谷歌浏览器对象
#
browser=webdriver.Chrome()
browser.get('https://www.douyu.com/')#进入斗鱼首页


#登录
WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="js-header"]/div/div/div[3]/div[7]/div/div/a/span'))#显示等待直到有登录
browser.find_element_by_xpath('//*[@id="js-header"]/div/div/div[3]/div[7]/div/div/a/span').click()#点击头像
browser.implicitly_wait(5)#隐式等待五分钟,等待加载

browser.switch_to_frame('login-passport-frame')#进入弹出的登录框中
WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="loginbox"]/div[2]/div[1]/div[2]'))#显示等待
browser.find_element_by_xpath('//*[@id="loginbox"]/div[2]/div[1]/div[2]').click()#点击转换页面,转为电话号码登录

WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="loginbox"]/div[3]/div[2]/div/form/div[6]/input'))#显示等待

#输入账号密码
user=input("请输入账号:")
passwd=input("请输入密码:")
browser.find_element_by_xpath('//*[@id="loginbox"]/div[3]/div[2]/div/form/div[1]/div/input').send_keys(user)
browser.find_element_by_xpath('//*[@id="loginbox"]/div[3]/div[2]/div/form/div[3]/input[1]').send_keys(passwd)


#由于需要进行图片和短信验证码验证,所以此处提示手动在浏览器通过验证
print('请在页面点击登录并通过验证。')

login = input("请输入是否登录完成y/n:")
browser.switch_to.default_content()#退出登录框
browser.implicitly_wait(5)#隐式等待
#输入判断是否发弹幕
panduan = input("请输入是否发弹幕y/n:")

#想要发送弹幕就进入循环

while panduan=='y':
    #通过搜索房间号的方式,并点击搜索到的连接进入想要抽奖的直播间


    u = input("请输入需要发送弹幕的直播间号:")
    browser.switch_to_window(browser.window_handles[-1])#跳到新打开的页面
    browser.find_element_by_class_name("Search-text").clear()
    browser.find_element_by_class_name("Search-text").send_keys(u)#将房间号传入搜索框
    browser.find_element_by_class_name("Search-text").send_keys(Keys.ENTER)#模拟enter键


    time.sleep(5)#程序沉睡五秒,进行加载
    browser.switch_to_window(browser.window_handles[0])
    browser.close()#关闭上一个页面
    browser.switch_to_window(browser.window_handles[-1])
    browser.execute_script("document.body.style.zoom='0.67'")#将新页面尺寸调整为%67

#在搜索到的页面点击进入房间
    WebDriverWait(browser, 10, 0.2).until(
        lambda x: x.find_element_by_xpath('//*[@id="js-search-result"]/section[3]/section[2]/section[1]/div[2]/div/a'))

    browser.find_element_by_xpath('//*[@id="js-search-result"]/section[3]/section[2]/section[1]/div[2]/div/a').send_keys(
        Keys.ENTER)


    time.sleep(5)
    browser.close()#关闭上一个页面
    browser.switch_to_window(browser.window_handles[-1])
    panduan1='y'
    browser.execute_script("document.body.style.zoom='0.67'")

#选择发弹幕方式进入两个分支自定义或字典
    c_type=int(input("请输入方式,输入1手动设定弹幕,输入2使用字典:"))
    if c_type==1:

#进入发弹幕循环,直到时间超时
        while panduan1=='y':
            #以秒为单位设定抽奖参数,并抽奖
            a=input("请输入发送的弹幕:")
            b=float(input("发送弹幕的时间/s:"))
            c=float(input("发送弹幕的时间间隔/s:"))

            starttime=time.time()#获取此时时间

#此时时间减去开始时间比设定的弹幕发送时间小,则一直发送

            while(time.time() - starttime < b):
                WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea'))

                browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(a)#将弹幕传入输入框
                time.sleep(c)#弹幕间的时间间隔
                browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(Keys.ENTER)
            panduan1 = input("请输入是否继续在此直播间y/n:")
    elif c_type==2:

进入字典发弹幕循环,如果超时则暂停发送
        while panduan1=='y':
            #以秒为单位设定抽奖参数,并抽奖
            a=input("请输入文件名:")
            f_word = open(a + ".txt", 'r', encoding='UTF-8')#打开字典文件
            b=float(input("发送弹幕的时间/s:"))
            c=float(input("发送弹幕的时间间隔/s:"))

            starttime=time.time()

            while(time.time() - starttime < b):
                line=f_word.readline()#按行读取字典内的内容

#当字典数据读完后,重新从开始位置进行读取
                if line == '':
                    f_word.close()
                    f_word = open(a + ".txt", 'r', encoding='UTF-8')
                    continue
                WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea'))
                line.replace("\n","")#将读取到的每一行的换行符删掉
                pyperclip.copy(line)#将读取到的内容填入剪切板
                browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(Keys.CONTROL,'v')#模拟键盘ctrl+v进行粘贴操作
                time.sleep(c)
                browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(Keys.ENTER)
            f_word.close()
            panduan1 = input("请输入是否继续在此直播间发送弹幕y/n:")
    panduan=input("请输入是否换一个直播间y/n:")

封装

结合thinter和pyinstaller可以封装成一个可移植的程序,只需在程序文件夹下放入自己系统谷歌浏览器对应的chromedriver.exe就可以实现在不同windows系统上进行迁移

资源地址:https://download.csdn.net/download/duoduowangjia/13738768

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/duoduowangjia/article/details/111440452

智能推荐

Mysql断流_彻底解决ROS网页断流问题-程序员宅基地

文章浏览阅读210次。首先,检查你的ROS,确定他本身没有任何问题。然后,打开你的WINBOX登陆进去,打开防火墙规则,IP-FIREWALL-CONNECTIONS-TRACKING好了。打开TRACKING后,将里面的时间设置稍微大点。具体多大,没有确切数字,不过一定要大。最少也得30秒以上。你按照里面的默认,成倍数增加,慢慢试。下面是我自己的设置。已经没有问题了,具体什么原因,慢慢去体会。这个设置不是固定的。因为..._ros wan口断流

To display the conditions report re-run your application with 'debug' enabled.问题解决方案-程序员宅基地

文章浏览阅读8.2w次,点赞17次,收藏77次。问题描述:Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.或者:The Tomcat connector configured to listen on port 7001 failed to start. The po..._to display the conditions report re-run your application with 'debug' enable

数字经济新生态,中小企业如何发展营销数字化-程序员宅基地

文章浏览阅读233次。在新经济发展态势下,#中小企业数字化转型#是大势所趋!

python 结束进程 terminate_【Python】multiprocessing.Process.terminate()结束子进程将导致子进程无法执行finally块,如何解决?...-程序员宅基地

文章浏览阅读2.2k次。我在使用multiprocessing库创建进程的时候,发现了这么一个问题:https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.Process中对于terminate函数的文档中说:Note that exit handlers and finally clauses, etc., will not be..._process.terminate()

TypeScript中的泛型-程序员宅基地

文章浏览阅读180次。在ts中,泛型允许在定义函数、接口类和类型别名时,不预先指定具体类型,而是在使用时指定。以达到增加代码复用性和代码安全性的目的。下面举几个例子。

唯快不破:TCP/IP详解--数据链路层 & 以太网帧格式_trdp数据链路层帧格式-程序员宅基地

文章浏览阅读246次。链路层上最常见的封装就是以太网和IEEE 802封装,这里就使用以太网作为讲解的对象。一、概述 数据链路层属于计算机网络的底层,使用的信道主要有点对点信道和广播信道两种类型。 在TCP/IP协议族中,数据链路层主要有三个目的: 1)为IP模块发送和接收数据 2)为ARP模块发送ARP请求和接收ARP应答 _trdp数据链路层帧格式

随便推点

linux怎么用脚本跑svs,在Linux操作系统下安装与运行GAMIT软件-程序员宅基地

文章浏览阅读160次。1、引言随着GPS技术的发展,在大地测量、工程测量、地球动力学、GPS气象学等多种学科中得到广泛的应用,精密解算GPS观测数据的软件也得到了重视与发展。国内外开发了许多GPS数据处理软件,主要有著名的美国麻省理工学院(MIT)和斯克里普斯海洋研究所(SIO)开发的GAMIT软件,美国宇航局(NASA)喷气推进实验室(JPL)研发的GIPSY-OASIS软件,以及瑞士伯尔尼大学天文研究所研制的BER..._由arc(轨道积分)、model(组成观测方程)、sincln(单差自动修复周跳)、dblcln(双差

Node.js毕业设计环保小卫士app(Express+附源码)-程序员宅基地

文章浏览阅读849次,点赞19次,收藏12次。综上所述,环保小卫士APP的开发不仅可以满足公众对环保知识和行动的需求,还可以促进环保事业的发展,提高社会的环保意识和行动水平。通过利用前端技术(HTML+CSS+JavaScript+Vue)、后端技术(Node.js+Express)和数据库(MySQL 5.7),结合开发工具(VSCode和Navicat),我们可以构建一个功能强大、用户友好的环保小卫士APP,为用户提供全面的环保服务和指导。其次,该应用可以促进环保活动的组织和参与,鼓励人们积极参与到环保事业中,共同为环境保护做出贡献。

仓库标签V1.2基站——系统结构-程序员宅基地

文章浏览阅读42次。仓库标签V1.2基站——系统结构

如何使用react框架进行两个html页面的切换?_react页面跳转-程序员宅基地

文章浏览阅读1k次,点赞19次,收藏7次。如何使用react框架进行两个html页面的切换?_react页面跳转

使用Open3D绘制圆形点云_open3d怎么生成圆点状点云-程序员宅基地

文章浏览阅读106次。然后,我们使用三角函数计算每个角度对应的x和y坐标,并在z轴上生成一系列为0的坐标,以形成平面点云。最后,我们将x、y和z坐标合并为一个点云数组,并使用。Open3D是一个用于处理三维数据的开源库,它提供了各种功能,包括点云处理和可视化。在本文中,我们将使用Open3D来绘制一个圆形点云。接下来,我们设置了圆形点云的半径、中心坐标和点的数量。最后,我们创建了一个可视化窗口,并将点云添加到可视化器中。然后,我们运行可视化器,显示圆形点云。,该函数根据给定的半径、中心和点的数量创建一个圆形点云。_open3d怎么生成圆点状点云

枚举类——概述、常用方法、自定义枚举类、Enum创建枚举类-程序员宅基地

文章浏览阅读9k次,点赞13次,收藏27次。一、枚举类的概述1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类2.当需要定义一组常量时,强烈建议使用枚举类3.如果枚举类中只一个对象,则可以作为单例模式的实现方式。二、枚举类中的常用方法values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。toString_枚举类