原本设想是使用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系统上进行迁移