滑动验证码
编程思路
封装一个函数进行登录
创建一个driver对象 找到输入框和密码框,将用户名和密码输入 找到登录按钮 破解滑动验证码(封装函数) 关闭浏览器对象
封装一个函数,用于破解滑动验证码
计算滑动距离
截取带缺口的图(封装函数) 用js语句去掉缺口 截取不带缺口的图 把去掉的缺口补回来 根据两张图片的缺口处的像素差异,来求出存在差异的第一个像素的x轴坐标,即为滑动距离(封装函数)
模拟人类的动作来滑动
按住滑块按钮 按照距离来拖动(封装函数) 前向移动 松开滑块按钮
定义一个函数用于截图
截取整个浏览器的图 加载图片 从整个浏览器区域中截取出验证码区域
提取验证码区域的位置(距x轴和距y轴的距离) 提取验证码区域的大小(宽和高)
根据位置和大小来计算验证码区域的截取范围 根据截取范围将验证码区域的图片截取出来 返回截取的图片
封装一个函数,用于根据两张图片的像素差异来计算滑动距离
获取每一个像素点的rgb值 计算两个图片的rgb差异 判断差异是否大于经验值,大于则返回该像素点的x坐标,即为移动距离
封装一个函数模拟匀加速运动的轨迹
定义滑动距离拖动的时候多拖出去20(完全模拟人操作) 定义一个中间位置,前面加速,后面减速 定义一个变量用于存放每一段的轨迹 将每一段的位移s加入轨迹中 返回一个字典,存放前向和反向轨迹
代码实现
from selenium import webdriver
from time import sleep
from PIL import Image
from selenium. webdriver import ActionChains
def shot_img ( driver) :
sleep( 2 )
driver. save_screenshot( "./page.png" )
img = Image. open ( "./page.png" )
loc = driver. find_element_by_class_name( "geetest_slicebg" ) . location
size = driver. find_element_by_class_name( "geetest_slicebg" ) . size
top = loc[ "y" ]
bottom = loc[ "y" ] + size[ "height" ]
left = loc[ "x" ]
right = loc[ "x" ] + size[ "width" ]
code_img = img. crop( ( left* 2 , top/ 2 , right* 2 , bottom* 1.2 ) )
return code_img
def get_distance ( img1, img2) :
for i in range ( 50 , img1. size[ 0 ] ) :
for j in range ( 0 , img1. size[ 1 ] ) :
rgb1 = img1. load( ) [ i, j]
rgb2 = img2. load( ) [ i, j]
r = abs ( rgb1[ 0 ] - rgb2[ 0 ] )
g = abs ( rgb1[ 1 ] - rgb2[ 1 ] )
b = abs ( rgb1[ 2 ] - rgb2[ 2 ] )
if r> 60 and g> 60 and b> 60 :
return i/ 2 - 6
def tracks ( distance) :
distance += 20
v = 0
t = 0.2
mid = distance* 3 / 5
current = 0
farwords = [ ]
while current < distance:
if current < mid:
a = 2
else :
a = - 3
s = v* t + 1 / 2 * a* t** 2
v = a* t + v
current += s
farwords. append( round ( s) )
return { "farwords" : farwords, "backs" : [ - 3 , - 3 , - 3 , - 2 , - 2 , 2 , - 2 , - 2 , - 3 , - 1 , - 1 ] }
def crack_code ( driver) :
img1 = shot_img( driver)
js = "document.querySelector('.geetest_canvas_slice').style.zIndex=10;document.querySelector('.geetest_canvas_slice').style.display='block';document.querySelector('.geetest_canvas_fullbg').style.display='block';"
driver. execute_script( js)
img2 = shot_img( driver)
js = "document.querySelector('.geetest_canvas_slice').style.zIndex=10;document.querySelector('.geetest_canvas_slice').style.display='block';document.querySelector('.geetest_canvas_fullbg').style.display='none';"
driver. execute_script( js)
distance = get_distance( img1, img2)
print ( distance)
btn = driver. find_element_by_class_name( "geetest_slider_button" )
ActionChains( driver) . click_and_hold( btn) . perform( )
sleep( 0.5 )
track_dict = tracks( distance)
for track in track_dict[ "farwords" ] :
ActionChains( driver) . move_by_offset( xoffset= track, yoffset= 0 ) . perform( )
sleep( 0.5 )
for track in track_dict[ "backs" ] :
ActionChains( driver) . move_by_offset( xoffset= track, yoffset= 0 ) . perform( )
sleep( 0.5 )
ActionChains( driver) . release( ) . perform( )
def login_blogs ( url, name, password) :
driver = webdriver. Chrome( )
try :
driver. get( url)
sleep( 1 )
driver. find_element_by_id( "LoginName" ) . send_keys( name)
driver. find_element_by_id( "Password" ) . send_keys( password)
driver. find_element_by_id( "submitBtn" ) . click( )
sleep( 1 )
crack_code( driver)
sleep( 5 )
finally :
driver. close( )
if __name__ == '__main__' :
url = "https://account.cnblogs.com/signin"
login_blogs( url, "qwer" , "1234" )