selenium自动登陆校园网wifi(含验证码处理)

      每次登陆川农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()

 

你可能感兴趣的:(python和爬虫,selenuim,爬虫,校园wifi,自动登陆)