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使用代理抓取网站图片(多线程)
Mar 14 Python
举例讲解Python中的算数运算符的用法
May 13 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
python write无法写入文件的解决方法
Jan 23 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
numpy实现RNN原理实现
Mar 02 Python
pandas中DataFrame检测重复值的实现
May 26 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回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
Python实现简单状态框架的方法
2015/03/19 Python
python的变量与赋值详细分析
2017/11/08 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
python实现文件的备份流程详解
2019/06/18 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
html5 input属性使用示例
2013/06/28 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
台湾良兴购物网:EcLife
2019/12/01 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
人代会标语
2014/06/30 职场文书
股东授权委托书范文
2014/09/13 职场文书
mysql部分操作
2021/04/05 MySQL
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript