python模拟哔哩哔哩滑块登入验证的实现


Posted in Python onApril 24, 2020

准备工具

  • pip3 install PIL
  • pip3 install opencv-python
  • pip3 install numpy
  • 谷歌驱动

建议指定清华源下载速度会更快点

使用方法 : pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/

谷歌驱动
谷歌驱动下载链接 :http://npm.taobao.org/mirrors/chromedriver/

前言

本篇文章采用的是cv2的Canny边缘检测算法进行图像识别匹配。

Canny边缘检测算法参考链接:https://3water.com/article/185336.htm

具体使用的是Canny的matchTemplate方法进行模糊匹配,匹配方法用CV_TM_CCOEFF_NORMED归一化相关系数匹配。得出的max_loc就是匹配出来的位置信息。从而达到位置的距离。

难点

  • 由于图像采用放大的效果匹配出的距离偏大,难以把真实距离,并存在误差。
  • 由于哔哩哔哩滑块验证进一步采取做了措施,如果滑动时间过短,会导致验证登入失败。所以我这里采用变速的方法,在相同时间内滑动不同的距离。
  • 误差的存在是必不可少的,有时会导致验证失败,这都是正常现象。

流程

1.实例化谷歌浏览器 ,并打开哔哩哔哩登入页面。

2.点击登陆,弹出滑动验证框。

3.全屏截图、后按照尺寸裁剪各两张。

5.模糊匹配两张图片,从而获取匹配结果以及位置信息 。

6.将位置信息与页面上的位移距离转化,并尽可能少的减少误差 。

7.变速的拖动滑块到指定位置,从而达到模拟登入。

效果图

python模拟哔哩哔哩滑块登入验证的实现

代码实例

库安装好后,然后填写配置区域后即可运行。

from PIL import Image
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import cv2
import numpy as np
import math
############ 配置区域 #########

zh='' #账号
pwd='' #密码
 # chromedriver的路径
chromedriver_path = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"

####### end #########

options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1020,720')
# options.add_argument('--start-maximized') # 浏览器窗口最大化
options.add_argument('--disable-gpu')
options.add_argument('--hide-scrollbars')
options.add_argument('test-type')
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors",
             "enable-automation"]) # 设置为开发者模式
driver = webdriver.Chrome(options=options, executable_path=chromedriver_path)
driver.get('https://passport.bilibili.com/login')

# 登入
def login():
 driver.find_element_by_id("login-username").send_keys(zh)
 driver.find_element_by_id("login-passwd").send_keys(pwd)
 driver.find_element_by_css_selector("#geetest-wrap > div > div.btn-box > a.btn.btn-login").click()
 print("点击登入")

# 整个图,跟滑块整个图
def screen(screenXpath):
 img = WebDriverWait(driver, 20).until(
  EC.visibility_of_element_located((By.XPATH, screenXpath))
 )
 driver.save_screenshot("allscreen.png") # 对整个浏览器页面进行截图
 left = img.location['x']+160 #往右
 top = img.location['y']+60 # 往下
 right = img.location['x'] + img.size['width']+230 # 往左
 bottom = img.location['y'] + img.size['height']+110 # 往上
 im = Image.open('allscreen.png')
 im = im.crop((left, top, right, bottom)) # 对浏览器截图进行裁剪
 im.save('1.png')
 print("截图完成1")
 screen_two(screenXpath)
 screen_th(screenXpath)
 matchImg('3.png','2.png')

# 滑块部分图
def screen_two(screenXpath):
 img = WebDriverWait(driver, 20).until(
  EC.visibility_of_element_located((By.XPATH, screenXpath))
 )
 left = img.location['x'] + 160
 top = img.location['y'] + 80
 right = img.location['x'] + img.size['width']-30
 bottom = img.location['y'] + img.size['height'] + 90
 im = Image.open('allscreen.png')
 im = im.crop((left, top, right, bottom)) # 对浏览器截图进行裁剪
 im.save('2.png')
 print("截图完成2")

# 滑块剩余部分图
def screen_th(screenXpath):
 img = WebDriverWait(driver, 20).until(
  EC.visibility_of_element_located((By.XPATH, screenXpath))
 )
 left = img.location['x'] + 220
 top = img.location['y'] + 60
 right = img.location['x'] + img.size['width']+230
 bottom = img.location['y'] + img.size['height'] +110
 im = Image.open('allscreen.png')
 im = im.crop((left, top, right, bottom)) # 对浏览器截图进行裁剪
 im.save('3.png')
 print("截图完成3")

#图形匹配
def matchImg(imgPath1,imgPath2):
 imgs = []
 #展示
 sou_img1= cv2.imread(imgPath1)
 sou_img2 = cv2.imread(imgPath2)
 # 最小阈值100,最大阈值500
 img1 = cv2.imread(imgPath1, 0)
 blur1 = cv2.GaussianBlur(img1, (3, 3), 0)
 canny1 = cv2.Canny(blur1, 100, 500)
 cv2.imwrite('temp1.png', canny1)
 img2 = cv2.imread(imgPath2, 0)
 blur2 = cv2.GaussianBlur(img2, (3, 3), 0)
 canny2 = cv2.Canny(blur2, 100, 500)
 cv2.imwrite('temp2.png', canny2)
 target = cv2.imread('temp1.png')
 template = cv2.imread('temp2.png')
 # 调整大小
 target_temp = cv2.resize(sou_img1, (350, 200))
 target_temp = cv2.copyMakeBorder(target_temp, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])
 template_temp = cv2.resize(sou_img2, (200, 200))
 template_temp = cv2.copyMakeBorder(template_temp, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])
 imgs.append(target_temp)
 imgs.append(template_temp)
 theight, twidth = template.shape[:2]
 # 匹配跟拼图
 result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)
 cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
 # 画圈
 cv2.rectangle(target,max_loc,(max_loc[0]+twidth,max_loc[1]+theight),(0,0,255),2)
 target_temp_n = cv2.resize(target, (350, 200))
 target_temp_n = cv2.copyMakeBorder(target_temp_n, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])
 imgs.append(target_temp_n)
 imstack = np.hstack(imgs)

 cv2.imshow('windows'+str(max_loc), imstack)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

 # 计算距离
 print(max_loc)
 dis=str(max_loc).split()[0].split('(')[1].split(',')[0]
 x_dis=int(dis)+135
 t(x_dis)


#拖动滑块
def t(distances):
 draggable = driver.find_element_by_css_selector('div.geetest_slider.geetest_ready > div.geetest_slider_button')
 ActionChains(driver).click_and_hold(draggable).perform() #抓住
 print(driver.title)
 num=getNum(distances)
 sleep(3)
 for distance in range(1,int(num)):
  print('移动的步数: ',distance)
  ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0).perform()
  sleep(0.25)
 ActionChains(driver).release().perform() #松开


# 计算步数
def getNum(distances):
 p = 1+4*distances
 x1 = (-1 + math.sqrt(p)) / 2
 x2 = (-1 - math.sqrt(p)) / 2
 print(x1,x2)
 if x1>=0 and x2<0:
  return x1+2
 elif(x1<0 and x2>=0):
  return x2+2
 else:
  return x1+2

def main():
 login()
 sleep(5)
 screenXpath = '/html/body/div[2]/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/div/canvas[2]'
 screen(screenXpath)
 sleep(5)


if __name__ == '__main__':
 main()

有能力的可以研究一下思路,然后写出更好的解决办法。

到此这篇关于python模拟哔哩哔哩滑块登入验证的实现的文章就介绍到这了,更多相关python 滑块登入验证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的CURL PycURL使用例子
Jun 01 Python
python使用htmllib分析网页内容的方法
May 08 Python
Python os模块学习笔记
Jun 21 Python
Python 常用的安装Module方式汇总
May 06 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
Django中的ajax请求
Oct 19 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
django session完成状态保持的方法
Nov 27 Python
详解Python装饰器
Mar 25 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 Python
Python try except finally资源回收的实现
Jan 25 Python
200行python代码实现贪吃蛇游戏
Apr 24 #Python
python Canny边缘检测算法的实现
Apr 24 #Python
python实现文字版扫雷
Apr 24 #Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 #Python
python3中sys.argv的实例用法
Apr 24 #Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 #Python
Python实现仿射密码的思路详解
Apr 23 #Python
You might like
memcache一致性hash的php实现方法
2015/03/05 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
javascript中call()、apply()的区别
2019/03/21 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
简单介绍Python中的几种数据类型
2016/01/02 Python
Fabric 应用案例
2016/08/28 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python实现自主查询实时天气
2018/06/22 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
土木工程应届生自荐信
2013/09/24 职场文书
职专应届生求职信
2013/11/16 职场文书
班子四风对照检查材料
2014/08/21 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Python开发简易五子棋小游戏
2022/05/02 Python