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


猜你喜欢
- 之前只是单纯的会用,因为vue关于父子组件通讯差别有一点点大。1.在父组件内传递变量的时候,需要加冒号:,否则你就只是单纯的传递了一个字符串
- 1. lr_scheduler相关lr_scheduler = WarmupLinearSchedule(optimizer, warmup
- MySQL数据库应用广泛,尤其对于JAVA程序员,不会陌生。如果在不想采购云数据库的情况下,可以自行安装MySQL数据库。文章将介绍,手动在
- 表单外观的美化很多时候,我们仅仅为了实现数据采集这个功能来使用表单,常看到的表单都是“千人一面”、毫无
- 框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。下表给出了相对http://store.company
- 摘要:在python的使用过程中,难免会遇到要移除列表中对象的要求。这时可以使用remove函数。对于python中的remove()函数,
- Python的matplotlib包可以轻松的将数据可视化,博主最近遇到了一个问题,博主想同时在两个窗口展示两张图,但是代码运行结果总是显示
- 自定义图片生成词云图的多种方法有时候我们会根据具体的场景来结合图片展示词云,比如我分析的是美团评论,那么最好的展示方法就是利用美团的logo
- 如下所示:<strong><span style="font-size:14px;">文本过滤&
- unsafe 包func Alignof(x ArbitraryType) uintptrfunc Offsetof(x Arbitrary
- 一、Visdom简介Visdom是由Facebook公司开发的一个进行数据可视化的Web应用程序,支持Torch、Numpy、Pytorch
- 运行的时候,有时候会出现语法错误: IndentationError: unexpected indent可以用如下方法
- 我们知道 map 和 filter 是两种有效的 Python 方法来处理可迭代对象。但是,如果你同时使用 map 和 filter,代码可
- 先来回顾一下栈和队列的基本概念:相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。不同点:栈(
- 使用Python创建websocket服务端,并给出不同客户端的请求一、 WebSocket是啥WebSocket 和HTTP一样,也是一种
- python2.7wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.
- LEN()函数获取字符串的长度。LEN( <字符> )--返回整型SUBSTRING()函数截取字符内指定位置、指定内容的字符。
- 本文实例讲述了Python使用爬虫抓取美女图片并保存到本地的方法。分享给大家供大家参考,具体如下:图片资源来自于www.qiubaichen
- 小白学习一下vue,然后了解到了webpack相关的知识,然后就各种安装cnpm 是国内的源相比国际源要快很多,不知道cnpm的自己查一下吧
- ASP中给函数传参确实是个麻烦事,当参数个数特别多的时候(比如有七八个或者更多的参数个数)差不多就要眼冒金星了,一个个的数吧。而且要命的是参