selenium登录 京东滑动验证码
京东的滑动验证码在页面上是没有原图的,所有我是用ps把他们拼成一个的。
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
import time
import random def if_is_s(img_1, img_2):#判断是不是跟比较的是一张图
a = 0
for i in range(1, img_1.size[1]):
for j in range(1, 3):
rgb1 = img_1.load()[i, j]
rgb2 = img_2.load()[i, j]
res1 = abs(rgb1[0] - rgb2[0])
res2 = abs(rgb1[1] - rgb2[1])
res3 = abs(rgb1[2] - rgb2[2])
if res1 < 10 and res2 < 10 and res3 < 10:
a += 1
else:
a = 0
if a > 50:
return True
return False
def get_distance(image1,image2):#找出需要滑动的距离
a = 0
threshold=60
left=57
for i in range(left,image1.size[0]):
for j in range(image1.size[1]):
rgb1=image1.load()[i,j]
rgb2=image2.load()[i,j]
res1=abs(rgb1[0]-rgb2[0])
res2=abs(rgb1[1]-rgb2[1])
res3=abs(rgb1[2]-rgb2[2])
if not (res1 < threshold and res2 < threshold and res3 < threshold):
a += 1
return i+20
return i+20 def get_tracks(distance):#这是滑动轨迹的,京东的滑动轨迹很恶心,这个也是有时可以有时不行
tracks = []
current = 0
mid = distance * 4 / 5
t = 0.2
v = 0
while current < distance:
if current < mid:
a = random.uniform(2, 5)
else:
a = -(random.uniform(12.5, 13.5))
v0 = v
v = v0 + a * t
x = v0 * t + 1 / 2 * a * (t ** 2)
current += x
if 0.6 < current - distance < 1:
x = x - 0.53
tracks.append(round(x, 2))
elif 1 < current - distance < 1.5:
x = x - 1.4
tracks.append(round(x, 2))
elif 1.5 < current - distance < 3:
x = x - 1.8
tracks.append(round(x, 2))
else:
tracks.append(round(x, 2))
if sum(tracks) > distance:
i = sum(tracks) - distance
tracks[-1] = round(tracks[-1] - i, 2)
i = random.uniform(1, 3 )
i = round(i, 2)
zz = random.uniform(0.1, 0.3)
tracks[-1] = round(tracks[-1] + i, 2)
i = round(i - zz, 2)
tracks.append(-i)
if sum(tracks) < distance:
si = distance - sum(tracks)
tracks.append(round(si, 2))
print(tracks, sum(tracks))
return tracks if __name__=='__main__':
browser = webdriver.Firefox()
browser.get('https://passport.jd.com/new/login')
butt = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'link-login')))
butt.click()
butt = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH,'//a[@clstag="pageclick|keycount|login_pc_201804112|10"]')))
butt.click()
user = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,'loginname')))
password = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,'nloginpwd')))
user.send_keys('xxx')
time.sleep(2)
password.send_keys('xxx')
izsz = 1
while izsz == 1:#无限循环直到登录成功
try:
button = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'btn-img.btn-entry')))
time.sleep(2)
button.click()
time.sleep(2)
browser.save_screenshot('1.png')#截图
page_snap_obj = Image.open('1.png')
img = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'JDJRV-bigimg')))
local = img.location
size = img.size
top = local['y']
bottom = local['y'] + size['height']
left = local['x']
right = local['x'] + size['width']
img_1 = Image.open('index2.png')
img_2 = page_snap_obj.crop((left, top, right, bottom))#裁剪图片尺寸
img_2.save('2.png')#保存
i = if_is_s(img_1,img_2)#判断是不是一张图,不是点击换一张
while not i:
time.sleep(2)
butt = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,'JDJRV-img-refresh')))
butt.click()
time.sleep(2)
browser.save_screenshot('1.png')
page_snap_obj = Image.open('1.png')
img = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'JDJRV-bigimg')))
local = img.location
size = img.size
top = local['y']
bottom = local['y'] + size['height']
left = local['x']
right = local['x'] + size['width']
img_1 = Image.open('index2.png')
img_2 = page_snap_obj.crop((left, top, right, bottom))
img_2.save('2.png')
time.sleep(2)
i = if_is_s(img_1, img_2)
ji = get_distance(img_1, img_2)
print(ji)
tracks = get_tracks(ji)
ijs = len(tracks)//5*3
tracks1 = tracks[:ijs]#对滑动轨迹继续改变
tracks2 = tracks[ijs:]
z = sum(tracks1)
tracks2.insert(0,z)
tracks2.insert(0,0)
button = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="JDJRV-slide-inner JDJRV-slide-btn"]')))
ActionChains(browser).click_and_hold(button).perform()
for track in tracks:
ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform() time.sleep(0.5) # 0.5秒后释放鼠标
ActionChains(browser).release().perform()
url = browser.current_url
if 'https://passport.jd.com/new/login.aspx?' in str(url):
izsz = 1
else:
izsz = 0
except:
izsz = 1
难点就在滑动的轨迹太容易被抓,而且一种用多了也会被识别。
git https://github.com/18370652038/jd.git
selenium登录 京东滑动验证码的更多相关文章
- selenium过豆瓣滑动验证码
首先是加速度代码 def get_tracks(distance): """ 拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速 匀变速运动基本公式: ①v = v0+at ...
- selenium+java破解滑动验证码
2019-04-16更新 修复极验页面改版,这次采用极验官方的demo地址:https://www.geetest.com/demo/slide-bind.html 截止2019-04-16,极验和腾 ...
- selenium篇之滑动验证码
一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...
- day78:luffy:前端对于token的认证&滑动验证码的实现
目录 1.前端对于token的认证 2.滑动验证码 1.滑动验证码实现的原理 2.滑动验证码的代码实现 1.配置文件 2.前端实现:Login.vue 3.后端实现:改写jwt代码 1.前端对于tok ...
- python+selenium模拟京东登录后台
python+selenium模拟京东登录后台 import json from time import sleep from selenium import webdriver #from sele ...
- 利用selenium库自动执行滑动验证码模拟登陆
破解流程 #1.输入账号.密码,然后点击登陆 #2.点击按钮,弹出没有缺口的图 #3.针对没有缺口的图片进行截图 #4.点击滑动按钮,弹出有缺口的图 #5.针对有缺口的图片进行截图 #6.对比两张图片 ...
- selenium处理极验滑动验证码
要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了 ...
- selenium+java破解极验滑动验证码的示例代码
转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085 ...
- Python——破解极验滑动验证码
极验滑动验证码 以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/. 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家 ...
随机推荐
- python学习笔记:第二天(基本数据类型)
Python3 基本数据类型 1.标准数据类型 Python3中有六个标准的数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Sets(集合).Dictio ...
- React.js 之hello word
引入的js文件说明 react.js 是 React 的核心库 react-dom.js 是提供与 DOM 相关的功能 babel.min.js的作用是将 JSX 语法转为 JavaScript 语法 ...
- 【转】BZOJ4066(kdtree)(占位)
https://www.cnblogs.com/OYzx/p/5506468.html BZOJ2863:(允许离线) 题目大意:给定一个n*n的矩形,以及若干个操作,操作有如下两种: 1.给矩形的( ...
- Throwable相关知识1
Throwable是所有异常Exception和错误Error的祖先 Throwable是java.lang包中一个专门用来处理异常的类.它有两个子类,即Error 和Exception,它们分别用来 ...
- 如何在ubuntu下使用windows下的程序(eg: .exe)
为了在ubutu下安装百度云管家,上网查了下如何在ubuntu 下安装.exe文件,其中遇到一些问题记录如下: 使用的命令: 开始时直接使用的sudo apt-get install wine 在运行 ...
- Ubuntu环境下gedit以及vim的一些个简单配置
Gedit的配置: 参见 http://www.cnblogs.com/csulennon/p/4198054.html Gedit插件安装 Gedit快捷键 参见我的博客 添加快捷键 Ctrl + ...
- ElasticSearch基础之映射mapping
[01]什么是mapping? 首先去看看官方文档,非常重要:https://www.elastic.co/guide/en/elasticsearch/reference/current/mappi ...
- ASP.NET Core会议管理平台实战_2、基本概念的理解
id Token携带用户的信息 AccessToken:是否有权限访问资源 看数据库的表,Client相关的表,api的相关的表 Resources把用户的简介抽象出来到IdentityClaims表 ...
- 1004 Counting Leaves (30 分)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family member ...
- CodeForces754D【贪心】
题意: 有n个区间,每个区间覆盖区间里一段数,求最大连续区间长度被覆盖k次,并输出选取的区间. 思路: 贪心: 感觉一开始肯定是要把区间按left从小到大排序的. 然后肯定是连续k个区间能够达到的重叠 ...