欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python破解BiliBili滑塊驗證碼的思路詳解(完美避開人機識別)

 更新時間:2020年02月17日 09:41:56   作者:Mingyueyixi  
這篇文章主要介紹了Python破解BiliBili滑塊驗證碼的思路,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

準備工作

B站登錄頁 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站滑塊驗證碼

B站的滑塊驗證碼如上。

這類驗證碼可以使用 selenium 操作瀏覽器拖拽滑塊來進行破解,難點兩個,一個如何確定拖拽到的位置,另一個是避開人機識別(反爬蟲)。

確定滑塊驗證碼需要拖拽的位移距離

有三種方式

  • 人工智能機器學習,確定滑塊位置
  • 通過完整圖片與缺失滑塊的圖片進行像素對比,確定滑塊位置
  • 邊緣檢測算法,確定位置

各有優(yōu)缺點。人工智能機器學習,確定滑塊位置,需要進行訓練,比較麻煩,也可以看是否存在在線api可以調(diào)用。以下介紹其他兩種方式。

對比完整圖片與缺失滑塊的圖片

| 僅介紹,本文不進行實現(xiàn)。對于B站來說,是準確率最高的方式(100%),但不能保證未來B站的滑塊驗證升級,導致不可用。

B站的滑塊驗證模塊,一共有三張圖片:

完整圖、缺失滑塊圖、滑塊圖,都是由畫布繪制出的。類似于:

完整圖:


完整圖

缺失滑塊圖:


缺失滑塊圖

滑塊圖:


滑塊圖

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>

只需要通過selenium獲取畫布元素,執(zhí)行js拿到畫布像素,遍歷完整圖和缺失滑塊圖的像素,一旦獲取到差異(需要允許少許像素誤差),像素矩陣x軸方向即是滑塊位置。
另外由于滑塊圖距離畫布坐標原點有距離,還需要減去這部分距離。
最后使用 selenium 拖拽即可。

邊緣檢測算法,確定位置

| 滑塊基本上是個方形,通過算法確定方形起始位置即可。

計算位置

介紹兩種方式

  • 滑塊是方形的,存在垂直的邊,該邊在缺失滑塊圖中基本都是灰黑的。遍歷像素找到基本都是灰黑的邊即可。
  • 缺失滑塊圖中滑塊位置是灰黑封閉的。通過算法可以找到封閉區(qū)域,大小與滑塊相近,即是滑塊需要拖拽到的位置。

第二種實現(xiàn)起來有些復雜,不進行實現(xiàn)了。

下面是第一種實現(xiàn)方式,會存在檢測不出或錯誤的情況,使用時需要換一張驗證碼。也可能存在檢測出的邊是另一條(因為B站的滑塊不是長方形,存在弧形邊),那么需要減去滑塊寬度

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):
  # 計算偏移平均值最大的數(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):
  # 是否是灰度像素點,允許波動offset
  return self.getMaxOffset(r, g, b) < self.config["grayOffset"]

 def isDarkStyle(self, r, g, b):
  # 灰暗風格
  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
   # 點》》線,灰度線條數(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ù)多個像素都是灰度像素,直線
     # 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))

總結

以上所述是小編給大家介紹的Python破解BiliBili滑塊驗證碼的思路詳解(完美避開人機識別),希望對大家有所幫助!

相關文章

  • windows 10 設定計劃任務自動執(zhí)行 python 腳本的方法

    windows 10 設定計劃任務自動執(zhí)行 python 腳本的方法

    這篇文章主要介紹了windows 10 設定計劃任務自動執(zhí)行 python 腳本的方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 如何利用Python獲取文本中的電話號碼實例代碼

    如何利用Python獲取文本中的電話號碼實例代碼

    Python的文本處理是經(jīng)常碰到的一個問題,下面這篇文章主要給大家介紹了關于如何利用Python獲取文本中的電話號碼的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • python中yield函數(shù)的用法詳解

    python中yield函數(shù)的用法詳解

    這篇文章主要為大家詳細介紹了python中yield函數(shù)的用法,數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 對Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解

    對Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解

    今天小編就為大家分享一篇對Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Tensorflow2.1實現(xiàn)Fashion圖像分類示例詳解

    Tensorflow2.1實現(xiàn)Fashion圖像分類示例詳解

    這篇文章主要為大家介紹了Tensorflow2.1實現(xiàn)Fashion圖像分類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Python字典取值全攻略之高效、簡潔地獲取字典值的多種技巧

    Python字典取值全攻略之高效、簡潔地獲取字典值的多種技巧

    這篇文章主要給大家介紹了關于Python字典取值全攻略之高效、簡潔地獲取字典值的多種技巧,dictionary(字典)是除列表以外Python之中最靈活的數(shù)據(jù)類型,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Python實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法

    Python實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法

    下面小編就為大家?guī)硪黄狿ython實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • python實現(xiàn)多層感知器

    python實現(xiàn)多層感知器

    這篇文章主要為大家詳細介紹了python實現(xiàn)多層感知器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python命令行參數(shù)解析工具 docopt 安裝和應用過程詳解

    Python命令行參數(shù)解析工具 docopt 安裝和應用過程詳解

    這篇文章主要介紹了Python命令行參數(shù)解析工具 docopt 安裝和應用過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 利用Python爬蟲給孩子起個好名字

    利用Python爬蟲給孩子起個好名字

    每個人一生中都會遇到一件事情,在事情出現(xiàn)之前不會關心,但是事情一旦來臨就發(fā)現(xiàn)它極其重要,并且需要在很短的時間內(nèi)做出重大決定,那就是給自己的新生寶寶起個名字。下面這篇文章主要介紹了如何利用Python爬蟲給孩子起個好名字,需要的朋友可以參考下。
    2017-02-02

最新評論