每次登陆川农wifi都要输入密码,账号,验证码。好麻烦有木有,作为一个伪技术工作者,本着装逼的原则,准备自己写个脚本自动登陆wifi,川农校园wifi验证码简单,随便处理下识别率几乎百分百,脚本实用性相当高!
原理:使用自动化测试库selenuim操作谷歌浏览器输入账号,密码,验证码,点击登录。本脚本难点在验证码的识别.
安装和配置selenuim这里有很多坑,这里不是我们的重点,就不细讲,改天再写篇文章吧.....
讲难点:验证码识别,该验证码是镶嵌在网页中的(换句话说是js动态加载得到的),常用的访问网页下载获取验证码行不通,于是用第二个方法:selenuim截取部分屏幕,用PIL下的Image模块处理获取验证码。
crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。是crop((left,upper,right,lower)),有两层括号!
这里利用selenuim的location获取验证码图片的left和right的值。
element = driver.find_element_by_id('c:/python/screen.png') #打开所裁图片
left = int(element.location['x'])
upper = int(element.location['y'])
right = int(element.location['x'] + element.size['width']) #小技巧,开发者模式[F12],鼠标放在验证码上会自动显示宽和高
lower = int(element.location['y'] + element.size['height'])
个人理解:假设得到left的值20px,从大图原点(左上角)开始,水平右移20px,竖着切一刀
right的值是left基础上加上20px得到40px,同上,从大图原点(左上角)开始,水平右移40px,竖着切一刀
upper的值是30px,从大图原点(左上角)开始,水平下移30px,横着切一刀,lowe同理科的。四刀下去得到图片
记录selenuim踩过的坑:
1.selenuim只能定位元素,不能把你想要的元素提取出来(其实可以2018/12/3)
2. browser.find_element 和 browser.find_elements 是有区别的(后者多了个s),前者定位单个元素,后者定位元素集,后者返回一个列表,所以使用时要说明第几个,如browser.find_elements_by_id('passwd')[0].send_keys(str(123456))
from PIL import Image
from selenium import webdriver
import pytesseract
import cv2
import time
for i in range(3):
try:
browser=webdriver.Chrome()
browser.maximize_window() #使浏览器窗口最大化
browser.get('http://10.255.252.9/portalReceiveAction.do?wlanuserip=10.5.46.68&wlanacname=yatelcom&url=http://go.microsoft.com/fwlink/?LinkID=219472&clcid=0x409&radnum=408041&rand=5ac31368')
browser.get_screenshot_as_file("c:/python/pic/screen.png") #获得屏幕截图
browser.find_element_by_id("useridtemp").send_keys("账号") #定位账号框并输入
browser.find_element_by_id('passwd').send_keys(str("密码")) #定位密码框并输入
left=1070
upper=360
right=left+70
lower=upper+20 #已获取到裁剪数据
im=Image.open('c:/python/pic/screen.png')
im=im.crop((left,upper,right,lower)) #裁剪图片
im.save('c:/python/pic/identify.png')
img=cv2.imread('c:/python/pic/identify.png',0) #转化为灰度图为下面二值化图片做准备
ret3,img=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #利用最佳阈值使图片二值化(黑白化)
code= pytesseract.image_to_string(img) #调用谷歌光学识别图像软件识别图片并转换伪字符
num = '' #验证码为纯数字密码,但经常把2识别为字母Z,9识别为字母S,需要纠错转换
for i in range(4):
one = code[i:i + 1]
if one == "Z":
one = "2"
elif one == "S":
one = "9"
num = num + one
browser.find_element_by_id('validateCode').send_keys(str(num)) #定位并输入验证码
time.sleep(1) #很多时候还没来得及输入验证码就点击登录了,有必要休息一秒钟
browser.find_element_by_xpath('//input[@type="submit"]').click()#定位并点击登录
browser.get("http://www.baidu.com") #访问百度看是否登录成功
time.sleep(1)
browser.quit() #退出浏览器
break
except Exception as e:
print("此次登陆有误,请重新登陆")
browser.quit()