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. 使用numpy处理数组

    def fun_ndarray(): a = [[1,2,7], [-6,-2,-3], [-4,-8,-55] ] b = np.array(a) b = np.abs(b)#取数组的绝对值 pri ...

  2. html。PROGRESS进度条使用测试

    效果图 : 代码: ----------------------------------- //本文来自:https://www.cnblogs.com/java2sap/p/11199126.htm ...

  3. 新安装NODEJS之后配置

    1配置阿里镜像服务器 npm config set registry https://registry.npm.taobao.org --global npm config set disturl h ...

  4. 第十九节:Asp.Net Core WebApi基础总结和请求方式

    一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方 ...

  5. Mysql 错误 ERROR 1 (HY000) at line 1: Can't create/write to file '/home/kaizenly/cfg_dict.csv' (Errcode: 13 - Permission denied)

    [1]问题描述 (1)执行SQL语句: use billing; select * from cfg_dict into outfile '/home/kaizenly/cfg_dict.csv' f ...

  6. pymysql模块常用操作

    pymysql安装 pip install pymysql 链接数据库.执行sql.关闭连接 import pymysql user = input('请输入用户名请输入密码:').strip() p ...

  7. JavaScriptCore在浏览器引擎中的位置

    因为随着JS这门语言的发展,JS的宿主越来越多,有各种各样的浏览器,甚至是常见于服务端的Node.js(基于V8运行). 2.       Webkit 源代码由三大模块组成: 1). WebCore ...

  8. 同一个POD中默认共享哪些名称空间

    如果通过POD的形式来启动多个容器那么它们的名称空间会是共享的么,所以我这里讨论是在默认情况下同一个POD的不同容器的哪些名称空间是打通的.这里先说一下结论,共享的是UTS.IPC.NET.USER. ...

  9. Cocos Creator 返回字符串长度(字符),汉字计数为2

    function strLength(str) { var a = 0; for (var i = 0; i < str.length; i++) { if (str.charCodeAt(i) ...

  10. B端产品需求文档怎么写?

    B端,或者2B,一般指的是英文中的 to busniss,中文即面向企业的含义.与B端相对应的,是C端,或者2C,同样指的是英文中的 to customer,即面向消费者的意思.因此,人们平常所说的B ...