bilibili的滑动验证码图片比较好玩,和前一篇不大一样。

采用canvas方法,分析发现只找到一个图片,不过,可以通过设置display截图方式获得2张图(完整图片,带缺口的图片),取得图片后接下来的方式和前一篇一样,偏移位置参数存在差异,需要自行调试。完整代码如下

#!/usr/bin/env python
# encoding: utf-8
#@author: jack
#@contact: 935650354@qq.com
#@site: https://www.cnblogs.com/jackzz
import re
from time import sleep
from selenium import webdriver
import random
import requests
from PIL import Image
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from io import BytesIO
from selenium.webdriver.common.action_chains import ActionChains USERNAME = ''
PASSWORD = '' class BiliLogin(object): def __init__(self):
'''
初始化
'''
self.login_url = 'https://passport.bilibili.com/login'
self.driver = webdriver.Firefox()
self.wait = WebDriverWait(self.driver,10)
self.driver.maximize_window() def input_info(self):
'''
输入账号密码
:return:
'''
self.driver.get(self.login_url)
username = 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')))
username.send_keys(USERNAME)
password.send_keys(PASSWORD)
sleep(1) def click_login_button(self):
'''
点击登陆按钮
:return:
'''
login_button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'btn-login')))
login_button.click()
sleep(1) def get_captcha_image(self):
'''
获取验证码图片
:return:
'''
geetest_canvas_bg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_canvas_bg')))
geetest_canvas_bg.screenshot('bg.png')
image_bg = Image.open('bg.png')
#通过js代码修改标签样式 显示图片2
js = 'var change = document.getElementsByClassName("geetest_canvas_fullbg");change[0].style = "display:block;"'
self.driver.execute_script(js)
sleep(3)
geetest_canvas_fullbg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_canvas_fullbg')))
geetest_canvas_fullbg.screenshot('fullbg.png')
image_fullbg = Image.open('fullbg.png')
return image_bg,image_fullbg def get_diff_location(self,image1, image2):
'''
通过像素对比 找到缺口位置
:param image1:
:param image2:
:return:
'''
for x in range(65, image1.size[0]):
for y in range(image1.size[1]):
if self.is_similar(image1, image2, x, y) == False:
# 判断成立 表示xy这个点 两张图不一样
return x def is_similar(self,image1, image2, x, y):
pixel1 = image1.getpixel((x, y))
pixel2 = image2.getpixel((x, y)) for i in range(0, 3):
if abs(pixel1[i]) - pixel2[i] >= 60:
return False
return True def get_track(self,x):
'''
滑块移动轨迹
初速度 v =0
单位时间 t = 0.2
位移轨迹 tracks = []
当前位移 ccurrent = 0
:param x:
:return:
'''
v = 0
t = 0.2
tracks = []
current = 0
mid = x*4/5#到达mid值开始减速 while current < x:
if current < mid:
a = random.randint(1,3)
else:
a = -random.randint(2,4)
# a = 2
v0 = v
# 单位时间内位移公式
s = v0 * t + 0.5 * a * (t ** 2)
# 当前位移
current = current + s
tracks.append(round(s))
v = v0 + a * t
return tracks def move_to_xoffset(self,tracks):
element = self.driver.find_element_by_class_name('geetest_slider_button')
ActionChains(self.driver).click_and_hold(element).perform()
for x in tracks:
ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
ActionChains(self.driver).release(element).perform()
sleep(3) def main(self):
self.input_info()
self.click_login_button()
image_bg,image_fullbg = self.get_captcha_image()
xoffset = self.get_diff_location(image_bg,image_fullbg)
print(xoffset)
tracks = self.get_track(xoffset-7)
print(tracks)
self.move_to_xoffset(tracks)
sleep(2)
try: self.driver.find_elements_by_class_name('xxxxxxx')
except:
self.driver.refresh()
self.main() if __name__ == '__main__':
bili = BiliLogin()
try:
count = 5
while count > 0:
bili.main()
count -= 1
except Exception as e:
print('识别错误,继续')
finally:
print('恭喜通过滑块验证')
sleep(2)
bili.driver.quit()

完整代码

BILIBILI之滑块验证的更多相关文章

  1. 原生JS实现拖动滑块验证登录效果

    ♀分享一组利用原生JS实现拖动滑块验证效果 ♀在这个组代码中涉及三个方面的知识: ⑴事件处理 ⑵添加验证标记 ⑶选择器的封装   代码如下: <!DOCTYPE html> <htm ...

  2. winform 仿web 滑块验证

    winform 仿web 滑块验证 效果如下: 源码下载地址: https://download.csdn.net/download/u011392711/11109687

  3. jQuery手机触屏拖动滑块验证跳转插件

    HTML: <!DOCTYPE html> <html lang="en"> <head> <title>jQuery手机触屏拖动滑 ...

  4. 关于selenium实现滑块验证

    关于selenium实现滑块验证 python2.7+selenium2实现淘宝滑块自动认证参考链接:https://blog.csdn.net/ldg513783697/article/detail ...

  5. 原生js实现拖动滑块验证

    拖动滑块验证是现在的网站随处可见的,各式各样的拖动法都有. 下面实现的是某宝的拖动滑块验证: <!DOCTYPE html> <html lang="en"> ...

  6. js移动端滑块验证解锁组件

    本文修改自PC端的js滑块验证组件,PC端使用的是onmousedown,onmouseup,nomousemove.原文找不到了,也是博客园文章,在此感谢广大网友的生产力吧. 说下对插件和组件的理解 ...

  7. js 拖动滑块验证

    备注:拖动滑块时尽量平移,chrome浏览器上没有卡顿情况,但是搜狗极速模式和360极速模式都遇到了卡顿,拖不动情况,应是浏览器内部对事件响应速度导致吧. JS代码: ;(function ($,wi ...

  8. selenium滑块验证

    使用selenium模拟登录解决滑块验证问题   本次主要是使用selenium模拟登录网页端的TX新闻,本来最开始是模拟请求的,但是某一天突然发现,部分账号需要经过滑块验证才能正常登录,如果还是模拟 ...

  9. layui扩展组件sliderVerify 实现滑块验证

    首先在要使用的静态文件代码中引入‘./sliderVerify/sliderVerify.js‘ 先看看效果 示例代码 <!DOCTYPE html> <html> <h ...

随机推荐

  1. 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题

    一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...

  2. ReentrantLock 锁释放源码分析

    ReentrantLock 锁释放源码分析: 调用的是unlock 的方法: public void unlock() { sync.release(1); } 接下来分析release() 方法: ...

  3. 一步步在 github pages 上用 jekyll 搭建属于自己的博客

    序 我的专业与互联网没有太大关系,接触博客还是工作以后的事情.随着工作的经验增加,总想将自己的所思所得记录下来,毕竟,好记性不如烂笔头. 开始是将自己的总结在本地保存,但是本地有一个劣势,就是不能随时 ...

  4. Mysql系列(十二)—— 索引下推优化

    索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...

  5. 【LeetCode】230. Kth Smallest Element in a BST

    Difficulty: Medium  More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/kth-smallest- ...

  6. mysql 查询数据库表信息,字段信息

    #======================================================================= #查询表信息 select table_name, t ...

  7. 数据库-io检测工具sqldeveloper-18.2.0.183.1748-x64 下载链接

    链接:https://pan.baidu.com/s/1R0ujc_9aXdc5O5i1nhNAlA 提取码:o6is

  8. 基于NPOI对Excel进行简单的操作

    1. 关于NPOI NPOI是一个开源的用于在C#程序中读写Excel.WORD等微软OLE2组件文档的项目,使用NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. 2 ...

  9. 一问带你区分清楚Authentication,Authorization以及Cookie、Session、Token

    上周写了一个 适合初学者入门 Spring Security With JWT 的 Demo .Demo 地址:https://github.com/Snailclimb/spring-securit ...

  10. python高级编程——锁

    锁           在使用用的过程中需要导入threading模块的Lock类 使用锁: 当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制 线程同步能够保证多个线程安全访问竞争资源,最 ...