吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6323|回复: 42
收起左侧

[Python 转载] 破解B站登录的滑动验证

[复制链接]
1830521742 发表于 2020-3-25 09:28
本帖最后由 1830521742 于 2020-3-25 13:09 编辑

思路:
1.获取滑动的背景图(B站的滑动模块位置是不固定的,另外源码里又没找到原图,所以就写个循环不停的获取图片,然后PS进行拼接,得出正确的背景图
2.判断原背景图和加了滑动模块的背景图的像素差距来找出x轴的移动距离
3.使用位移公式来求出正常人的滑动模块轨迹
4.使用python+selenium完成模拟人手鼠标的拖拽
5.完成破解

[Python] 纯文本查看 复制代码
from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import os
from PIL import Image
from selenium.webdriver import ActionChains
import random


def get_snap(driver):
    driver.save_screenshot('snap.png')
    snap_obj = Image.open('snap.png')
    return snap_obj


def get_image(driver):
    image = driver.find_element_by_class_name('geetest_canvas_slice')
    time.sleep(1)
    size = image.size
    location = image.location
    left = location['x']
    top = location['y']
    right = left + size['width']
    bottom = top + size['height']
    snap_obj = get_snap(driver)
    img_obj = snap_obj.crop((left, top, right, bottom))
    img_obj.save('image1.png')
    for i in range(1, 11):
        image2 = Image.open('bilibili_image/image{}.png'.format(str(i)))
        rgb = (image2.load()[58, 20])
        rgb2 = (img_obj.load()[58, 20])
        if rgb[0] == rgb2[0] and rgb[1] == rgb2[1] and rgb[2] == rgb2[2]:
            img_obj.save('image1.png')
            return img_obj, image2


def find_jl(image_obj1, image_obj2):
    start_x = 58
    # 从坐标系(58,10开始往下扫描)
    start_y = 10
    for x in range(start_x, image_obj1.size[0]):
        for y in range(start_y, image_obj1.size[1] - 16):
            rgb = image_obj1.load()[x, y]
            rgb2 = image_obj2.load()[x, y]
            if abs(rgb[0] - rgb2[0]) > 60 and abs(rgb[1] - rgb2[1]) > 60 and abs(rgb[2] - rgb2[2]) > 60:
                # print(rgb)
                return x - 6


def get_tracks(distance):
    distance += 20
    # v = V0+a*t
    # S = v*t+0.5*a*(t**2)
    v0 = 0
    s = 0
    t = 0.4
    mid = distance * 3 / 5
    forward_tracks = []
    back_tracks = [-1, -1, -1, -1, -2, -2, -2, -2, -3, -3, -3, 1]
    while s < distance:
        if s < mid:
            a = 2
        else:
            a = -3
        v = v0
        track = v * t + 0.5 * a * (t ** 2)
        track = round(track)
        v0 = v + a * t
        s += track
        forward_tracks.append(track)
    return forward_tracks, back_tracks


def RUN(driver, track):
    slider_button = driver.find_element_by_class_name('geetest_slider_button')
    ActionChains(driver).click_and_hold(slider_button).perform()
    time.sleep(0.3)
    for i in track[0]:
        ActionChains(driver).move_by_offset(xoffset=i, yoffset=0).perform()
    time.sleep(0.2)
    for j in track[1]:
        ActionChains(driver).move_by_offset(xoffset=j, yoffset=0).perform()
    time.sleep(0.3)
    random_number = random.uniform(0, 2)
    ActionChains(driver).move_by_offset(xoffset=-random_number, yoffset=0).perform()
    time.sleep(random.uniform(0.5, 1))
    ActionChains(driver).move_by_offset(xoffset=random_number, yoffset=0).perform()
    ActionChains(driver).release().perform()


def main(user_id, password):
    os.system("taskkill /f /im chromedriver.exe")
    url = 'https://passport.bilibili.com/login'
    # 1.登录页面
    driver = webdriver.Chrome()
    timeout = WebDriverWait(driver, 3)
    driver.get(url)
    # 2.输入账号和密码点登录
    timeout.until(EC.element_to_be_clickable((By.ID, 'login-username')))
    user_button = driver.find_element_by_id('login-username')
    user_button.send_keys(user_id)
    time.sleep(random.uniform(0, 1))
    password_button = driver.find_element_by_id('login-passwd')
    password_button.send_keys(password)
    login_button = driver.find_element_by_class_name('btn-login')
    login_button.click()
    time.sleep(1)
    # 3.得到滑动图片
    # for i in range(100):
    #     if i >= 1:
    #         driver.find_element_by_class_name('geetest_panel_error_content').click()
    #         time.sleep(1)
    #     for j in range(5):
    #         get_image(driver, str(i)+str(j))
    #         time.sleep(0.5)
    #         driver.find_element_by_class_name('geetest_refresh_1').click()
    #         time.sleep(1)
    image_obj = get_image(driver)
    # 4.计算滑动距离
    distance = find_jl(image_obj[0], image_obj[1])
    # 5.通过匀加速位移度算法,算出人手滑动轨迹
    track = get_tracks(distance)
    # 6.执行
    RUN(driver, track)
    # 7.关闭浏览器
    time.sleep(5)
    driver.close()


if __name__ == '__main__':
    user_id = 'user'
    password = 'password'
    main(user_id, password)


源码+原图地址:链接: https://pan.baidu.com/s/1Ie2aHUJW8xvh-GQcM5AfYA 提取码: si9f

免费评分

参与人数 6吾爱币 +6 热心值 +5 收起 理由
不是浮夸 + 1 我很赞同!
vagrantear + 1 + 1 谢谢@谢谢
非法菜鸟 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
威风的黑龙 + 1 + 1 谢谢@Thanks!
一份情,一个家 + 1 + 1 我很赞同!
南极星_睬C + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

liuyq 发表于 2020-3-25 10:43
本帖最后由 liuyq 于 2020-3-25 11:00 编辑

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
======== RESTART: C:\Users\liuyq\Desktop\bilibili_\login_bilibili.py ========
Traceback (most recent call last):
  File "C:\Users\liuyq\Desktop\bilibili_\login_bilibili.py", line 132, in <module>
    main(user_id, password)
  File "C:\Users\liuyq\Desktop\bilibili_\login_bilibili.py", line 119, in main
    distance = find_jl(image_obj[0], image_obj[1])
TypeError: 'NoneType' object is not subscriptable
>>>

image1.png
运行出错,截图滑动图片位置不正确。
liuyq 发表于 2020-3-26 10:46
1830521742 发表于 2020-3-25 12:37
能不能发一下  是哪个图片验证出错?

是image1这个截图如下图,不是正确的验证图片。
105918mxso8nns6m1b1qbs.png
原因我找到了,我是WIN10系统,显示设置是125%,改成100%就可以了,但还是有时候会出现错误提示。
image.png

还有个问题就是由于滑动移动太慢而出现验证失败的问题
未标题-1.jpg
hackgsl 发表于 2020-3-25 09:31
super.single430 发表于 2020-3-25 09:35
666,支持
落花时节又逢君 发表于 2020-3-25 09:39
666,厉害
andykeos 发表于 2020-3-25 09:41
666 多谢分享
帅气的王尼玛 发表于 2020-3-25 09:42
这个牛批了哟,思路好清晰
Antony丶 发表于 2020-3-25 09:42
我就看看不说话。
chenmg 发表于 2020-3-25 09:42
其实这个思想其他网站改改就能用
whsdaks 发表于 2020-3-25 09:50
厉害了,前来学习
 楼主| 1830521742 发表于 2020-3-25 09:50
chenmg 发表于 2020-3-25 09:42
其实这个思想其他网站改改就能用

对的!  不过这个思路暂时没有解决左边模块  和 右边模块贴的太近的问题,原因是左边的模块形状和出现的位置会有变化。 导致像素识别过程容易扫描到左边的模块,进而导致识别错误。  解决方式目前是加个循环,来判断拖动结果。如果没成就刷新界面重新识别。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表