破解b站极验验证码


这就是极验验证码,通过拖动滑块移动拼图来验证。我们观察到点击滑块时拼图才会出现,所以我们可以在点击滑块之前截取图像,点击滑块再截取一次图像,将前后两次图像做比较就可以找到图片改动的位置。获得位置后,我们需要模拟人类的操作将滑块移动到指定的位置。代码如下:
#识别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站极验验证码的更多相关文章
- python3 破解 geetest(极验)的滑块验证码
Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...
- 极验验证码破解之selenium
这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了. 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法, ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十课 图像处理- 极验验证码 (课堂笔记)
用 python 的 selenium 访问 https://www.huxiu.com/ 自动通过验证码 # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 20 ...
- vue中使用极验验证码(附demo)
前言: vue中使用极验验证码,最好是在页面渲染的时候(mounted)进行验证码的初始化,然后在初始化回调中绑定触发弹出验证码的事件.这样在点击按钮或者进行特定操作时能够快速的弹出验证码. 关键代码 ...
- 极验验证码在php5.6.27下不显示
PHP5.6需要改php.ini 去掉;always_populate_raw_post_data = -1的 :
- selenium+java破解极验滑动验证码
摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/r ...
- selenium+java破解极验滑动验证码的示例代码
转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085 ...
- 爬虫进阶教程:极验(GEETEST)验证码破解教程
摘要 爬虫最大的敌人之一是什么?没错,验证码!Geetest作为提供验证码服务的行家,市场占有率还是蛮高的.遇到Geetest提供的滑动验证码怎么破?授人予鱼不如授人予渔,接下来就为大家呈现本教程的精 ...
- Python 破解极验滑动验证码
Python 破解极验滑动验证码 测试开发社区 1周前 阅读目录 极验滑动验证码 实现 位移移动需要的基础知识 对比两张图片,找出缺口 获得图片 按照位移移动 详细代码 回到顶部 极验滑动验证码 以 ...
随机推荐
- 单例模式(Singleton)小记
概念 引用维基百科对单例的说明: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在. 继续引用维基百科的实现思路: 实现单例模式的思路是:一个类 ...
- Webbench的使用
Webbench是一个在linux下使用的非常简单的网站压测工具. 它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力 ...
- [BJOI2010] 严格次小生成树
题目链接 一个严格次小生成树的模板题. 看到次小生成树,我们有一个很直观的想法就是先构造出来最小生成树,然后将这个最小生成树上面最大的一条边替换成和它值最相近而且比他大的边. 那么首先就是用krusk ...
- Robot Framework连接MySQL数据库
注:内容来自网络,整理之如下 Robot Framework连接mysql数据库需要: 1.安装databaselibrary.pymysql 通过cmd命令执行:pip install robotf ...
- 【07】循序渐进学 docker:数据持久化
写在前面的话 学到这里相信有心的朋友都发现问题了,我们每次都会去删掉容器,在创建新的容器.那数据怎么办?岂不删库跑路了? 就算不是数据库,假设公司有日志保留的需求,那每一次发布岂不日志都被干掉了? D ...
- Collection 集合框架
1. Collection 集合框架:在实际开发中,传统的容器(数组)在进行增.删等操作算法和具体业务耦合在一起,会增加程序的开发难度:这时JDK提供了这样的容器---Collection 集合框架, ...
- tf-idf sklearn
第一步:语料转化为词袋向量 step 1. 声明一个向量化工具vectorizer: 本文使用的是CountVectorizer,默认情况下,CountVectorizer仅统计长度超过两个字符的词, ...
- kvm虚拟化之kvm虚拟机vnc配置
本文是通过vnc方式访问虚拟主机上的KVM虚拟机. 这里的通过vnc方式访问虚拟机不是在kvm虚拟机安装配置vnc服务器,通过虚拟主机的IP地址与端口进行访问,kvm虚拟化对vnc的支持相对来说 ...
- “全栈2019”Java第九章:解释第一个程序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- TCP/IP学习笔记(3)-IP、ARP、RARP协议
这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据 ...