京东的滑动验证码在页面上是没有原图的,所有我是用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. MySQL丨分页查询

    直奔主题 一.sql语句:select * from table limit startPageNum,everyPageNum 1)语句解析: table:你要查询的表 startPageNum:从 ...

  2. 「LuoguP2420」 让我们异或吧(树上前缀和

    P2420 让我们异或吧-洛谷 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor ...

  3. win10 下安装linux子系统

    一.开发人员选项 打开控制面板->程序与功能->启用或关闭windows功能 勾选    [适用于linux的windows子系统]    选项 打开win10设置 找到更新与安全 启动开 ...

  4. python-pycharm 设置默认代码及注释

    pycharm

  5. hdu 3932 Groundhog Build Home —— 模拟退火

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3932 找一个位置使距离最远的点的距离最小: 上模拟退火: 每次向距离最远的点移动,注意判断一下距离最远的点 ...

  6. 构建一个简单的Angular工程

    1.创建一个空的工程,之后用webstorm打开,添加一个bower.json文件: { "name": "AngularTpl", "depende ...

  7. android opengl es 源码

    [转自:http://blog.csdn.net/happyhell/article/details/6086973] The entire OpenGL ES API on Android is i ...

  8. 201621123016 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口,多态,Comparable,Comparator 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不 ...

  9. L2-024 部落 (25 分)并查集

    在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈.我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同 ...

  10. Matplotlib 在绘画bar时, 鼠标响应点击 bar 的消息

    官方教程: http://urania.udea.edu.co/sitios/astronomia-2.0/pages/descargas.rs/files/descargasdt5vi/Cursos ...