python破解bilibili滑动验证码登录功能
作者:邪恶马克思 发布时间:2023-04-10 06:03:05
标签:python,bilibili,滑动,验证码,登录
地址:https://passport.bilibili.com/login
左图事完整验证码图,右图是有缺口的验证码图
步骤:
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滑动验证码登录功能,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/thindi/article/details/83152903
0
投稿
猜你喜欢
- 1.绘制发散型柱状图python绘制发散型柱状图,展示单个指标的变化的顺序和数量,在柱子上添加了数值文本。实现代码:import numpy
- 目录1、吃金币2、打乒乓3、滑雪4、并夕夕版飞机大战5、打地鼠6、小恐龙7、消消乐8、俄罗斯方块9、贪吃蛇10、24点小游戏11、平衡木12
- pandas.read_csv参数整理 读取CSV(逗号分割)文件到DataFrame也支持文件的部分导入和选择迭代更多帮助参见:
- 创建一张作者表,author,创建外键与book表,多对多关系 ,外键字段放在那张表都可以,class Author(models.Mode
- 下文要实现的可视化大屏内容:需要在地图上将我司船舶的轨迹展示出来。听起来很简单,一开始我也是这样想的。通过一些BI工具应该可以轻松实现,比如
- 用python另一个抢票神器,你get到了吗?2017年时间飞逝,转眼间距离2018年春节还有不到1个月的时间,还在为抢不到火车票发愁吗?作
- 在《python深度学习》这本书中。一、21页mnist十分类导入数据集from keras.datasets import mnist(t
- windows删除jupyter notebook 没办法的办法pip uninstall jupyter -ypip uninstall
- bs4的安装要使用BeautifulSoup4需要先安装lxml,再安 * s4pip install lxmlpip install bs4
- 首先说一下 ,我是用的anaconda3装的pytorch为了方便建议你也安装一个。其实这个挺简单的,你找找“c:/user/你的用户名/”
- 本文实例讲述了Python学习笔记之字符串和字符串方法。分享给大家供大家参考,具体如下:字符串在 python 中,字符串的变量类型显示为
- 在web开发中经常遇到多关键词对对单个字段查询,我一般是通过动态数组来实现的。当然多个关键词的一般是用空格或,隔开,我这几假设多个关键词用空
- PHP getName() 函数实例返回 XML 元素及其子元素的名称:<?php $xml=<<<XML<?
- 前言手里有一点点公司的股票, 拿不准在什么时机抛售, 程序员也没时间天天盯着看,不如动手写个小程序, 把股票趋势每天早上发到邮箱里,用 py
- 阅读上一节:无序列表信息有时候是无序归纳的,有的却有着明确的顺序,在上一篇也提到了。那么简单的来想一下身边有哪些事物是有先后顺序的:操作步骤
- 目录一、使用说明二、代码分析1. 功能函数2. 回调函数3. 线程生成函数4. 效果展示写在最后在科研学习的过程中,我们难免需要查询相关的文
- 通常我们做网站,设计版面布局是第一步,如何做到版面布局具有创意又美观大方呢?这就需要一定的版面处理功底。让我们先来了解一下版面布局的步骤:一
- 前言开发环境:Centos 7 + Python 3.5.1 + Qt Creator(只是使用Qt Creator编译而已,并没有使用QT
- AttribteError: ‘module' object has no attribute xxx'描述:模块没有相关属
- 原因是:It looks like you need to flush stdout periodically (e.g. sys.stdo