python破解bilibili滑动验证码登录功能


Posted in Python onSeptember 11, 2019

地址:https://passport.bilibili.com/login

左图事完整验证码图,右图是有缺口的验证码图

                                  python破解bilibili滑动验证码登录功能                                  python破解bilibili滑动验证码登录功能

步骤:

1.准备bilibili账号

2.工具:pycharm selenium chromedriver PIL

3.破解思路:

找到完整验证码和有缺口的验证码图片,然后计算缺口坐标,再利用selenium移动按钮到指定位置,齐活

步骤代码如下:

先导入需要的包和库

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from urllib.request import urlretrieve
from bs4 import BeautifulSoup
from lxml.html import etree
import re,requests
from PIL import Image
from time import sleep
from .config import username,password
class Jiyan_test:
  def __init__(self):
    self.url='https://passport.bilibili.com/login'
    self.brower=webdriver.Chrome('chromedriver')
    self.wait=WebDriverWait(self.brower,20)#设置等待
 
  def login(self):
    self.brower.get(self.url)
    self.user=self.wait.until(EC.presence_of_element_located((By.ID,'login-username')))
    self.passwd=self.wait.until(EC.presence_of_element_located((By.ID,'login-passwd')))
    self.user.send_keys(username)
    self.passwd.send_keys(password)
  def get_images(self):#获取验证码图片
    # print(self.brower.page_source)
    full_position=[]#完整散图坐标
    bg_position=[]#缺口散图坐标
    html=etree.HTML(self.brower.page_source)
    gt_cut_fullbg_slices=html.xpath('//div[@class="gt_cut_fullbg_slice"]/@style')
    full_slice_url=re.findall('url\(\"(.*)\"\);',gt_cut_fullbg_slices[0])[0].replace('webp','jpg')
    gt_cut_bg_slices = html.xpath('//div[@class="gt_cut_bg_slice"]/@style')
    bg_slice_url = re.findall('url\(\"(.*)\"\);', gt_cut_bg_slices[0])[0].replace('webp', 'jpg')
    print(gt_cut_fullbg_slices)
    for i in gt_cut_fullbg_slices:
      position=re.findall('background-position: (.*);',i)[0].replace('px','').split(' ')
      position=[int(i) for i in position]
      full_position.append(position)
    for i in gt_cut_fullbg_slices:
      position = re.findall('background-position: (.*);', i)[0].replace('px','').split(' ')
      position=[int(i) for i in position]
      bg_position.append(position)
    print(full_position)
    print(bg_position)
    print(full_slice_url)
    print(bg_slice_url)
    full_pic_data=requests.get(full_slice_url).content
    bg_pic_data=requests.get(bg_slice_url).content
    with open('image/full_pic.jpg','wb') as f:
      f.write(full_pic_data)
    with open('image/bg_pic.jpg', 'wb') as f:
      f.write(bg_pic_data)
    full_image=Image.open('image/full_pic.jpg')
    bg_image=Image.open('image/bg_pic.jpg')
    return full_image,bg_image,full_position,bg_position

分割图片 

def pic_cut(self,file,position):#分割图片
    first_line_pic=[]
    second_line_pic=[]
    # full_image, bg_image, full_position, bg_position=self.get_images()
    for p in position:
      if p[1]==-58:
        first_line_pic.append(file.crop((abs(p[0]),58,abs(p[0])+10,166)))
      if p[1]==0:
        second_line_pic.append(file.crop((abs(p[0]),0,abs(p[0])+10,58)))
    print(first_line_pic)
    print(second_line_pic)
    return first_line_pic,second_line_pic

合并图片

   

def merge_pics_new(self,first_line_pic,second_line_pic,file_name):
    #新建图片
    image=Image.new('RGB',(260,116))
    offset=0#设置偏移量
    #拼接第一行
    for i in first_line_pic:
      image.paste(i,(offset,0))
      offset+=i.size[0]
    offset_x=0
    #拼接第二行
    for j in second_line_pic:
      image.paste(j,(offset_x,58))
      offset_x+=j.size[0]
    image.save('image/'+file_name)#合成完整图片
 
  def merge_pics(self):#合并图片
    #先割切乱码图片
    full_image, bg_image, full_position, bg_position=self.get_images()
    first_line_pic, second_line_pic=self.pic_cut(full_image,full_position)
    self.merge_pics_new(first_line_pic, second_line_pic,'full_new_pic.jpg')
    first_line_pic, second_line_pic = self.pic_cut(bg_image, bg_position)
    self.merge_pics_new(first_line_pic, second_line_pic, 'bg_new_pic.jpg')

再判断图片是否一样

def check_pics_is_same(self,bg_image,full_image,x,y):#判断图片是否一样
    bg_pixel=bg_image.getpixel((x,y))
    full_pixel=full_image.getpixel((x,y))
    for i in range(0,3):
      if abs(bg_pixel[i]-full_pixel[i])>=50:
        return False
      else:
        return True

计算滑块距离

   

def reckon_distance2(self):#计算滑块
    try:
      full_image = Image.open('image/full_new_pic.jpg')
      bg_image = Image.open('image/bg_new_pic.jpg')
      for i in range(0,full_image.size[0]):
        for j in range(0,full_image.size[1]):
          if not self.check_pics_is_same(bg_image,full_image,i,j):
            return i
    except Exception:
      print('图片读取失败')

计算运动轨迹

    

def reckon_trail(self):#计算运动轨迹
    print('计算运动轨迹')
    track=[]
    distance=self.reckon_distance2()
    distance=int(distance)-7#矫正值
    print('缺口坐标',distance)
    fast_distance=distance*(4/5)
    start,v0,t=0,0,0.2
    while start<distance:
      if start<fast_distance:#加速状态
        a=1.5#加速
      else:
        a=-3#减速
      #数学公式 s=v0*t+1/2 v*t平方
      move=v0*t+1/2*a*t*t
      #当前速度
      v=v0+a*t
      #重置粗速度
      v0=v
      #重置起始位置
      start+=move
      track.append(round(move))
    return track

 

模拟拖动

def move_block(self):# 模拟拖动滑块
    print('开始模拟')
    track=self.reckon_trail()
    #找寻滑块标签
    slider=self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'gt_slider_knob')))
    ActionChains(self.brower).click_and_hold(slider).perform()#执行
    for x in track:
      ActionChains(self.brower).move_by_offset(xoffset=x,yoffset=0).perform()
    sleep(0.4)
    ActionChains(self.brower).release().perform()#释放滑块
 
if __name__ == '__main__':
  c=Jiyan_test()
  c.login()
  c.merge_pics()
  c.move_block()

测试运行正常,偶尔有对不准的现象,需要调整distance的值

总结

以上所述是小编给大家介绍的python破解bilibili滑动验证码登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
讲解python参数和作用域的使用
Nov 01 Python
python网络编程之读取网站根目录实例
Sep 30 Python
python中as用法实例分析
Apr 30 Python
django表单实现下拉框的示例讲解
May 29 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
Python玩转PDF的各种骚操作
May 06 Python
Apache部署Django项目图文详解
Jul 30 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
Python中的xlrd模块使用原理解析
May 21 Python
python修改FTP服务器上的文件名
Sep 11 #Python
解析python实现Lasso回归
Sep 11 #Python
Python 点击指定位置验证码破解的实现代码
Sep 11 #Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 #Python
python实现的发邮件功能示例
Sep 11 #Python
python 字符串常用函数详解
Sep 11 #Python
python sqlite的Row对象操作示例
Sep 11 #Python
You might like
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
python中函数总结之装饰器闭包详解
2016/06/12 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
大学社团计划书
2014/05/01 职场文书
企业安全生产标语
2014/06/06 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
黄埔军校观后感
2015/06/10 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android