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. C++分治策略实现二分搜索

    问题描述: 给定已排好序的n个元素组成的数组,现要利用二分搜索算法判断特定元素x是否在该有序数组中. 细节须知: (1)由于可能需要对分治策略实现二分搜索的算法效率进行评估,故使用大量的随机数对算法进 ...

  2. 提高性能,MySQL 读写分离环境搭建

    这是松哥之前一个零散的笔记,整理出来分享给大伙! MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了.受困于 Linux 和 MySQL 版本问题,很多人经常会搭建失败,今天松哥就给大伙举 ...

  3. eclipse使用maven,启动工程tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.Contex

    maven是个不错的管理jar包工具,但是我们在eclipse使用maven时,总是遇上这样那样的问题,比如今天,我编译工程,启动过后,tomcat报错:java.lang.ClassNotFound ...

  4. 浅析libuv源码-node事件轮询解析(1)

    好久没写东西了,过了一段咸鱼生活,无意中想起了脉脉上面一句话: 始终保持自己的竞争力.所以,继续开写! 一般的JavaScript源码看的已经没啥意思了,我也不会写什么xx入门新手教程,最终决定还是啃 ...

  5. docker部署angular和asp.net core组成的前后端分离项目

    最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...

  6. 【翻译】Tusdotnet中文文档(2)事件

    tusdotnet-----一个tus文件上传协议的实现之事件 本章接上篇来继续翻译Tusdotnet的文档,按照如下结构来翻译: 事件 OnAuthorize OnFileComplete OnBe ...

  7. 转 Sqlserver_left join 、right join、 inner join 用法

    https://www.cnblogs.com/ingstyle/p/4368064.html   left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right joi ...

  8. .Net IOC框架入门之——CastleWindsor

    一.简介 Castle是.net平台上的一个开源项目,为企业级开发和WEB应用程序开发提供完整的服务,用于提供IOC的解决方案.IOC被称为控制反转或者依赖注入(Dependency Injectio ...

  9. nginx 反向代理时丢失端口的解决方案(转)

    今天,配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常:如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端 ...

  10. EntityFramework 基类重写

    /* * ------------------------------------------------------------------------------ * * 创 建 者:F_Gang ...