前言
利用selenium實作B站模擬登錄操作,廢話不多說,讓我們愉快地開始吧~
效果演示

開發工具
Python版本: 3.6.4
相關模塊:
selenium模塊;
以及一些python自帶的模塊,
Chromedriver:
在下面這個鏈接里下載和電腦上的谷歌瀏覽器版本相匹配的驅動:
http://npm.taobao.org/mirrors/chromedriver/
環境搭建
安裝python并添加到環境變數,pip安裝需要的相關模塊即可,
原理簡介
首先,我們來實體化一個webdriver.Chrome物件,用于自動化操作我們電腦里的谷歌瀏覽器:
browser = webdriver.Chrome(executable_path=chromedriverpath, options=chrome_opts)
接著,我們用它來自動訪問一下B站的登錄界面:
browser.get('https://passport.bilibili.com/login')
并自動填充一下用戶名和密碼:
driver_wait = WebDriverWait(browser, 30)
username_sender = driver_wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login-username"]')))
username_sender.send_keys(username)
password_sender = driver_wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="login-passwd"]')))
password_sender.send_keys(password)
其中用戶名和密碼的輸入框都直接用xpath來定位

然后模擬點擊一下登錄按鈕就可以進入我們的滑塊驗證碼破解環節啦,其中增加time.sleep(3)是為了保證滑塊驗證碼順利彈出:
button = driver_wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class="btn btn-login"]')))
button.click()
time.sleep(3)
B站的滑塊驗證碼大概長這個樣子:

你只需要把滑塊拖動到對應的缺口位置就行了,問題的難點在于如何確定缺口的位置,最簡單粗暴且有效的方式自然是直接對比驗證碼原圖和帶缺口的圖片,從而獲取缺口位置,對于B站來說,你可以這樣來實作這一方式,首先,獲取驗證碼原圖:
image_ori = browser.execute_script('return document.getElementsByClassName("geetest_canvas_fullbg")[0].toDataURL("image/png");')
image_ori = image_ori.split(',')[1]
image_ori = base64.b64decode(image_ori)
image_ori = Image.open(io.BytesIO(image_ori))
類似地,獲取驗證碼帶缺口的圖:
image_gap = browser.execute_script('return document.getElementsByClassName("geetest_canvas_bg")[0].toDataURL("image/png");')
image_gap = image_gap.split(',')[1]
image_gap = base64.b64decode(image_gap)
image_gap = Image.open(io.BytesIO(image_gap))
然后比較兩張圖的像素矩陣從而獲得缺口坐標:
gap_pos = []
for i in range(image_ori.size[0]):
if gap_pos:
break
for j in range(image_ori.size[1]):
pixel_ori = image_ori.getpixel((i, j))
pixel_gap = image_gap.getpixel((i, j))
if abs(pixel_ori[0] - pixel_gap[0]) > 10 and abs(pixel_ori[1] - pixel_gap[1]) > 10 and abs(pixel_ori[2] - pixel_gap[2]) > 10:
gap_pos = [i, j]
break
獲得了缺口坐標之后,我們只需要利用browser控制滑塊移動到缺口所在的位置就可以了:
slider = driver_wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[2]/div[2]/div[6]/div/div[1]/div[2]/div[2]')))
ActionChains(browser).click_and_hold(on_element=slider).perform()
tracks = TrackGenerator.getTracksByExpfunc(distance * 0.93)
for delta_dis in tracks:
ActionChains(browser).move_by_offset(xoffset=delta_dis, yoffset=0).perform()
ActionChains(browser).pause(0.5).release().perform()
其中滑塊的運動軌跡我們可以用一個指數函式來模擬:
def getTracksByExpfunc(distance, delay=5):
tracks = []
offset = 0
for i in np.arange(0.1, delay, 0.1):
delta_dis = round((1 - pow(2, -10 * i / delay)) * distance) - offset
tracks.append(delta_dis)
offset += delta_dis
tracks[-1] += (distance - offset)
return tracks
文章到這里就結束了,感謝你的觀看,Python資訊安全,下篇文章分享Python+Selenium破譯12306驗證碼
為了感謝讀者們,我想把我最近收藏的一些編程干貨分享給大家,回饋每一個讀者,希望能幫到你們,
干貨主要有:
① 2000多本Python電子書(主流和經典的書籍應該都有了)
② Python標準庫資料(最全中文版)
③ 專案原始碼(四五十個有趣且經典的練手專案及原始碼)
④ Python基礎入門、爬蟲、web開發、大資料分析方面的視頻(適合小白學習)
⑤ Python學習路線圖(告別不入流的學習)
All done~私信獲取完整源代碼,,
往期回顧
簡單實作入門級隱寫術
用Python+Selenium破解春秋航空網滑塊驗證碼,資訊安全之路
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295097.html
標籤:其他
上一篇:用Python+hackcaptcha破譯12306影像驗證碼,資訊安全之路
下一篇:職場小強日記——職業定位
