python破解bilibili滑動驗證碼登錄功能
地址:https://passport.bilibili.com/login
左圖事完整驗證碼圖,右圖是有缺口的驗證碼圖
步驟:
1.準備bilibili賬號
2.工具:pycharm selenium chromedriver PIL
3.破解思路:
找到完整驗證碼和有缺口的驗證碼圖片,然后計算缺口坐標,再利用selenium移動按鈕到指定位置,齊活
步驟代碼如下:
先導(dǎo)入需要的包和庫
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)#設(shè)置等待 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#設(shè)置偏移量 #拼接第一行 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:#加速狀態(tài) a=1.5#加速 else: a=-3#減速 #數(shù)學(xué)公式 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()#執(zhí)行 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()
測試運行正常,偶爾有對不準的現(xiàn)象,需要調(diào)整distance的值
總結(jié)
以上所述是小編給大家介紹的python破解bilibili滑動驗證碼登錄功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
python3+PyQt5 實現(xiàn)Rich文本的行編輯方法
今天小編就為大家分享一篇python3+PyQt5 實現(xiàn)Rich文本的行編輯方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06跟老齊學(xué)Python之使用Python操作數(shù)據(jù)庫(1)
本文詳細講述了使用python操作數(shù)據(jù)庫所需要了解的知識以及準備工作,十分的詳盡,這里推薦給想學(xué)習(xí)python的小伙伴。2014-11-11python批量設(shè)置多個Excel文件頁眉頁腳的腳本
這篇文章主要介紹了python批量設(shè)置多個Excel文件頁眉頁腳的源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03python3往mysql插入二進制圖片出現(xiàn)1064錯誤
這篇文章主要介紹了python3往mysql插入二進制圖片出現(xiàn)1064錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Pytorch 實現(xiàn)計算分類器準確率(總分類及子分類)
今天小編就為大家分享一篇Pytorch 實現(xiàn)計算分類器準確率(總分類及子分類),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01