Python完全识别验证码自动登录

 

转载请注明出处,QQ:11371902

1、直接贴代码

 

 

#!C:/Python27
#coding=utf-8


from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from pytesser import *
from PIL import Image,ImageEnhance,ImageFilter
from selenium.common.exceptions import NoSuchElementException,TimeoutException
import os,time




def before():


    driver.get(src)


    time.sleep(1)


    driver.maximize_window() # 浏览器全屏显示


    print ('\n浏览器全屏显示 ...')






def Convertimg():
    
    imglocation = ("//*[@id='loginForm']/div[4]/div[2]/img[1]")
    
    #下载验证码图片保存到本地
    driver.save_screenshot('E:\\pythonScript\\Codeimages\\code.png')
    
    #打开本地图片
    im = Image.open('E:\\pythonScript\\Codeimages\\code.png')


    left = driver.find_element_by_xpath(imglocation).location['x']
    top = driver.find_element_by_xpath(imglocation).location['y']
    right = driver.find_element_by_xpath(imglocation).location['x'] + driver.find_element_by_xpath(imglocation).size['width']
    bottom = driver.find_element_by_xpath(imglocation).location['y'] + driver.find_element_by_xpath(imglocation).size['height']


    im = im.crop((left, top, right, bottom))


    im.save('E:\\pythonScript\\Codeimages\\screenshot.png')


    print u"\n保存验证码图片完成"


    #移除截屏的图片


    os.remove('E:\\pythonScript\\Codeimages\\code.png')


    print u"\n删除截屏图片完成"


    #处理验证码图片
    src = ('E:\\pythonScript\\Codeimages\\screenshot.png')


    #调用裁剪图片方法
    Cutedge(src)


    #移除截屏的图片
    os.remove('E:\\pythonScript\\Codeimages\\screenshot.png')
    #灰化图片处理
    im = Image.open('E:\\pythonScript\\Codeimages\\CutedgeImage.png')
    
    imgry = im.convert('L')
    #二值化处理


    threshold = 100
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    out = imgry.point(table, '1')


    out.save('E:\\pythonScript\\Codeimages\\rgb.png')


    #vcode = pytesseract.image_to_string(out)


    #print (vcode)


    txtcode = image_to_string(out)


    print u"\n识别出验证码文字为:",image_to_string(out)


    print len(txtcode.strip())


    print


    if len(txtcode.strip()) == 4:


            print u"长度相等"
                             
    else:
            print u"长度不相等,退出"
            
            driver.quit()


    #输入用户名和密码
    driver.find_element_by_id("username").send_keys("123456")


    driver.find_element_by_id("password").send_keys("123456")


    time.sleep(2)


    #对文本框输入验证码值
    driver.find_element_by_id("verifyCode").send_keys(txtcode.strip())


    time.sleep(3)
    #点击登录   
    driver.find_element_by_xpath("//*[@id='loginForm']/div[5]/div/img").click()
    #driver.find_element_by_class_name('loginbtn').click()
    time.sleep(7)
    
    
#针对有黑色边框的验证码图片的裁剪边缘    
def Cutedge(src):
    
    #设置要裁剪的区域
    im = Image.open(src)
    
    w, h = im.size
    
    print u"\n验证码原图宽、高尺寸为:",w,h
    
    box = (2,2,110,30)
    
    im.crop(box).save('E:\\pythonScript\\Codeimages\\CutedgeImage.png')


    print u"\n保存裁剪的图片 CutedgeImage.png"


#    
src = ("https://www.test.com")


driver = webdriver.Chrome() #Firefox()#


def method_2(src):
     
    before()


    #调用图片裁剪方法
    Convertimg()


    
def clickInput():


    driver.find_element_by_id("inputButton").click()


    print "\nInput Click Finish"


def clickOutput():


    print u"\n开始执行点击事件"


    #开始执行点击事件           inputButton
    driver.find_element_by_id("outputButton").click()


    time.sleep(2)


    print (u'\n开始执行任务,执行间隔时间为10分钟 ...')






    for i in range(1,4):


        ISOTIMEFORMAT="%Y-%m-%d %X"
    
        strTime = time.strftime( ISOTIMEFORMAT, time.localtime())


        driver.refresh()


        print u"\n正在执行第 ",i,"次...",strTime
    
        time.sleep(5)
    
        driver.find_element_by_id("outputButton").click()
    
        time.sleep(30)
    
        print
        #刷新浏览器
        print u"\n刷新当前页面 ..."
    
        driver.refresh()
    
        print (u'\n等待间隔时间为9分钟 ...')
    
        time.sleep(505)
    
        print u"\n已执行完第 ",i,u"次,",u"已等待",i*10,u"分钟"
      
    print (u'\n已执行完成...At The End OF,'+strTime)
    
    driver.quit()


def isPass():
    try:          
        #driver.find_element_by_id("username").is_displayed() == True
    
        driver.find_element_by_id('status').text == (u"验证码不正确!")
        
        print (u"\n****校验提示信息_验证码输入不正确****")


        driver.quit()


        print (u"\n关闭浏览器,执行外层循环...")
    
    except Exception:
        print (u"\n****校验提示信息_验证码输入正确****")


        clickOutput()  #------   click Output
    
method_2(src) #进入工作页面


isPass()


#clickInput()  #------   click Input


#clickOutput()  #------   click Output




for i in range(1,6):


    driver = webdriver.Chrome()
    
    src = ("https://www.test.com")


    method_2(src)


    isPass()
    
    #clickOutput()

 

 


2、控制台日志

 

 

 

 

 

浏览器全屏显示 ...

获取到元素的文本值为: 

保存验证码图片完成

删除截屏图片完成

验证码原图宽、高尺寸为: 113 34

保存裁剪的图片 CutedgeImage.png

识别出验证码文字为: gnbn



开始执行任务,执行间隔时间为10分钟 ...

正在执行第  1 次... 2017-05-25 18:10:24

刷新当前页面 ...

等待间隔时间为9分钟 ...

 

 

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值