京东的滑动验证码在页面上是没有原图的,所有我是用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登录 京东滑动验证码的更多相关文章

  1. selenium过豆瓣滑动验证码

    首先是加速度代码 def get_tracks(distance): """ 拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速 匀变速运动基本公式: ①v = v0+at ...

  2. selenium+java破解滑动验证码

    2019-04-16更新 修复极验页面改版,这次采用极验官方的demo地址:https://www.geetest.com/demo/slide-bind.html 截止2019-04-16,极验和腾 ...

  3. selenium篇之滑动验证码

    一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...

  4. day78:luffy:前端对于token的认证&滑动验证码的实现

    目录 1.前端对于token的认证 2.滑动验证码 1.滑动验证码实现的原理 2.滑动验证码的代码实现 1.配置文件 2.前端实现:Login.vue 3.后端实现:改写jwt代码 1.前端对于tok ...

  5. python+selenium模拟京东登录后台

    python+selenium模拟京东登录后台 import json from time import sleep from selenium import webdriver #from sele ...

  6. 利用selenium库自动执行滑动验证码模拟登陆

    破解流程 #1.输入账号.密码,然后点击登陆 #2.点击按钮,弹出没有缺口的图 #3.针对没有缺口的图片进行截图 #4.点击滑动按钮,弹出有缺口的图 #5.针对有缺口的图片进行截图 #6.对比两张图片 ...

  7. selenium处理极验滑动验证码

    要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了 ...

  8. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

  9. Python——破解极验滑动验证码

    极验滑动验证码 以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/. 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家 ...

随机推荐

  1. 解决LoadRunner超时错误

    在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同. 错误现象1:Action.c(16): Error -27728: Step download timeout ...

  2. python字典无序?有序?

    默认情况下Python的字典输出顺序是按照键的创建顺序. 字典的无序是指,不能人为重新排序.比如说你按键值1,2,3,4的顺序创建的字典,只能由解析器按创建顺序,还是1,2,3,4的输出.你无法控制它 ...

  3. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  4. css元素定位样式

    曾经写网页,学css整体上不难,但就是元素定位,始终一知半解,直到今天,本着实践出真知的理念,经过认真测试,总结出了如下结论. css 定位: positionstatic : 默认静止定位,元素在正 ...

  5. 201621123007 Java程序设计第一周 学习总结

    第一周-Java基本概念 201621123007 <Java程序设计> 第一周学习总结 1. 本周学习总结 java是面向对象的一类语言,三大特征:封装性,继承性,多态性. jdk jr ...

  6. Linux-内存进程和软件安装

    1 swap分区 swapon -s 查看swap分区 mkswap 某分区挂载点 swapon -a 分区 激活该swap swapoff 挂载点 取消swap分区 2 内存 free 查看内存空间 ...

  7. 51nod 1327 棋盘游戏——延迟决策的dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327 因为一列填1个或0个(或0个!!!),而一行不知填多少个,所 ...

  8. 怎样通过计算机ip地址访问sql server 2008数据库

      在设置外网访问SQL2008数据库之前,首先必须保证局域网内访问SQL2008没有问题 .那么,我们先来看看局域网内访问SQL2008数据库需要哪些步骤和设置,才能做到在局域网内任何一台机器上输入 ...

  9. CodeForces 1111E. Tree

    题目简述:给定$n \leq 10^5$个节点的无根树,以及$q \leq 10^5$个询问.每个询问给定$k \leq 10^5$个不同的节点$a_1, a_2, \dots, a_k$,以及参数$ ...

  10. Several ports (8005, 8080, 8009) required

    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...