BILIBILI之滑块验证
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之滑块验证的更多相关文章
- 原生JS实现拖动滑块验证登录效果
♀分享一组利用原生JS实现拖动滑块验证效果 ♀在这个组代码中涉及三个方面的知识: ⑴事件处理 ⑵添加验证标记 ⑶选择器的封装 代码如下: <!DOCTYPE html> <htm ...
- winform 仿web 滑块验证
winform 仿web 滑块验证 效果如下: 源码下载地址: https://download.csdn.net/download/u011392711/11109687
- jQuery手机触屏拖动滑块验证跳转插件
HTML: <!DOCTYPE html> <html lang="en"> <head> <title>jQuery手机触屏拖动滑 ...
- 关于selenium实现滑块验证
关于selenium实现滑块验证 python2.7+selenium2实现淘宝滑块自动认证参考链接:https://blog.csdn.net/ldg513783697/article/detail ...
- 原生js实现拖动滑块验证
拖动滑块验证是现在的网站随处可见的,各式各样的拖动法都有. 下面实现的是某宝的拖动滑块验证: <!DOCTYPE html> <html lang="en"> ...
- js移动端滑块验证解锁组件
本文修改自PC端的js滑块验证组件,PC端使用的是onmousedown,onmouseup,nomousemove.原文找不到了,也是博客园文章,在此感谢广大网友的生产力吧. 说下对插件和组件的理解 ...
- js 拖动滑块验证
备注:拖动滑块时尽量平移,chrome浏览器上没有卡顿情况,但是搜狗极速模式和360极速模式都遇到了卡顿,拖不动情况,应是浏览器内部对事件响应速度导致吧. JS代码: ;(function ($,wi ...
- selenium滑块验证
使用selenium模拟登录解决滑块验证问题 本次主要是使用selenium模拟登录网页端的TX新闻,本来最开始是模拟请求的,但是某一天突然发现,部分账号需要经过滑块验证才能正常登录,如果还是模拟 ...
- layui扩展组件sliderVerify 实现滑块验证
首先在要使用的静态文件代码中引入‘./sliderVerify/sliderVerify.js‘ 先看看效果 示例代码 <!DOCTYPE html> <html> <h ...
随机推荐
- LeetCode 118:杨辉三角 II Pascal's Triangle II
公众号:爱写bug(ID:icodebugs) 作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. Given a non-negative index k whe ...
- 出师表(ENGLISH) 强烈打call啊~王洛勇是什么神仙英语
臣亮言:先帝创业未半而中道崩殂, Permit me to observe: the late emperor was taken from us before he could finish his ...
- 理解 Virtual DOM(摘)及评价
框架并没有提高web的性能,只是让开发者更加专注的完成业务逻辑,而不用过渡的考虑性能上的优化.如果以性能来比的话,框架是绝对比不过优化后的原生代码的. 二.什么是Virtual DOM Virtual ...
- 2019-11-29-WPF-绑定命令在-MVVM-的-CanExecute-和-Execute-在按钮点击都没触发可能的原因...
原文:2019-11-29-WPF-绑定命令在-MVVM-的-CanExecute-和-Execute-在按钮点击都没触发可能的原因... title author date CreateTime c ...
- ActionMq + mqttws3.1 实现持久化订阅
activemq版本:5.15.3 Eclipse Paho MQTT JavaScript library mqttws3.1:在amq安装目录下webapp-demo目录下可以找到 实现步骤请阅读 ...
- 我是如何一步步编码完成万仓网ERP系统的(十四)库存 3.库存日志
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- Spring事件监听机制
前言 Spring中的事件机制其实就是设计模式中的观察者模式,主要由以下角色构成: 事件 事件监听器(监听并处理事件) 事件发布者(发布事件) 首先看一下监听器和发布者的接口定义 public int ...
- Java 之 Set 源码分析
一.HashSet 构造方法: HashSet() :构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75 源码: 二.LinkedHashSet 构造方 ...
- CTF-代码审计(1)——parse_str()变量覆盖
题目连接:http://222.18.158.226:7000/iscc.php 考点:parse_str()变量覆盖 代码: PHP知识点: 1.parse_url() 参照网址:https://w ...
- 人大金仓KCI
#include "bin/libkci.h" static void exit_nicely(KCIConnection *conn) { KCIConnectionDestor ...