Python破解BiliBili滑塊驗(yàn)證碼的思路詳解(完美避開人機(jī)識(shí)別)
準(zhǔn)備工作
B站登錄頁(yè) https://passport.bilibili.com/login
python3
pip install selenium (webdriver框架)
pip install PIL (圖片處理)
chrome driver:http://chromedriver.storage.googleapis.com/index.html
firefox driver:https://github.com/mozilla/geckodriver/releases
B站的滑塊驗(yàn)證碼如上。
這類驗(yàn)證碼可以使用 selenium 操作瀏覽器拖拽滑塊來(lái)進(jìn)行破解,難點(diǎn)兩個(gè),一個(gè)如何確定拖拽到的位置,另一個(gè)是避開人機(jī)識(shí)別(反爬蟲)。
確定滑塊驗(yàn)證碼需要拖拽的位移距離
有三種方式
- 人工智能機(jī)器學(xué)習(xí),確定滑塊位置
- 通過(guò)完整圖片與缺失滑塊的圖片進(jìn)行像素對(duì)比,確定滑塊位置
- 邊緣檢測(cè)算法,確定位置
各有優(yōu)缺點(diǎn)。人工智能機(jī)器學(xué)習(xí),確定滑塊位置,需要進(jìn)行訓(xùn)練,比較麻煩,也可以看是否存在在線api可以調(diào)用。以下介紹其他兩種方式。
對(duì)比完整圖片與缺失滑塊的圖片
| 僅介紹,本文不進(jìn)行實(shí)現(xiàn)。對(duì)于B站來(lái)說(shuō),是準(zhǔn)確率最高的方式(100%),但不能保證未來(lái)B站的滑塊驗(yàn)證升級(jí),導(dǎo)致不可用。
B站的滑塊驗(yàn)證模塊,一共有三張圖片:
完整圖、缺失滑塊圖、滑塊圖,都是由畫布繪制出的。類似于:
完整圖:
缺失滑塊圖:
滑塊圖:
HTML代碼類似于:
<div class="geetest_canvas_img geetest_absolute" style="display: block;"> <div class="geetest_slicebg geetest_absolute"> <canvas class="geetest_canvas_bg geetest_absolute" height="160" width="260"></canvas> <canvas class="geetest_canvas_slice geetest_absolute" width="260" height="160"></canvas> </div> <canvas class="geetest_canvas_fullbg geetest_fade geetest_absolute" height="160" width="260" style="display: none;"></canvas> </div>
只需要通過(guò)selenium獲取畫布元素,執(zhí)行js拿到畫布像素,遍歷完整圖和缺失滑塊圖的像素,一旦獲取到差異(需要允許少許像素誤差),像素矩陣x軸方向即是滑塊位置。
另外由于滑塊圖距離畫布坐標(biāo)原點(diǎn)有距離,還需要減去這部分距離。
最后使用 selenium 拖拽即可。
邊緣檢測(cè)算法,確定位置
| 滑塊基本上是個(gè)方形,通過(guò)算法確定方形起始位置即可。
介紹兩種方式
- 滑塊是方形的,存在垂直的邊,該邊在缺失滑塊圖中基本都是灰黑的。遍歷像素找到基本都是灰黑的邊即可。
- 缺失滑塊圖中滑塊位置是灰黑封閉的。通過(guò)算法可以找到封閉區(qū)域,大小與滑塊相近,即是滑塊需要拖拽到的位置。
第二種實(shí)現(xiàn)起來(lái)有些復(fù)雜,不進(jìn)行實(shí)現(xiàn)了。
下面是第一種實(shí)現(xiàn)方式,會(huì)存在檢測(cè)不出或錯(cuò)誤的情況,使用時(shí)需要換一張驗(yàn)證碼。也可能存在檢測(cè)出的邊是另一條(因?yàn)锽站的滑塊不是長(zhǎng)方形,存在弧形邊),那么需要減去滑塊寬度
class VeriImageUtil(): def __init__(self): self.defaultConfig = { "grayOffset": 20, "opaque": 1, "minVerticalLineCount": 30 } self.config = copy.deepcopy(self.defaultConfig) def updateConfig(self, config): # temp = copy.deepcopy(config) for k in self.config: if k in config.keys(): self.config[k] = config[k] def getMaxOffset(self, *args): # 計(jì)算偏移平均值最大的數(shù) av = sum(args) / len(args) maxOffset = 0 for a in args: offset = abs(av - a) if offset > maxOffset: maxOffset = offset return maxOffset def isGrayPx(self, r, g, b): # 是否是灰度像素點(diǎn),允許波動(dòng)offset return self.getMaxOffset(r, g, b) < self.config["grayOffset"] def isDarkStyle(self, r, g, b): # 灰暗風(fēng)格 return r < 128 and g < 128 and b < 128 def isOpaque(self, px): # 不透明 return px[3] >= 255 * self.config["opaque"] def getVerticalLineOffsetX(self, bgImage): # bgImage = Image.open("./image/bg.png") # bgImage.im.mode = 'RGBA' bgBytes = bgImage.load() x = 0 while x < bgImage.size[0]: y = 0 # 點(diǎn)》》線,灰度線條數(shù)量 verticalLineCount = 0 if x == 258: print(y) while y < bgImage.size[1]: px = bgBytes[x, y] r = px[0] g = px[1] b = px[2] # alph = px[3] # print(px) if self.isDarkStyle(r, g, b) and self.isGrayPx(r, g, b) and self.isOpaque(px): verticalLineCount += 1 else: verticalLineCount = 0 y += 1 continue if verticalLineCount >= self.config["minVerticalLineCount"]: # 連續(xù)多個(gè)像素都是灰度像素,直線 # print(x, y) return x y += 1 x += 1 pass if __name__ == '__main__': bgImage = Image.open("./image/bg.png") veriImageUtil = VeriImageUtil() # veriImageUtil.updateConfig({ # "grayOffset": 20, # "opaque": 0.6, # "minVerticalLineCount": 10 # }) bgOffsetX = veriImageUtil.getVerticalLineOffsetX(bgImage) print("bgOffsetX:{} ".format(bgOffsetX))
總結(jié)
以上所述是小編給大家介紹的Python破解BiliBili滑塊驗(yàn)證碼的思路詳解(完美避開人機(jī)識(shí)別),希望對(duì)大家有所幫助!
- 如何用python識(shí)別滑塊驗(yàn)證碼中的缺口
- python 模擬網(wǎng)站登錄——滑塊驗(yàn)證碼的識(shí)別
- Python Selenium破解滑塊驗(yàn)證碼最新版(GEETEST95%以上通過(guò)率)
- Python模擬登錄之滑塊驗(yàn)證碼的破解(實(shí)例代碼)
- python滑塊驗(yàn)證碼的破解實(shí)現(xiàn)
- python3 破解 geetest(極驗(yàn))的滑塊驗(yàn)證碼功能
- python繞過(guò)圖片滑動(dòng)驗(yàn)證碼實(shí)現(xiàn)爬取PTA所有題目功能 附源碼
- Python3爬蟲關(guān)于識(shí)別檢驗(yàn)滑動(dòng)驗(yàn)證碼的實(shí)例
- 基于python實(shí)現(xiàn)破解滑動(dòng)驗(yàn)證碼過(guò)程解析
- python破解bilibili滑動(dòng)驗(yàn)證碼登錄功能
- python實(shí)現(xiàn)騰訊滑塊驗(yàn)證碼識(shí)別
相關(guān)文章
windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法
這篇文章主要介紹了windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09如何利用Python獲取文本中的電話號(hào)碼實(shí)例代碼
Python的文本處理是經(jīng)常碰到的一個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于如何利用Python獲取文本中的電話號(hào)碼的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09對(duì)Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解
今天小編就為大家分享一篇對(duì)Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Tensorflow2.1實(shí)現(xiàn)Fashion圖像分類示例詳解
這篇文章主要為大家介紹了Tensorflow2.1實(shí)現(xiàn)Fashion圖像分類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Python字典取值全攻略之高效、簡(jiǎn)潔地獲取字典值的多種技巧
這篇文章主要給大家介紹了關(guān)于Python字典取值全攻略之高效、簡(jiǎn)潔地獲取字典值的多種技巧,dictionary(字典)是除列表以外Python之中最靈活的數(shù)據(jù)類型,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Python實(shí)現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法
下面小編就為大家?guī)?lái)一篇Python實(shí)現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解
這篇文章主要介紹了Python命令行參數(shù)解析工具 docopt 安裝和應(yīng)用過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09