这就是极验验证码,通过拖动滑块移动拼图来验证。我们观察到点击滑块时拼图才会出现,所以我们可以在点击滑块之前截取图像,点击滑块再截取一次图像,将前后两次图像做比较就可以找到图片改动的位置。获得位置后,我们需要模拟人类的操作将滑块移动到指定的位置。代码如下:

#识别b站极验验证码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from io import BytesIO
import io
from PIL import Image
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains EMAIL = "wdl1078390625@qq.com"
PASSWORD = "wdl-075483267123" class BilibiliTest():
def __init__(self):
self.url = "https://passport.bilibili.com/login"
self.browser = webdriver.Chrome()
self.wait = WebDriverWait(self.browser,20)
self.email = EMAIL
self.password = PASSWORD
self.browser.get(self.url)
email = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
email.send_keys(self.email)
password.send_keys(self.password) self.button = self.get_test_button()
self.img1,self.img2 = self.get_test_image()
#保存图片
self.img1.save('b1.png')
self.img2.save('b2.png') def get_test_button(self):
button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.gt_slider_knob')))
return button #获得截图中图片的位置
def get_position(self):
action = ActionChains(self.browser)
action.move_to_element(self.button)
self.button.click()
img = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.gt_cut_fullbg.gt_show')))
location = img.location
size = img.size
top = location['y']
bottom = location['y'] + size['height']
left = location['x']
right = location['x'] + size['width']
return (top,bottom,left,right) #获得图片
def get_test_image(self):
top,bottom,left,right = self.get_position()
time.sleep(1)
screenshot = self.get_screenshot()
#浏览器缩放,所以要乘1.25,读者根据自己的需求修改之
img1 = screenshot.crop((left*1.25,top*1.25,right*1.25,bottom*1.25))
time.sleep(1)
ActionChains(self.browser).click_and_hold(self.button).perform()
time.sleep(1)
screenshot = self.get_screenshot()
img2 = screenshot.crop((left*1.25,top*1.25,right*1.25,bottom*1.25))
return (img1,img2) #对比像素点是否一致
def is_pixel_equal(self,img1,img2,x,y):
pixel1 = img1.load()[x,y]
pixel2 = img2.load()[x,y]
#副本图片中常有干扰的灰块,与原图像素不一致但差距小,用threshold变量排除干扰
threshold = 80
if abs(pixel1[0]-pixel2[0]) < threshold and \
abs(pixel1[1]-pixel2[1]) < threshold and \
abs(pixel1[2]-pixel2[2]) < threshold:
return True
else:
return False #对比各像素点是否一致
def get_gap(self,img1,img2):
left = 80
for i in range(left,img1.size[0]):
for j in range(img1.size[1]-30):
if not self.is_pixel_equal(img1,img2,i,j):
left = i
return left
return left #获取滑块移动轨迹
def get_track(self, distance): # 移动轨迹
track = []
current = 0
mid = (distance-30) * 5 / 9
mid2 = (distance-30) * 7 / 9
t = 0.2
# 初速度
v = 3
#初始加速度为2
a = 2
#初始加速度增量
aa = 0.3 while current < distance-25:
if current < mid:
a += aa
elif current < mid2:
a += aaelse:
if a < 0 :
a -= aa
else:
a = -a + 1
# 初速度v0
v0 = v
# 当前速度v = v0 + at
v = v0 + a * t
# 移动距离x = v0t + 1/2 * a * t^2
move = v0 * t + 1 / 2 * a * t * t
# 当前位移
current += round(move)
# 加入轨迹
track.append(round(move)) track.append(0)
track.append(-3)
track.append(-2)
print("distance:"+str(distance)+"track:")
print(track)
return track
#移动滑块
def move_to_gap(self,button,tracks):
ActionChains(self.browser).click_and_hold(button).perform()
for x in tracks:
ActionChains(self.browser).move_by_offset(xoffset=x,
yoffset=0).perform()
time.sleep(0.3)
ActionChains(self.browser).release().perform() #截屏
def get_screenshot(self):
screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot def login(self):
distance = self.get_gap(self.img1,self.img2)
track = self.get_track(distance)
self.move_to_gap(self.button,track)
time.sleep(10) def main(args):
bilibili = BilibiliTest()
bilibili.login()
return 0 if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))

破解b站极验验证码的更多相关文章

  1. python3 破解 geetest(极验)的滑块验证码

    Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...

  2. 极验验证码破解之selenium

    这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了. 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法, ...

  3. 潭州课堂25班:Ph201805201 爬虫基础 第十课 图像处理- 极验验证码 (课堂笔记)

    用 python 的  selenium  访问  https://www.huxiu.com/ 自动通过验证码 # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 20 ...

  4. vue中使用极验验证码(附demo)

    前言: vue中使用极验验证码,最好是在页面渲染的时候(mounted)进行验证码的初始化,然后在初始化回调中绑定触发弹出验证码的事件.这样在点击按钮或者进行特定操作时能够快速的弹出验证码. 关键代码 ...

  5. 极验验证码在php5.6.27下不显示

    PHP5.6需要改php.ini 去掉;always_populate_raw_post_data = -1的 :

  6. selenium+java破解极验滑动验证码

    摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/r ...

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

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

  8. 爬虫进阶教程:极验(GEETEST)验证码破解教程

    摘要 爬虫最大的敌人之一是什么?没错,验证码!Geetest作为提供验证码服务的行家,市场占有率还是蛮高的.遇到Geetest提供的滑动验证码怎么破?授人予鱼不如授人予渔,接下来就为大家呈现本教程的精 ...

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

    Python 破解极验滑动验证码 测试开发社区  1周前 阅读目录 极验滑动验证码 实现 位移移动需要的基础知识 对比两张图片,找出缺口 获得图片 按照位移移动 详细代码 回到顶部 极验滑动验证码 以 ...

随机推荐

  1. git command cheat sheet

    clone:克隆 --non-bare:(默认值)一般的克隆方式 --bare:只克隆.git目录 --mirror:只克隆.git目录,并且还保持与origin的关联,可以fetch commit: ...

  2. mvn -v提示Permission denied

    解决办法: 增加权限 chmod a+x  /usr/local/apache-maven-3.5.2/bin/mvn 解释: (a:所有用户  +:增加权限   x:执行权限)

  3. 也说AOP

    前言 1.引言 2.Aop概念 3.Aop实践 4.总结 一.引言 对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里...博主今 ...

  4. [转]解读Unity中的CG编写Shader系列4——unity中的圆角矩形shader

    上篇文章中我们掌握了表面剔除和剪裁模式这篇文章将利用这些知识实现一个简单的,但是又很常用的例子:把一张图片做成圆角矩形 例3:圆角矩形Shader好吧我承认在做这个例子的时候走了不少弯路,由于本人对矩 ...

  5. 圆角标题title

    Html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. 5.iptables--NAT

    开启Linux主机的核心转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward SNAT相关操作 隐藏网内主机的IP地址,也可以共享互联网.如果只是共享IP的话, ...

  7. 小记一次shellscript的麻烦

    小记一次shellscript的麻烦 一.起因: 之前写过篇文章 文本分析实例 ,大致的内容就是对 "nginx的web服务器进行日志分析,删除不被访问的截图". 点我打开哔哩哔哩 ...

  8. Linux 下安装 resync 介绍

    Linux 下安装 resync 介绍 这是官网,找到对应版本的下载地址. 这里提供Linux_X64的安装包 wget '' https://download-cdn.resilio.com/sta ...

  9. 移动端一个奇怪的触摸bug

    这两天遇到一个很奇怪的bug,在移动端,一个页面里所有的input框都不能点击,我查了一下,里面的没有设置readonly属性,只要页面滚动一下就可以用了,而且,只要我在真机测试的时候,f12开发者模 ...

  10. 常见浏览器hack汇总

    1.背景渐变bug: ①.ie8 ie9:用滤镜的方式解决: -ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientT ...