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

yizhihongxing

下面是对 "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图像处理PIL各模块详细介绍(推荐)

    下面是关于“Python图像处理PIL各模块详细介绍(推荐)”的完整攻略: 一、PIL模块介绍 Python Imaging Library(简称PIL),是Python语言的一款强大的图像处理库,可以帮助我们在程序中轻松地处理各种类型的图像。 PIL模块中包含了众多的子模块,其中最常用的是Image模块,其他子模块包括ImageDraw,ImageFilt…

    python 2023年5月13日
    00
  • 关于sys.stdout和print的区别详解

    关于sys.stdout和print的区别详解 在Python中,有多种方式可以将文本输出到控制台或文件,其中包括使用sys.stdout和print语句。虽然它们都可以用于输出文本,但它们之间存在一些重要的区别,下面我们将为您详细介绍这些区别。 sys.stdout的工作原理 sys.stdout是Python标准库中的一个对象,它代表着当前程序中需要标准…

    python 2023年6月3日
    00
  • 基于python实现KNN分类算法

    基于Python实现KNN分类算法 KNN(K-Nearest Neighbors)算法是一种常用的分类算法,它可以用于多分类和回归问题。在Python中,可以使用scikit-learn库实现KNN分类算法。本文将详细讲解Python实现KNN分类算法的整个攻略,包括算法原理、Python实现过程和示例。 算法原理 KNN算法的基本思想是根据样本的特征值,…

    python 2023年5月14日
    00
  • python面试题之列表声明实例分析

    当面试考察Python开发人员时,经常会涉及到关于列表声明的相关问题。Python中的列表是最常见的内置数据类型之一,它具有动态性和可变性,可以存储各种数据类型的值。在本文中,我们将解释Python中的列表声明,并提供几个示例,以帮助您更好地理解列表声明的前提条件和用法。 什么是列表声明? 列表声明是指将一个或多个值分配给列表的过程。在Python中,可以通…

    python 2023年6月6日
    00
  • Python 获得命令行参数的方法(推荐)

    Python 获得命令行参数的方法(推荐) Python 是一种高效、易学且分布式的语言,它可以用来编写各种应用程序,包括命令行工具。因此,获取命令行参数是 Python 中非常基础的操作之一。 基本使用方法 在 Python 中,获取命令行参数可以使用 sys.argv 方法。sys.argv 中的第一个参数表示脚本本身的名称,后面的参数依次表示命令行输入…

    python 2023年6月2日
    00
  • Python中字典及遍历常用函数的使用详解

    Python中字典及遍历常用函数的使用详解 什么是字典 在Python中,字典(dictionary)是一种可变容器模型,可以存储任意数量的无序、可变且可重复的元素对(key-value)。字典中的key必须是唯一的,而value则可以重复,key和value之间使用冒号(:)分隔,整个元素对之间使用逗号(,)分隔,并且整个字典使用大括号({})括起来。例如…

    python 2023年5月13日
    00
  • Python中使用gzip模块压缩文件的简单教程

    那么下面就来详细讲解如何使用Python中的gzip模块来压缩文件,并提供两个示例说明。 1. 什么是gzip模块 gzip模块是Python标准库中的一个用于压缩和解压缩gzip格式文件的模块。gzip格式是一种基于DEFLATE压缩算法的文件压缩格式,通常用于压缩网络传输中的数据或者文件。 2. 使用gzip模块压缩文件的方法 使用gzip模块压缩文件非…

    python 2023年6月3日
    00
  • python pandas库读取excel/csv中指定行或列数据

    如何用Python Pandas库读取Excel或CSV文件中指定行或列的数据可以按照以下步骤进行。 准备 在代码中导入Pandas库: import pandas as pd 然后,使用以下代码一次性读取Excel或CSV文件: # 读取Excel文件 df = pd.read_excel(‘filename.xlsx’) # 读取CSV文件 df = p…

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