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

#识别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. SQL存储过程编写,包含临时表

    create proc R_ProductUse_M(@id1 int,@id2 int,@id3 int) as begin ---临时表1 select a.id1,b.id2,c.id3 int ...

  2. linux命令之网络管理命令(上)

    1.ifconfig:配置或显示网络接口信息 该命令用于配置网卡IP地址等网络参数或显示当前网络的接口状态,该命令配置网卡信息时必须要以root用户的身份来执行. 参数选项 说明 up 激活指定的网络 ...

  3. WEB新手之sql注入

    继续写题. 这题看上去是一道sql注入题.F12查看后台代码. 可以看到后台有两个变量,分别是uname以及passwd.然后接下来读一下后台的代码,这里的意思是,如果用户输入的密码经过md5加密后, ...

  4. PHP如何根据数组中的键值进行排序

    主要是使用PHP的排序函数,asort()和arsort(). 为了减少代码的耦合性,我们将根据数组中的键值进行排序封装成一个函数 <?php $array = array( array(), ...

  5. NVIDIA | 一种重建照片的 AI 图像技术

    简评:或许可以称之为「擦擦乐」~ 建议大家看看视频示例 ~ 前几天,NVIDIA 的研究人员介绍了一种新的 深度学习 方法,使用该方法可以重建缺失像素的图像内容. 这种方法被称为「image inpa ...

  6. Linux系统查找清理磁盘大文件方法

    本文主要介绍Linux系统磁盘使用空间不足时,如何查找大文件并进行清理的方法. 下午使用df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100%,其中/dev/mapper/vg_iavp-lv ...

  7. linux上的常用的进程与内存优化命令

    进程 ps命令 f 以树状结构显示 u 显示详细信息 a 显示所有进程 -A 显示所有进程 -u 用户名 是显示该用户下的进程 -l 更多进程详细信息 例子1. 以树状结构显示root用户下进程的详细 ...

  8. Hibernate框架基础

    Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle…) M,Mapping 映射 OR ...

  9. vue 浏览器滚动行为

    import Vue from 'vue' import App from './App.vue' import VueRouter from 'vue-router' import {routes} ...

  10. 洛谷 P3224 [HNOI2012]永无乡

    题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...