当前位置:首页 > 实用技巧 >

哔哩哔哩登录为什么要验证(哔哩哔哩登录如何不用验证码)

来源:原点资讯(www.yd166.com)时间:2024-01-15 10:09:51作者:YD166手机阅读>>

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:卡卡叮

PS:如有需要Python学习资料的小伙伴可以私信小编

哔哩哔哩登录为什么要验证,哔哩哔哩登录如何不用验证码(1)

这篇文章主要介绍了python模拟哔哩哔哩滑块登入验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

准备工具

  • 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/

哔哩哔哩登录为什么要验证,哔哩哔哩登录如何不用验证码(2)

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

Canny边缘检测算法参考链接:https://www.jb51.net/article/185336.htm

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

难点

由于图像采用放大的效果匹配出的距离偏大,难以把真实距离,并存在误差。

由于哔哩哔哩滑块验证进一步采取做了措施,如果滑动时间过短,会导致验证登入失败。所以我这里采用变速的方法,在相同时间内滑动不同的距离。

误差的存在是必不可少的,有时会导致验证失败,这都是正常现象。

流程

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

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

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

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

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

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

效果图

哔哩哔哩登录为什么要验证,哔哩哔哩登录如何不用验证码(3)

代码实例

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

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()

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

,

栏目热文

哔哩哔哩有账号登录不上怎么办(哔哩哔哩没有退出登录功能怎么办)

哔哩哔哩有账号登录不上怎么办(哔哩哔哩没有退出登录功能怎么办)

有二次元爱好者发现,弹幕视频网站A站打不开了。11月25日,网友发现ACFUN弹幕视频网(俗称A站)无法访问,显示“无法...

2024-01-15 10:06:25查看全文 >>

哔哩哔哩怎样重新登录(哔哩哔哩怎么登录以前账号)

哔哩哔哩怎样重新登录(哔哩哔哩怎么登录以前账号)

就在六一儿童节前夕,隔夜君曾经给你们详细点评过哔哩哔哩最新推出的“青少年模式”---区别于常规意义下的操作体验,在此等模...

2024-01-15 10:22:06查看全文 >>

哔哩哔哩登录要验证怎么办

哔哩哔哩登录要验证怎么办

B站有手机端也有网页版,用户们可以自行选择不同的登录设备登录,但是每次登录都需要额外验证,非常不便。今天小编就为大家介绍...

2024-01-15 10:03:34查看全文 >>

王者荣耀五个位置哪个最难(王者荣耀五个位置难度排名)

王者荣耀五个位置哪个最难(王者荣耀五个位置难度排名)

在王者荣耀中,一般来说,段位越高,玩家的实力就越强。但也未必就百分百如此,特别是对于一些单排的玩家来说,运气成分也会占一...

2024-01-15 09:51:40查看全文 >>

王者荣耀各位置特点(王者荣耀五个位置介绍)

王者荣耀各位置特点(王者荣耀五个位置介绍)

前言:小伙伴们大家好,这里是不仅游戏打得6,长得还很帅的熊猫哥哥~每天都有数千万的玩家在王者荣耀中展开激烈的对战,不同位...

2024-01-15 09:59:14查看全文 >>

哔哩哔哩为什么要重新登录(哔哩哔哩为什么登录不了)

哔哩哔哩为什么要重新登录(哔哩哔哩为什么登录不了)

这个重新登录的时间,也是有差别的,有的是关闭软件之后下次打开,就要重新登录,比如银行类软件,有的是过了一周或是一个月之后...

2024-01-15 09:57:26查看全文 >>

哔哩哔哩怎么彻底退出登录(哔哩哔哩电脑上登录了怎么退出)

哔哩哔哩怎么彻底退出登录(哔哩哔哩电脑上登录了怎么退出)

近日,B站版本更新后,有不少用户发现B站悄然上线了纪念账号设置处理选项,同时也有用户发现,一些已经离世的B站UP主的个人...

2024-01-15 09:44:13查看全文 >>

生活中的生理学现象(生理学现象有哪些例子)

生活中的生理学现象(生理学现象有哪些例子)

在日常生活中,我们经常会遇到一些身体自然反应,比如打嗝、放屁等,这些都是身体为了维持正常功能而产生的自然现象。然而,由于...

2024-01-15 09:38:22查看全文 >>

有哪几种特殊的生理状态(生理规律性有哪些)

有哪几种特殊的生理状态(生理规律性有哪些)

众所周知,人体结构非常复杂,就像一台精密的仪器,有多种器官组织组和儿童,他们之间相互协作相辅相成,才能够维持人体正常机能...

2024-01-15 09:43:32查看全文 >>

人为什么有四个生理弯曲

人为什么有四个生理弯曲

脊柱是人体的支柱,具有承担体重、连接躯干和四肢、保护中枢神经等功能。包括思维在内的人体所有功能均由中枢神经控制。中枢神经...

2024-01-15 09:56:25查看全文 >>

文档排行