什么网站做电脑系统好,2018年做网站赚钱,设计网站 f,给wordpress添加背景音乐闲得无聊#xff0c;趁着休息研究了一下极验4滑块验证码的安全性#xff0c;是否有机器识别、自动化拖拽的可能性。首先看一下效果 如何识别验证码
1、下载图片
下载图片可以参考博客《采集极验4滑块验证码图片数据》 2、标记图片 3、标记滑动距离 实现代码
__author__ 趁着休息研究了一下极验4滑块验证码的安全性是否有机器识别、自动化拖拽的可能性。首先看一下效果 如何识别验证码
1、下载图片
下载图片可以参考博客《采集极验4滑块验证码图片数据》 2、标记图片 3、标记滑动距离 实现代码
__author__ dengxinyanimport io
import re
import time
import json
import base64
import random
import requests
import urllib
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ChromeOptions
from selenium.webdriver import FirefoxOptions# PIL图片保存为base64编码
def PIL_base64(img, codingutf-8):img_format img.formatif img_format None:img_format JPEGformat_str JPEGif png img_format.lower():format_str PNGif gif img_format.lower():format_str gifif img.mode P:img img.convert(RGB)if img.mode RGBA:format_str PNGimg_format PNGoutput_buffer BytesIO()# img.save(output_buffer, formatformat_str)img.save(output_buffer, quality100, formatformat_str)byte_data output_buffer.getvalue()base64_str data:image/ img_format.lower() ;base64, base64.b64encode(byte_data).decode(coding)return base64_str# 验证码识别接口
def shibie(img):url http://www.detayun.cn/openapi/verify_code_identify/data {# 用户的keykey:nWrzPFUgFuqXQrCJJUM6,# 验证码类型verify_idf_id:23,# 样例图片img_base64:PIL_base64(img),img_byte: None,# 中文点选空间语义类型验证码的文本描述这里缺省为空字符串words:}header {Content-Type: application/json}# 发送请求调用接口response requests.post(urlurl, jsondata, headersheader)print(response.text)return response.json()def run(headlessFalse):# 保存已经下载过的图片防止重复img_url_list []# 配置参数option FirefoxOptions()if headless:option.add_argument(--headless)else:option.add_argument(--window-size100,100)driver webdriver.Firefox(executable_pathrwebdriver\geckodriver.exe, optionsoption)# 伪装浏览器driver.execute_script(Object.defineProperty(navigator, webdriver, {get: () false,});)navigator_webdriver driver.execute_script(return navigator.webdriver)driver.execute_script(Object.defineProperty(navigator, plugins, {get: () [1, 2, 3, 4, 5],});)plugins_length driver.execute_script(return navigator.plugins.length)# 发送请求driver.get(https://www.geetest.com/adaptive-captcha-demo)# 等待【滑动拼图验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath(//button[contains(text(),一点即过验证)]))# 创建 ActionChains 对象action ActionChains(driver)# 向窗口发送按键事件例如向下滚动 1000pxaction.send_keys([Keys.DOWN, Keys.DOWN, Keys.DOWN, Keys.DOWN, Keys.DOWN, Keys.DOWN], 1000)action.perform()for i in range(5):# 等待【滑动拼图验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath(//button[contains(text(),一点即过验证)]))# 找到【滑动拼图验证】元素tag1 driver.find_element_by_xpath(//button[contains(text(),一点即过验证)]/..)# 点击tag1.click()time.sleep(1)# 等待【滑动拼图验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath(//button[contains(text(),滑动拼图验证)]))# 找到【滑动拼图验证】元素tag1 driver.find_element_by_xpath(//button[contains(text(),滑动拼图验证)]/..)# 点击tag1.click()time.sleep(1)# 等待【点击按钮开始验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath(//div[aria-label点击按钮开始验证]))# 找到【点击按钮开始验证】元素tag2 driver.find_element_by_xpath(//div[aria-label点击按钮开始验证])# 点击tag2.click()# 等待【验证码大图】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath(//div[contains(class,geetest_bg)]))while 1:try:# 找到【注册】元素tag7 driver.find_element_by_xpath(//div[contains(class,geetest_bg)])# 获取 img 标签的 src 属性style tag7.get_attribute(style)# 提取图片链接img_url re.findall(url[(](.?)[)], style)[0]breakexcept:continue# 请求获取图片response requests.get(urlimg_url)img Image.open(BytesIO(response.content))# img base64_PIL(base64_str)# 保存图片img.save(temp_img/{}.jpg.format(int(time.time() * 1000)))img_url_list.append(img_url)# 验证码识别接口result shibie(img)if result[code] ! 200:print(result)returnmove_x int(result[data][res_str].replace(滑动, ).replace(px, ))print(结果, move_x)time.sleep(2)# 找到滑块 geetest_btn# 等待【找到滑块】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath(//div[contains(class,geetest_btn)]))# 找到【找到滑块】元素tag8 driver.find_elements_by_xpath(//div[contains(class,geetest_btn)])[1]print(tag8)# 滑动滑块action ActionChains(driver)action.click_and_hold(tag8).perform()# 计算实际滑动距离 像素距离 前面空白距离move_x move_x - 15action.move_by_offset(move_x, 0)# n (random.randint(3, 5))# move_x move_x / n# for i in range(n):# action.move_by_offset(move_x, 0)# time.sleep(0.02)action.release().perform()# 判断是否滑动成功time.sleep(2)if __name__ __main__:run(headlessFalse)极验4滑块验证码识别我也封装成了API接口可以提供给大家免费调用得塔云
总结
1、和极验3相比极验4大图反爬能力变弱了。因为极验3图片链接很快就会失效。
2、和极验3相比极验4图片的解析难度变小了。因为极验3的图片是打乱的还需要拼图。
3、极验4滑动过程也没有验证滑动轨迹