京东的滑动验证码在页面上是没有原图的,所有我是用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. 动态负载均衡(Nginx+Consul+UpSync)环境搭建

    首先 安装好 Consul upsync 然后: 1.配置安装Nginx 需要做配置,包括分组之类的,创建目录,有些插件是需要存放在这些目录的 groupadd nginx useradd -g ng ...

  2. 记录 Linux分析apache日志获取最多访问的前10个IP

    摘自: http://blog.csdn.net/tanga842428/article/details/52856413

  3. android读取apk中已经存在的数据库信息

    在android数据库编程方面,大家有没有遇到过,我要从指定位置的已经存在的数据库来进行操作的问题.之前我尝试了很多方法都没有成功,后来找到了解决的方法.   下面说明下这段代码的意思,第一步先判断在 ...

  4. tflearn 中文汉字识别模型试验汇总

    def get_model(width, height, classes=40): # TODO, modify model # Building 'VGG Network' network = in ...

  5. Linux_基于Docker快速搭建个人博客网站

    时间:2017年04月28日星期五 说明:基于docker技术,使用jpress开源框架搭建个人博客网站.特别感谢jpress开源项目.系统版本:CentOS 7.2-64bit. 步骤一:准备Doc ...

  6. template <typename T>模板类定义

    #include "stdafx.h"#include "iostream"#include <ctime>using namespace std; ...

  7. RAM的分类

    转载自:http://wenku.baidu.com/view/b17d73244b35eefdc8d333ab.html RAM(随机存储器)可以分为SRAM(静态随机存储器)和DRAM(动态随机存 ...

  8. python 二分法例子及冒泡排序

    #!/usr/bin/env python #-*- coding:utf-8 -*- def binary_search(source_data,find_nu): mid = len(source ...

  9. cuda 版本查阅

    查看cuda版本 cat  /usr/local/cuda/version.txt nvcc -V

  10. HDU1083(最大匹配)

    Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...