python_07
破解极限滑动认证
from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import time
import random # 截取图片函数
def cut_image(driver):
driver.save_screenshot('image.png') img = driver.find_element_by_class_name('geetest_canvas_img') left = img.location['x']
upper = img.location['y'] right = left + img.size['width']
lower = upper + img.size['height'] image_obj = Image.open('image.png')
img_cut = image_obj.crop((left, upper, right, lower))
# img_cut.show()
return img_cut # 得到完整图片
def get_image1(driver): js_code = '''
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="block";
console.log(x)
''' time.sleep(0.2)
driver.execute_script(js_code) time.sleep(0.2)
img1 = cut_image(driver) return img1 # 得到缺口图片
def get_image2(driver):
js_code = '''
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="none";
console.log(x)
''' time.sleep(0.2)
driver.execute_script(js_code) time.sleep(0.2)
img2 = cut_image(driver) return img2 # 对比图片,得到滑动距离
def get_distance(img1, img2): # 小滑块右侧位置
start_location = 60 # 像素差
threshold = 60 for i in range(start_location, img1.size[0]):
for j in range(img1.size[1]): # 获得点(i,j)处的RGB像素值
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 not (r < threshold and g < threshold and b < threshold):
# 有误差,减去7
return i-7 def get_tracks(distance):
distance += 20
v0 = 0
a_list = [3, 4, 5]
t = 0.2
s = 0 # 向前滑动轨迹
forward_tracks = []
mid = distance * 3 / 5
while s < distance:
if s < mid:
a = a_list[random.randint(0, 2)]
else:
a = -a_list[random.randint(0, 2)] v = v0
stack = v * t + 0.5 * a * (t ** 2) # 每次拿到的位移
stack = round(stack)
s += stack
v0 = v + a * t forward_tracks.append(stack) back_tracks = [-1, -1, -2, -3, -2, -3, -2, -2, -3, -1] return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks} def main(user, pwd): driver = webdriver.Chrome()
driver.maximize_window() try:
driver.implicitly_wait(10)
driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') username = driver.find_element_by_id('LoginName')
username.send_keys(user)
time.sleep(1) password = driver.find_element_by_id('Password')
password.send_keys(pwd)
time.sleep(1) submit = driver.find_element_by_id('submitBtn')
submit.click()
time.sleep(1) # 获取完整图片
img1 = get_image1(driver) # 获取缺口图片
img2 = get_image2(driver) # 获取移动距离
distance = get_distance(img1, img2) # 获取滑动轨迹,模拟人的滑动轨迹
tracks = get_tracks(distance) button = driver.find_element_by_class_name('geetest_slider_button')
ActionChains(driver).click_and_hold(button).perform() for forward_track in tracks['forward_tracks']:
ActionChains(driver).move_by_offset(xoffset=forward_track, yoffset=0).perform()
time.sleep(0.2) for back_track in tracks['back_tracks']:
ActionChains(driver).move_by_offset(xoffset=back_track, yoffset=0).perform() ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
time.sleep(0.1) ActionChains(driver).release().perform()
time.sleep(3)
finally:
driver.close() if __name__ == '__main__': user = '********'
pwd = '****************'
main(user, pwd)
python_07的更多相关文章
- python_07 函数作用域、匿名函数
函数的作用域:无论在哪个地方调用函数,函数运行过程中的作用域只跟定义的时候有关,跟在哪个地方调用无关. name='alex' def foo(): name = 'linhaifeng' def b ...
随机推荐
- 9.Linux用户管理(下)
1. 为用户添加密码 [root才能执行] 1为新用户添加密码{只能是root} {密码尽可能的复杂} [0-9][a-Z][a-Z] [!@#$%^&]* [root@yinwucheng ...
- Arduino学习笔记⑦ EEPROM断电保存数据
1.前言 EEPROM,叫做电可擦可编程可读寄存器(是不是觉得好官方,不知道是什么鬼?反正我也一脸懵逼),只需要知道这是一种断电后数据不会丢失的存储设备,可以用来应对需要做记录做保存的场合.简 ...
- CocosCreator中_worldMatrix到底是什么(下)
Cocos Creator 中 _worldMatrix 到底是什么(下) 1. 摘要 上篇介绍了矩阵的基本知识以及对应图形变换矩阵推倒.中篇具体介介绍了对应矩阵转换成cocos creator代码的 ...
- JVM 启动调优总结
启动命令 格式: java -jar 命令行参数 jar包路径 .示例如下 java -Dfile.encoding=utf-8 -jar -XX:MetaspaceSize=128m -XX:Max ...
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)报错
今天用spring整合mybatis的时候,报了这个错误.去网上查了一下,网上大多数都是用户权限问题,但是我用SQLyog视图使用root用户crud没有问题,排除了是权限的问题,后面发现是idea提 ...
- C#解析深浅拷贝
前言 前面我们学习完了设计模式,在其中我们有了解到原型模式.这里涉及到了克隆自身对象.那么也就是对对象进行拷贝.这里就涉及到了这么一个概念.深浅拷贝.何为深拷贝何为浅拷贝呢?我们一起来看看吧. 浅拷贝 ...
- Sqoop的安装和验证
Sqoop是一个用来完成Hadoop和关系型数据库中的数据相互转移的工具,它可以将关系型数据库中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中. Kafka是一个开源 ...
- Shiro笔记---授权
1.搭建shiro环境(*) idea2018.2.maven3.5.4.jdk1.8 项目结构: pom.xml: <?xml version="1.0" encoding ...
- egg-sequelize --- nodejs
项目 egg + sequelize + mysql2 项目结构 配置 安装模块 npm install --save egg-sequelize npm install --save egg-cor ...
- phpStorm //todo 的用途
用phpstorm看到别人的代码使用了注释//todo,且todo是彩色的 我想这个应该是有点用的吧,于是百度了下,大概是可能由于某些原因,导致部分代码没有写.但又怕忘了, 用//todo就可以做提示 ...