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

#识别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. Dev 之 GridControl 列表 显示底部(包括底部统计)

    1.列表 Gridview 显示底部 2 底部增加统计

  2. PXE-cobbler 无人值守装机

    Cobbler  PXE 自动安装系统(CentOS-7.2) 第一步:系统环境准备 1.查看系统版本与内核 2.关闭防火墙 3.关闭selinux 第二步:安装cobbler 与环境相关组件 1.下 ...

  3. 一,Smarty模板技术/引擎——简介

    Smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使PHP程序员与美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改 ...

  4. [ActionScript 3.0] 嵌入字体

    首先我们要生成一个swf的字体库,以微软雅黑为例,新建YaHei_font.fla,ctrl+L,在库面板中右键→新建字型,弹出字体元件属性窗口,选择要嵌入的字体, 并选择为ActionScript ...

  5. [转] 以普通用户启动的Vim如何保存需要root权限的文件

    [转] 以普通用户启动的Vim如何保存需要root权限的文件 在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误: E45: 'rea ...

  6. H5新手教程,小白来看看。

    H5教程(一) 相信点进来看这篇文章的应该都是刚刚接触H5的新手,那么你真的是找到了一篇合适的文章. 1.学习前准备 既然想学习好H5,只是这样看是不够的,还需要动手练习,以及及时复习,所以我推荐几款 ...

  7. 正则表达式 python

    下面这种方式 从结果上看 匹配的是关键字, 但是不是 每一次都可以 100% 准确 search_words_dict = { "肠炎宁": 0, "维生素AD" ...

  8. 数据库开发基础-★SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)★

    控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

  9. java中锁

    s锁的作用是就是保证线程安全,但是从另外成都讲影响了效率: 1 synchronized关键字 这个是虚拟机底层实现的, java中的关键字,内部实现为监视器锁,主要是通过对象监视器在对象头中的字段来 ...

  10. jvm内存分部

    首先我们必须要知道的是 Java 是跨平台的.java常用的名词有jdk,jre,jvm jdk包括后两者,是开发者工具集, jre表示java运行环境, jvm是java虚拟机,是java夸平台的保 ...