700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 滑动验证码识别----解决天眼查自动登录问题

滑动验证码识别----解决天眼查自动登录问题

时间:2021-11-10 15:39:58

相关推荐

滑动验证码识别----解决天眼查自动登录问题

滑动验证码验证如下图所示:

解决这个问题的思路:

1、获取无缺口和有缺口的两张图片,即:下图所示:

2、对比两张图片的像素点,像素点差值超过一定值即可视为缺口点(这里对比像素点时最好将开始的那一部分截取出来不对比,因为滑块滑动的距离肯定不会为0)。

3、找到缺口之后计算活动距离,并模拟人工滑动滑块。

有了这个思路之后贴一下核心代码:

截取图片(首先需要定位到图片的位置并获取size):

screenshot = driver.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))captcha1 = screenshot.crop((left, top, right, bottom))captcha1.save('captcha1.png')

获取偏移量,也就是缺口的位置(这里得出的偏移量可能会有误差,因此其值的大小需要多试验几次去校准):

left = 55 # 这个是去掉开始的一部分for i in range(left, captcha1.size[0]):for j in range(captcha1.size[1]):# 判断两个像素点是否相同pixel1 = captcha1.load()[i, j]pixel2 = captcha2.load()[i, j]threshold = 60if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:passelse:left = i

模拟人工滑动(先加速后减速,先滑过在滑回来。滑动若是匀速、快速、精准的话那都会被判定为是机器操作):

# 移动轨迹track = []# 当前位移current = 0# 减速阈值mid = distance * 2 / 5# 计算间隔t = 0.2# 初速度v = 1while current < distance:if current < mid:# 加速度为正2a = 5else:# 加速度为负3a = -2# 初速度v0v0 = v# 当前速度v = v0 + atv = v0 + a * t# 移动距离x = v0t + 1/2 * a * t^2move = v0 * t + 1 / 2 * a * t * t# 当前位移current += move# 加入轨迹track.append(round(move))track += [5, -5] # 滑过去再滑过来,不然有可能被吃

有了滑动的速度只有再用selenium点击滑动就OK了,最后别忘记加一个验证通过的代码,如果没通过记得删除cookie重来一遍。

这个验证识别是参考了崔老师的书上的内容并加了一下自己的理解的思路,有需要完整代码的童鞋可以联系我。

完整代码(有用的小伙伴记得点赞关注呀):

# coding=utf-8from selenium import webdriverimport timefrom PIL import Image,ImageGrabfrom io import BytesIOfrom mon.action_chains import ActionChainsfrom selenium.webdriver.support import expected_conditions as ECimport tesserocr'''用于天眼查自动登录,解决滑块验证问题'''def get_track(distance):"""根据偏移量获取移动轨迹:param distance: 偏移量:return: 移动轨迹"""# 移动轨迹track = []# 当前位移current = 0# 减速阈值mid = distance * 2 / 5# 计算间隔t = 0.2# 初速度v = 1while current < distance:if current < mid:# 加速度为正2a = 5else:# 加速度为负3a = -2# 初速度v0v0 = v# 当前速度v = v0 + atv = v0 + a * t# 移动距离x = v0t + 1/2 * a * t^2move = v0 * t + 1 / 2 * a * t * t# 当前位移current += move# 加入轨迹track.append(round(move))return trackdef autologin(account, password):driver.get('/?jsid=SEM-BAIDU-PP-SY-000873&bd_vid=7864822754227867779')time.sleep(3)try:driver.find_element_by_xpath('//*[@id="tyc_banner_close"]').click()except:passdriver.find_element_by_xpath('//*[@id="web-content"]/div/div[1]/div[1]/div/div/div[2]/div/div[4]/a').click()time.sleep(3)# 这里点击密码登录时用id去xpath定位是不行的,因为这里的id是动态变化的,所以这里换成了class定位driver.find_element_by_xpath('.//div[@class="modal-dialog -login-box animated"]/div/div[2]/div/div/div[3]/div[1]/div[2]').click()time.sleep(3)accxp = './/div[@class="modal-dialog -login-box animated"]/div/div[2]/div/div/div[3]/div[2]/div[2]/input'pasxp = './/div[@class="modal-dialog -login-box animated"]/div/div[2]/div/div/div[3]/div[2]/div[3]/input'driver.find_element_by_xpath(accxp).send_keys(account)driver.find_element_by_xpath(pasxp).send_keys(password)clixp = './/div[@class="modal-dialog -login-box animated"]/div/div[2]/div/div/div[3]/div[2]/div[5]'driver.find_element_by_xpath(clixp).click()# 点击登录之后开始截取验证码图片time.sleep(2)img = driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[1]/div[2]/div[1]')time.sleep(0.5)# 获取图片位子和宽高location = img.locationsize = img.size# 返回左上角和右下角的坐标来截取图片top,bottom,left,right = location['y'], location['y']+size['height'], location['x'], location['x']+size['width']# 截取第一张图片(无缺口的)screenshot = driver.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))captcha1 = screenshot.crop((left, top, right, bottom))print('--->', captcha1.size)captcha1.save('captcha1.png')# 截取第二张图片(有缺口的)driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[2]/div[2]').click()time.sleep(4)img1 = driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[1]/div[2]/div[1]')time.sleep(0.5)location1 = img1.locationsize1 = img1.sizetop1,bottom1,left1,right1 = location1['y'], location1['y']+size1['height'], location1['x'], location1['x']+size1['width']screenshot = driver.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))captcha2 = screenshot.crop((left1, top1, right1, bottom1))captcha2.save('captcha2.png')# 获取偏移量left = 55 # 这个是去掉开始的一部分for i in range(left, captcha1.size[0]):for j in range(captcha1.size[1]):# 判断两个像素点是否相同pixel1 = captcha1.load()[i, j]pixel2 = captcha2.load()[i, j]threshold = 60if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:passelse:left = iprint('缺口位置', left)# 减去缺口位移left -= 54# 开始移动track = get_track(left)print('滑动轨迹', track)track += [5, -5, 2, -2] # 滑过去再滑过来,不然有可能被吃# 拖动滑块slider = driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[2]/div[2]')ActionChains(driver).click_and_hold(slider).perform()for x in track:ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()ActionChains(driver).release().perform()time.sleep(2)try:if driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[2]/div[2]'):print('能找到滑块,重新试')driver.delete_all_cookies()driver.refresh()autologin(driver, account, password)else:print('login success')except:print('login success')# if __name__ == '__main__':driver_path = 'C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe'# chromeoption = webdriver.ChromeOptions()# chromeoption.add_argument('--headless')# chromeoption.add_argument('user-agent='+user_agent)driver = webdriver.Chrome(driver_path)driver.maximize_window()driver.implicitly_wait(10)account = 'xxxx'password = 'xxxx'autologin(account, password)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。