Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)

下面是对 "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技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • python 判断字符串当中是否包含字符(str.contain)

    在 Python 中,我们可以使用字符串的 str.contains() 方法来判断一个字符串是否包含另一个字符串。这个方法返回一个布尔值,表示目标字符串是否包含指定的子字符串。下面将详细讲解 Python 中 str.contains() 方法的用法。 1. 判断单个字符串是否包含指定子字符串 我们可以使用 str.contains() 方法来判断一个字符…

    python 2023年5月14日
    00
  • 详解Python字符串原理与使用的深度总结

    Python中的字符串是一种非常重要的数据类型,它可以用于存储文本数据。在本文中,我们将详细讲解Python字符串的原理和使用,包括字符串的定义、常用操作、格式化输出等内容。 1. 字符串的定义 在Python中,字符串可以使用单引号、双引号或三引号来定义。以下是一些示例: str1 = ‘Hello, World!’ str2 = "Hello,…

    python 2023年5月14日
    00
  • Python3的正则表达式详解

    Python3的正则表达式详解 正则表达式是一种用于描述字符串模式的语言,它可以用于匹配、查找、替换和割字符串。Python中的re模块供了对正则表达式的支持,可以方便进行字符串的处理。本文将详细讲解Python3中正则表达式的语法和re模块的常用函数以及两个常用的匹配实例。 正则表达式语法 正则表达式由一些特殊字符和普通字符组成,用于字符串模式。下面是一些…

    python 2023年5月14日
    00
  • Python从csv文件中读取数据及提取数据的方法

    下面是关于“Python从csv文件中读取数据及提取数据的方法”的完整攻略。 1. csv文件简介 CSV即Comma Separated Values,即逗号分隔值,是一种简单易用的通用文件格式,常用于存储或交换不同系统之间的数据。CSV格式的文件一般以纯文本形式存储,可以使用任何文本编辑器打开、查看和编辑。 一个典型的CSV文件包含多行数据,每行数据由若…

    python 2023年6月3日
    00
  • python语言线程标准库threading.local解读总结

    Python语言线程标准库threading.local解读总结 为什么需要线程局部存储? 多线程编程时,会出现多个线程间共享同一个变量的情况,这时候就需要使用线程局部存储。 以常见的Web应用为例,比如Flask框架,在一个请求过程中,可能需要访问全局的数据库连接,但是如果多个请求同时进行时,就会出现线程安全问题。如果每个请求都带有自己的数据库连接,就不会…

    python 2023年5月19日
    00
  • python函数的作用域及关键字详解

    下面是详细讲解“python函数的作用域及关键字详解”的完整攻略。 Python函数的作用域 Python函数的作用域分为全局作用域和局部作用域。 全局作用域包含整个程序可访问的所有变量和函数,它们在主程序外部定义。 局部作用域包含在函数中定义的变量和函数,它们只在函数内部可访问。 当Python解释器遇到变量时,它会查找变量的作用域。如果变量在局部作用域中…

    python 2023年6月5日
    00
  • python实现批量文件重命名

    下面是Python实现批量文件重命名的完整攻略,包含以下步骤: 步骤一:确定重命名规则 在准备批量重命名之前,首先需要确定重命名规则。例如,可以将所有文件的文件名改为统一的格式,或者添加前缀、后缀等等。在此,我们将所有文件名改为“file_1, file_2, file_3”这种格式。 步骤二:导入os库 在Python中实现批量重命名,需要使用os库,这个…

    python 2023年6月5日
    00
  • python如何做代码性能分析

    当我们在编写程序时,考虑程序的性能是非常重要的。在Python中,我们可以使用多种方法来优化和分析我们的代码的性能。下面是一些可能有用的技巧和工具。 1. 微基准测试 微基准测试是一种测试技术,用于测量非常小的一部分代码的性能。通常情况下,这些测试适用于一个函数或者一小段代码。 在Python中,我们可以使用timeit模块来进行微基准测试。以下是一个示例:…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部