用时四天,踩了很多坑,自己来总结一下,给自己一个记录,第一次写博客也不是很懂,就先按自己的想法来写,可能排版会比较乱一些
————————————————————分割线——————————————————————–
之前发了之后有比赛就没去弄了,再后面有其他事也没去整理了,现在已经几个月后了来整理一下(不过易班已经更新了,得跟进改一下才行,不过我主要还是总结下用法)
首先根据用什么浏览器就去下载对应的驱动,像我是用edge浏览器所以就去官 下载了edgedriver了, 上有很多安装的教程我就不再说了,就是得注意下版本 得跟上,只要别相差太多就可以用
首先我先介绍一下我用到的库,我用到了有
PyQt5(做界面的,之前比赛用到了学过就顺便用在这里看效果)、
selenium(重点)、
time(延时一分钟发动态和投票)、
random(用来随机发送文本)、
numpy(保存和加载文本txt文件,我用txt文件来记录token和密码还有已经刷了的次数)
这里做UI的PyQt5我就不讲了,只是做界面而已,最主要的还是功能
下面的是我的界面布局,最上面从左到右分别是名字,对应的token,最右边的是已经刷了的次数
这一句用来设置要操作页面对象时候的最大等待响应时间,这样不至于说像是页面找不到元素之后就直接跳过他了,找不到的话会持续一段时间在找那个元素,有时候可能因为 络原因没有马上刷新出来,后面的参数就是设置的最大等待时间
使用下面这一句加载到指定 址,现在这个是易班登录的 址
登录账 的问题
登录账 很多时候都要输入验证码,用图像识别出文字的话本菜鸡还不会弄而且因为验证码背景太花了不好识别,所以我采用了给他添加cookie的方式来登录,但是前提是我们得获得他的cookie,易班用到的cookie主要就是那个user_token,获取到之后再用selenium里面的api把cookie加到页面进去再刷新一遍就可以登录上去跳过验证码。
接下来我来说一下我自己当时登录账 用的几个方法
(1)、最开始我是用的手动去浏览器登录账 时候来获取,复制了再填入到程序中,后面我弄了界面就直接粘贴在我界面中间那一列中去,每次开始运行都会获取上面的文本作为token弄成字典的格式用api来操作。
(2)、我使用了selenium库里的另一个api可以获取登录界面的cookie,可以省去自己去找那个cookie并且复制粘贴出来等操作,从获取到的cookie中筛选出token再保存起来,保存后我会覆盖掉上次旧的token(易班隔个一两天的就会更换token,老麻烦了)。
说了想法思路再看看怎么实现的这一步,用selenium库来操作最常用的就是查找元素,接着进行模拟点击或者添加文字
查找元素
查找元素有四种方式,有通过 Class、Xpath、Id、Css四种方法对应的api分别是
模拟点击
下面是我采用的模拟点击的操作方式,用 java script 的方式来模拟点击效果稳定特别特别多!单纯的用那个 .click() 经常会遇到各种奇奇怪怪的,所以强烈推荐用这个方法,我就是封装了四个按类来查找元素进行模拟点击的函数,可以不用每次一点击就写这么两三行的。
其中的那个sleep很有必要加上,延时一小段时间给浏览器缓一缓,我试过不加这样有时候浏览器会卡住
添加文字
添加文字主要用到的就只有一两个,我用到的只有
只要在查找到的元素后面加上 .send_key() 就可以加上自己要的文字内容,我这两行表示的是从上面我txt文本里面读取出来的账 和密码添加到易班登录界面上的账 和密码栏中
账 登录操作
说完基本的现在来说一下我是怎么登录操作的
cookie = self.line_text.text() #界面token栏上的文本内容,按我txt文件里面的内容加载在上面的c = {'name': 'yiban_user_token', 'value': f'{cookie}'} #加载上我txt文本里面读取到的tokenself.driver.get('https://www.yiban.cn/logino=http%3A%2F%2Fwww.yiban.cn%2F') #登录界面sleep(0.7)self.driver.add_cookie(c) #加载cookiesleep(0.7)self.driver.refresh() #加载后要刷新一下页面try: self.driver.find_element_by_class_name('yiban-apps') #尝试查找登录成功后页面的一个元素 sleep(0.7) self.browser_texy.append(f'当前的用户:{current_name}ntoken:n{cookie}n') self.process() #包含所有刷取操作 msg = QMessageBox(QMessageBox.Information, '完成', '完成') #加信息栏提示刷完了 msg.addButton('关闭', QMessageBox.AcceptRole) msg.exec_()except: #若查找不到上面要查找的元素则运行下面这一部分来获取cookie self.driver.get('https://www.yiban.cn/logino=http%3A%2F%2Fwww.yiban.cn%2F') #登录界面 sleep(0.7) ################################################################# #读取txt文件内的内容,字符类型,按逗 分割,utf8的编码方式 name_pwd = loadtxt('passwd.txt',dtype=str,delimiter=',',encoding='utf8') #只有一个人的数据 if name_pwd.size == 3: user = name_pwd[1] pwd = name_pwd[2] elif name_pwd.size>3: #遍历 for name in name_pwd: if name[0] == self.name_com.currentText(): #判断是否和当前名字下拉框的名字对应 user = name[1] pwd = name[2] ################################################################# self.driver.find_element_by_id('account-txt').send_keys(f'{user}') #添加上账 self.driver.find_element_by_id('password-txt').send_keys(f'{pwd}') #添加上密码 self.Element_Click_ByCalss('checkbox') #点击上自动登录按钮(好像没勾上就没有token出来的,不太记得了) self.Element_Click_ByXpath('/html/body/main/div[1]/div[2]/ul/li[1]/div[6]/a') #点击登录按钮 msg = QMessageBox(QMessageBox.Information, 'token无效', '登录之后点击确定') #添加信息栏 msg.addButton('确定', QMessageBox.AcceptRole) #增加按钮,用于后续交互 msg.exec_() #程序会一直停在这里,直到按下了信息栏里的按钮 #自己填写完验证码(可能没有)点击登录之后就点击确定按钮,下面这一句调用的api会获取页面的cookie coo = self.driver.get_cookies() for i in coo: if i['name'] == 'yiban_user_token': #遍历寻找token tok = i['value'] self.update_Token(tok) #自己写的函数用来更新token self.driver.quit() #退出关闭浏览器# 主流程def process(self):if self.sign_in_btn.isChecked(): #检测界面中方框是否被勾上了,我默认是勾上的 self.browser_texy.append("开始签到n") #提示文本信息 app.processEvents() self.sign_in() sleep(0.7)if self.yi_miaomiao_btn.isChecked(): self.browser_texy声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!