下面是对 "Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)" 这篇文章的详细讲解。
标题
标题应该明确地说明文章的主题,因此建议使用以下标题:
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
概述
文章主要讲解如何使用 Python 破解 BiliBili 网站的滑动验证码。BiliBili 是一个流行的视频网站,为了防止滥用,它采用了滑动验证码技术。滑块验证码是一种常见的图形验证码,它需要用户拖动滑块使得滑块和背景图片匹配,以证明用户是人而非机器。滑块验证码是常见的防止爬虫和恶意机器人攻击的技术。
该文章会详细介绍拆分验证码,计算滑块位置,模拟用户行为等步骤,以便让读者更加深入地了解滑块验证码的工作原理。
步骤
以下是文章中涉及的步骤:
1. 下载验证码图片
首先,从 BiliBili 网站下载验证码图片。使用 Python requests 库发送 HTTP GET 请求,获取验证码图片的二进制流,并将其写入文件。代码示例如下:
import requests
url = 'https://captcha.bilibili.com/api/image/v2?type=slide&p=https%3A%2F%2Fpassport.bilibili.com%2F'
response = requests.get(url)
with open('captcha.jpg', 'wb') as f:
f.write(response.content)
2. 拆分验证码
将验证码图片拆分成拼图背景和滑块两部分。要实现这一步,需要使用 Python 的图像处理库 PIL。代码示例如下:
from PIL import Image
img = Image.open('captcha.jpg')
width, height = img.size
# get sliding block position
left = 0
top = 0
right = left + 40
bottom = top + height
slide_block = img.crop((left, top, right, bottom))
slide_block.save('slide_block.jpg')
# get background image
left = 40
top = 0
right = left + width
bottom = top + height
img_bg = img.crop((left, top, right, bottom))
img_bg.save('img_bg.jpg')
3. 计算滑块位置
计算滑块的位置是破解滑块验证码的关键步骤。我们可以使用 Python 的机器学习库 scikit-learn,在滑块拼图背景中训练一个分类模型,来识别出滑块的位置。
具体步骤如下:
- 读取背景图片和拼图;
- 将滑块拼图的 RGB 值打散成多组向量,作为特征向量;
- 遍历拼图背景中的像素点,以每个像素点的 RGB 值为特征向量,输入到分类模型中进行分类。
代码示例如下:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# get feature vector for slide block
slide_block = np.array(slide_block)
slide_block_gray = np.mean(slide_block, axis=2)
height, width = slide_block_gray.shape
feature_vecs = []
for i in range(height):
for j in range(width):
feature_vecs.append(slide_block_gray[i][j])
feature_vecs = np.array(feature_vecs)
# get feature vectors of background image
img_bg = np.array(img_bg)
img_bg_gray = np.mean(img_bg, axis=2)
height, width = img_bg_gray.shape
X_bg = []
for i in range(height):
for j in range(width):
X_bg.append(img_bg_gray[i][j])
X_bg = np.array(X_bg)
# get labels
y_bg = np.zeros_like(X_bg)
# train classifier
X = np.concatenate((feature_vecs, X_bg), axis=0)
y = np.concatenate((np.ones_like(feature_vecs), y_bg), axis=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X_train, y_train)
# predict slide block position
img_bg_edge = np.abs(np.diff(img_bg_gray, axis=1))
slide_block_edge = np.abs(np.diff(slide_block_gray, axis=1))
X_test = np.concatenate((slide_block_edge.reshape(-1), img_bg_edge.reshape(-1)), axis=0).reshape(1, -1)
y_pred = clf.predict(X_test)
slide_position = y_pred[0] - len(slide_block[0]) - 1
4. 模拟用户滑块行为
最后一步是使用 Selenium 库模拟用户拖动滑块。具体步骤如下:
- 打开 BiliBili 登录页面;
- 在输入框中输入用户名和密码;
- 获取滑块和滑块背景的 div 元素以及滑块的滑动距离;
- 模拟鼠标操作,按住滑块并拖动相应的距离;
- 判断是否滑动成功。
代码示例如下:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# open BiliBili login page
url = 'https://passport.bilibili.com/login'
browser = webdriver.Chrome()
browser.get(url)
# input username and password
input_username = browser.find_element_by_id('login-username')
input_password = browser.find_element_by_id('login-passwd')
input_username.send_keys('username')
input_password.send_keys('password')
# move slide block
slide_block_div = browser.find_element_by_xpath('//*[@id="gc-box"]/div/div[2]')
bg_div = browser.find_element_by_xpath('//*[@id="gc-box"]/div/div[2]/div/div[1]/img')
action = ActionChains(browser)
action.click_and_hold(slide_block_div).perform()
action.move_by_offset(slide_position, 0).perform()
action.release().perform()
# check if success
if '验证通过' in browser.page_source:
print('Successfully passed the verification.')
else:
print('Failed to pass the verification.')
总结
本文详细介绍了如何使用 Python 破解 BiliBili 的滑块验证码。其中,包含了拆分验证码、计算滑块位置和模拟用户行为等步骤。虽然 BiliBili 不断升级验证码技术,但知道了破解的基本原理,我们也能够更好地了解滑块验证码的工作原理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python破解BiliBili滑块验证码的思路详解(完美避开人机识别) - Python技术站