破解b站极验验证码

破解极验验证码
本文介绍了一种使用Python和Selenium破解极验滑块验证码的方法。通过对比前后两张图像找到拼图改动的位置,模拟人类操作移动滑块到指定位置。文章详细展示了如何定位图片、获取图像并对比像素差异,最终实现自动化识别和破解。

 

 

这就是极验验证码,通过拖动滑块移动拼图来验证。我们观察到点击滑块时拼图才会出现,所以我们可以在点击滑块之前截取图像,点击滑块再截取一次图像,将前后两次图像做比较就可以找到图片改动的位置。获得位置后,我们需要模拟人类的操作将滑块移动到指定的位置。代码如下:

#识别b站极验验证码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from io import BytesIO
import io
from PIL import Image
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains

EMAIL = "wdl1078390625@qq.com"
PASSWORD = "wdl-075483267123"

class BilibiliTest():
    def __init__(self):
        self.url = "https://passport.bilibili.com/login"
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser,20)
        self.email = EMAIL
        self.password = PASSWORD
        self.browser.get(self.url)
        email = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
        password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
        email.send_keys(self.email)
        password.send_keys(self.password)

        self.button = self.get_test_button()
        self.img1,self.img2 = self.get_test_image()
        #保存图片
        self.img1.save('b1.png')
        self.img2.save('b2.png')
        
    def get_test_button(self):
        button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.gt_slider_knob')))
        return button
    
    #获得截图中图片的位置
    def get_position(self):
        action = ActionChains(self.browser)
        action.move_to_element(self.button)
        self.button.click()
        img = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.gt_cut_fullbg.gt_show')))
        location = img.location
        size = img.size
        top = location['y']
        bottom = location['y'] + size['height']
        left = location['x']
        right = location['x'] + size['width']
        return (top,bottom,left,right)
    
    #获得图片    
    def get_test_image(self):
        top,bottom,left,right = self.get_position()
        time.sleep(1)
        screenshot = self.get_screenshot()
        #浏览器缩放,所以要乘1.25,读者根据自己的需求修改之
        img1 = screenshot.crop((left*1.25,top*1.25,right*1.25,bottom*1.25))
        time.sleep(1)
        ActionChains(self.browser).click_and_hold(self.button).perform()
        time.sleep(1)
        screenshot = self.get_screenshot()
        img2 = screenshot.crop((left*1.25,top*1.25,right*1.25,bottom*1.25))
        return (img1,img2)
    
    #对比像素点是否一致
    def is_pixel_equal(self,img1,img2,x,y):
        pixel1 = img1.load()[x,y]
        pixel2 = img2.load()[x,y]
        #副本图片中常有干扰的灰块,与原图像素不一致但差距小,用threshold变量排除干扰
        threshold = 80
        if abs(pixel1[0]-pixel2[0]) < threshold and \
            abs(pixel1[1]-pixel2[1]) < threshold and \
            abs(pixel1[2]-pixel2[2]) < threshold:
            return True
        else:
            return False
    
    #对比各像素点是否一致        
    def get_gap(self,img1,img2):
        left = 80
        for i in range(left,img1.size[0]):
            for j in range(img1.size[1]-30):
                if not self.is_pixel_equal(img1,img2,i,j):
                    left = i
                    return left
        return left
        
    
    #获取滑块移动轨迹
    def get_track(self, distance):

        # 移动轨迹
        track = []
        current = 0
        mid = (distance-30) * 5 / 9
        mid2 = (distance-30) * 7 / 9
        t = 0.2
        # 初速度
        v = 3
        #初始加速度为2
        a = 2
        #初始加速度增量
        aa = 0.3
          
        while current < distance-25:
            if current < mid:
                a += aa
            elif current < mid2:
                a += aaelse:
                if a < 0 :
                    a -= aa
                else:
                    a = -a + 1
            # 初速度v0
            v0 = v
            # 当前速度v = v0 + at
            v = v0 + a * t
            # 移动距离x = v0t + 1/2 * a * t^2
            move = v0 * t + 1 / 2 * a * t * t
            # 当前位移
            current += round(move)
            # 加入轨迹
            track.append(round(move))

        track.append(0)
        track.append(-3)
        track.append(-2)
        print("distance:"+str(distance)+"track:")
        print(track)
        return track
    #移动滑块
    def move_to_gap(self,button,tracks):
        ActionChains(self.browser).click_and_hold(button).perform()
        for x in tracks:
            ActionChains(self.browser).move_by_offset(xoffset=x,
                yoffset=0).perform()
        time.sleep(0.3)
        ActionChains(self.browser).release().perform()
    
    #截屏
    def get_screenshot(self):
        screenshot = self.browser.get_screenshot_as_png()
        screenshot = Image.open(BytesIO(screenshot))
        return screenshot
        
    def login(self):
        distance = self.get_gap(self.img1,self.img2)
        track = self.get_track(distance)
        self.move_to_gap(self.button,track)
        time.sleep(10)
        

def main(args):
    bilibili = BilibiliTest()
    bilibili.login()
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

 

转载于:https://www.cnblogs.com/wdl1078390625/p/9971638.html

<think>好的,我现在需要解决用户的问题,即如何生成4点选验证码的userresponse参数。首先,我需要了解4点选验证码的基本流程和相关参数。根据用户提供的引用内容,特别是引用[2]中提到四代滑块验证码的加密参数w的生成变得简单,这可能意味着点选验证码的userresponse生成也有类似的简化逻辑。 首先,userresponse通常是用户操作后的加密结果,可能包含坐标、时间等信息。对于点选验证码,用户需要点击图片中的特定位置,系统会记录这些点击的坐标,并进行加密处理生成userresponse。因此,生成userresponse的关键在于正确加密坐标数据。 接下来,参考引用[3]中提到点选验证码需要生成随机汉字的坐标,这可能与4的点选逻辑相似。用户点击的位置坐标需要被加密,可能使用特定的算法,如AES或RSA,或者自定义的哈希处理。此外,可能需要考虑时间戳、轨迹数据等其他参数,但根据四代的简化特点,可能主要关注坐标转换。 然后,我需要确定加密的具体步骤。根据三代的经,userresponse可能由坐标值经过某种计算得出,比如将坐标转换为字符串后进行位移或拼接,再进行Base64编码或哈希处理。例如,每个坐标点的x和y值可能被处理成特定格式的字符串,再进行拼接和加密。 另外,引用[2]中提到的逆向分析流程可能适用。通过抓包获取生成userresponse的请求,分析其中的参数变化,找到加密前的原始数据结构和加密方法。可能需要使用Python中的加密库,如hashlib、hmac或cryptography,来实现相同的加密逻辑。 需要注意的是,四代可能引入了新的参数或不同的加密密钥,因此需要实际抓取最新的验证码请求进行分析。此外,动态参数如challenge或token可能影响加密过程,必须确保这些参数的正确获取和参与计算。 总结步骤可能包括:获取用户点击的坐标点列表,将每个坐标转换为特定格式的字符串,拼接所有坐标数据,进行加密(如HMAC-SHA256),再编码(如Base64或十六进制),最终生成userresponse参数。此外,可能需要处理时间戳和轨迹数据,但根据四代的简化,可能主要关注坐标处理。 最后,证生成的userresponse是否有效,需要通过实际测试,模拟请求并检查服务端的响应是否通过证。可能需要多次调试和调整加密参数或算法,确保生成的userresponse符合服务端的要求。</think>### 4点选验证码userresponse生成方法 1. **核心参数分析** 四代点选验证码的`userresponse`是加密后的用户点击坐标数据,用于服务端证操作真实性。其生成逻辑通常包含以下步骤: - **坐标采集**:记录用户点击的汉字位置坐标,例如点击点$P_1(x_1,y_1), P_2(x_2,y_2)$等。 - **数据拼接**:将坐标转换为字符串并拼接,例如: ``` raw_str = f"{x1},{y1}|{x2},{y2}|..." ``` - **加密处理**:使用特定算法(如HMAC-SHA256)结合动态密钥(如服务端下发的`challenge`)进行加密[^2]。 2. **加密实现示例(Python)** ```python import hmac import hashlib import base64 def generate_userresponse(coords, challenge): # 坐标转换为字符串,例如:"12,56|89,30" coord_str = "|".join([f"{x},{y}" for x, y in coords]) # 使用HMAC-SHA256加密 hmac_obj = hmac.new(challenge.encode(), coord_str.encode(), hashlib.sha256) digest = hmac_obj.digest() # Base64编码生成最终userresponse return base64.b64encode(digest).decode() ``` 3. **关键注意事项** - **动态参数依赖**:`challenge`参数需从验证码初始化请求中获取,具有时效性。 - **轨迹模拟**:部分高级场景需生成鼠标移动轨迹数据,但四代可能对此要求较低。 - **坐标精度**:坐标需与实际点击位置误差控制在±3像素内,否则触发异常检测[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值