您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

如何利用Python强势破解今日头条(巨量)滑块验证码

时间:2020-09-25 15:36:46  来源:  作者:

开头语:
除非是很简单的参数能够解决滑块问题或者追求效率的业务,否则的话,我还是会selenium来解决,并且接下来的验证码模式的话不需要使用到原图进行比较!!我发现很多网站都是基于比较原图,发现缺口的方式来获取坐标,而我有不同的小思路。并且该滑块验证码有特殊性,如果遇到可以收藏并点赞!!!!

开发工具:

Python/ target=_blank class=infotextkey>Python版本:3

相关模块:

selenium模块、PIL模块 以及一些python自带的模块。

Chromedriver:

有插件的就不用管他了,如果没有就找小编领取一下!在文章下方有源码和驱动下载的!

环境搭建:

安装python并添加到环境变量,pip安装需要的相关模块即可。
接着,我们用它来自动访问一下自己站的登录界面:

browser.get("https://ad.oceanengine.com/pages/login/index.html")

设置一下等待时间,并自动填充一下用户名和密码:

wait = WebDriverWait(browser, 30)
element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login"]/section/div[3]/div[10]/div')))  # 它的作用现在就是,等!!!!!!!
input_user = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login"]/section/div[3]/div[4]/input'))).send_keys('user')  # 输入账号
input_password = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login"]/section/div[3]/div[5]/input[1]'))).send_keys('password')  # 输入密码
element.click()#点击登录time.sleep(3)#等待三秒钟就会有验证码了

其中用户名和密码的输入框都直接用xpath来定位,非常方便

如何利用Python强势破解今日头条(巨量)滑块验证码

 

不会还有人不知道吧,不会吧不会吧~
上面的操作一完成,就有验证码弹出来了,直接就有缺口,没有原图,无法做比较

验证码如图

如何利用Python强势破解今日头条(巨量)滑块验证码

 

验证码出来的操作

getimage = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="validate-big"]')))  # 等出图片
browser.get_screenshot_as_file("./全屏截图.jpg")
imgelement = browser.find_element_by_xpath('//*[@id="verify-bar-box"]/div[2]/img[2]')  # 定位验证码
rangle = (324,350, 590,500)  # 写成我们需要截取的位置坐标
i = Image.open("./全屏截图.jpg")  # 打开截图
i = i.convert('RGB')
frame1 = i.crop(rangle)# frame1.show()# frame1.save('./验证码截图.jpg')
data = frame1.getdata()#获取rgb
w, h = frame1.size#获取宽高XCoordinates = 0

接下来是核心算法,求出需要移动的x坐标距离

for x in range(1, w - 1):
    for y in range(1, h - 1):
        mid_pixel = data[w * y + x]  # 中央像素点像素值        if mid_pixel[0] > 230 and mid_pixel[1] > 230 and mid_pixel[2] > 230 and int(x) > 100:  # 找出上下左右四个方向像素点像素值
           top_pixel = data[w * (y - 1) + x]  # 上
           down_pixel = data[w * (y + 1) + x]  # 下
        if top_pixel[0] > 230 and top_pixel[1] > 230 and top_pixel[2] > 230 and down_pixel[0]> 230 and down_pixel[1]> 230 and down_pixel[2]> 230:
            XCoordinates=x

这是拖动操作!!包含了拖动时轨迹的变速运动!!

找到滑动的滑块

element = browser.find_element_by_xpath('//*[@id="validate-drag-wrApper"]/div[2]/img')
location = element.location# # 获得滑动圆球的高度y = location["y"]
# # 鼠标点击元素并按住不放# print("第一步,点击元素")
ActionChains(browser).click_and_hold(on_element=element).perform()## ActionChains(browser).move_by_offset(xoffset=0, yoffset=y - 445).perform()
## time.sleep(0.15)
# print("第二步,拖动元素")
distance=XCoordinates-60
# 初速度v = 0
# 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移,越低看起来越丝滑!!
t = 0.08
# 位移/轨迹列表,列表内的一个元素代表0.2s的位移
tracks = []# 当前的位移current = 0
# 到达mid值开始减速mid = distance * 5 / 8
distance += 10  # 先滑过一点,最后再反着滑动回来
# a = random.randint(1,3)
while current < distance:
    if current < mid:
        # 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细        a = random.randint(100, 200)  # 加速运动
    else:
        a = -random.randint(2, 10)  # 减速运动
    # 初速度    v0 = v    # 0.2秒时间内的位移
    s = v0 * t + 0.5 * a * (t ** 2)
    # 当前的位置    current += s    # 添加到轨迹列表    tracks.append(round(s))    # 速度已经达到v,该速度作为下次的初速度    v = v0 + a * t    if current>distance:
        break
# 反着滑动到大概准确位置# for i in range(4):
#     tracks.append(-random.randint(1, 3))
# for i in range(4):
#    tracks.append(-random.randint(1,3))
random.shuffle(tracks)
count=0
for item in tracks:
    print(item)
    count+=item    ActionChains(browser).move_by_offset(xoffset=item, yoffset=random.randint(-2, 2)).perform()
# ActionChains(browser).move_to_element_with_offset(to_element=element, xoffset=XCoordinates-18,yoffset=y - 445).perform()
# time.sleep(2)
# # 释放鼠标print(count)
ActionChains(browser).release(on_element=element).perform()

然后就能登陆了!!!完美!!!其实还有登陆后的操作,也一并奉上吧~点击操作呢

jiazaichenggong = wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[25]/div/div/div[2]/div[2]/button')))
        jiazaichenggong.click()        Exitboot = wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[2]/div/div[6]/div/div[4]/div')))#点击推出引导
        Exitboot.click()        closekey=wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[13]/div[2]/div[3]/button')))#查看快捷键
        closekey.click()        time.sleep(3)
        # closekey.send_keys(Keys.ESCAPE)        ActionChains(browser).move_by_offset(300,238).click().perform()
        time.sleep(5)
        clickdate=wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[3]/div[2]/div/div[1]/div')))#点击时间
        clickdate.click()        print('请输入时间选择-格式如下2020.09.01')
        stime=input('请输入开始时间:')
        etime = input('请输入结束时间:')
        time.sleep(10)
        clickstime = wait.until(EC.presence_of_element_located((By.XPATH, f"//td[@title='{stime}']")))  # 点击时间
        clickstime.click()        clicketime = wait.until(EC.presence_of_element_located((By.XPATH, f"//td[@title='{etime}']")))  # 点击时间
        clicketime.click()        time.sleep(60)


Tags:Python 滑块验证码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
开头语: 除非是很简单的参数能够解决滑块问题或者追求效率的业务,否则的话,我还是会selenium来解决,并且接下来的验证码模式的话不需要使用到原图进行比较!!我发现很多网站都是基...【详细内容】
2020-09-25  Tags: Python 滑块验证码  点击:(225)  评论:(0)  加入收藏
前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:MingyueyixiPS:如有需要Python学习资料的...【详细内容】
2020-06-18  Tags: Python 滑块验证码  点击:(58)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条