破解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周前 阅读目录 极验滑动验证码 实现 位移移动需要的基础知识 对比两张图片,找出缺口 获得图片 按照位移移动 详细代码 回到顶部 极验滑动验证码 以 ...
随机推荐
- arcgis android 中shapefile的加载
前言 本文为大家分享arcgis android 中shapefile的加载,默认你有java环境,懂一定的android基础知识,默认你已经安装android studio.如缺乏以上环境和知识,请 ...
- duilib入门简明教程 -- 完整的自绘标题栏(8)
看了前面那么多教程,相信对duilib已有基本映像了,我们就快马加鞭,做出一个完整的自绘标题栏吧~ 看到下面这个效果图,小伙伴们是不是有点惊呆了呢~O(∩_∩)O~ duil ...
- SQL命令行修改数据库
增加列: alter table tableName add columnName varchar(30) 修改列类型:alter table tableName alter column colum ...
- 也说AOP
前言 1.引言 2.Aop概念 3.Aop实践 4.总结 一.引言 对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里...博主今 ...
- 爬虫开发9.scrapy框架之递归解析和post请求
今日概要 递归爬取解析多页页面数据 scrapy核心组件工作流程 scrapy的post请求发送 今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久 ...
- 在linux 创建网络会话和绑定两块网卡
1. 如果我们在公司网络中要手动指定网络的IP地址,当我们回到家里则是使用DHCP(动态主机配置协议)自动分配IP地址.这就有点麻烦了,因为要频繁的修改IP地址,所以接下来我们来创建网络会话----- ...
- 三,Smarty模板技术/引擎——变量操作(2)
1, 变量的分类 ① 从PHP中分配的变量,比如a.php跳转到b.php时候,可以在a.php中分配变量,b.tpl中直接调用.a.php中代码,$smarty->assign(‘str’,’ ...
- jxl读取excel
String path=""; String path2=""; File file = new File(path); File file2 = new Fi ...
- MyBatis框架流程
Hibernate与Mybatis的本质区别和应用场景 Hibernate:标准的ORM框架,不需要写SQL语句,但是优化和修改SQL语句比较难. 应用于需求变化固定的中小型的项目,例如后台管理系统. ...
- 点击事件获得li标签内容
通过点击事件获得li标签内容 Table of contents 随笔 随笔 <li onclick="liClick(this)">数据</li> //点 ...