最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python破解BiliBili滑塊驗(yàn)證碼的思路詳解(完美避開(kāi)人機(jī)識(shí)別)

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

準(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)證碼

B站的滑塊驗(yàn)證碼如上。

這類驗(yàn)證碼可以使用 selenium 操作瀏覽器拖拽滑塊來(lái)進(jìn)行破解,難點(diǎn)兩個(gè),一個(gè)如何確定拖拽到的位置,另一個(gè)是避開(kāi)人機(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ò)算法確定方形起始位置即可。

計(jì)算位置

介紹兩種方式

  • 滑塊是方形的,存在垂直的邊,該邊在缺失滑塊圖中基本都是灰黑的。遍歷像素找到基本都是灰黑的邊即可。
  • 缺失滑塊圖中滑塊位置是灰黑封閉的。通過(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)證碼的思路詳解(完美避開(kāi)人機(jī)識(shí)別),希望對(duì)大家有所幫助!

相關(guān)文章

  • Django框架中序列化和反序列化的例子

    Django框架中序列化和反序列化的例子

    今天小編就為大家分享一篇Django框架中序列化和反序列化的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python正常時(shí)間和unix時(shí)間戳相互轉(zhuǎn)換的方法

    python正常時(shí)間和unix時(shí)間戳相互轉(zhuǎn)換的方法

    這篇文章主要介紹了python正常時(shí)間和unix時(shí)間戳相互轉(zhuǎn)換的方法,涉及時(shí)間字符串與Unix時(shí)間戳的實(shí)現(xiàn)與轉(zhuǎn)換技巧,需要的朋友可以參考下
    2015-04-04
  • Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解

    Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解

    在日常開(kāi)發(fā)中,對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化是常見(jiàn)的數(shù)據(jù)操作,Python提供了兩個(gè)模塊方便開(kāi)發(fā)者實(shí)現(xiàn)數(shù)據(jù)的序列化操作,即?json?模塊和?pickle?模塊。本文就為大家詳細(xì)講解這兩個(gè)模塊的使用,需要的可以參考一下
    2022-07-07
  • Python處理命令行參數(shù)模塊optpars用法實(shí)例分析

    Python處理命令行參數(shù)模塊optpars用法實(shí)例分析

    這篇文章主要介紹了Python處理命令行參數(shù)模塊optpars用法,結(jié)合實(shí)例形式分析了optpars模塊的功能,Python使用optpars模塊設(shè)置命令行參數(shù)相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Python-jenkins 獲取job構(gòu)建信息方式

    Python-jenkins 獲取job構(gòu)建信息方式

    這篇文章主要介紹了Python-jenkins 獲取job構(gòu)建信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • python求絕對(duì)值的三種方法小結(jié)

    python求絕對(duì)值的三種方法小結(jié)

    今天小編就為大家分享一篇python求絕對(duì)值的三種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python中優(yōu)雅使用assert斷言的方法實(shí)例

    Python中優(yōu)雅使用assert斷言的方法實(shí)例

    我們?cè)陂_(kāi)發(fā)一個(gè)程序時(shí)候,與其讓它運(yùn)行時(shí)崩潰,不如在它出現(xiàn)錯(cuò)誤條件時(shí)就崩潰(返回錯(cuò)誤),這時(shí)候斷言assert就顯得非常有用,這篇文章主要給大家介紹了關(guān)于Python中優(yōu)雅使用assert斷言的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • python數(shù)字圖像處理skimage讀取顯示與保存圖片

    python數(shù)字圖像處理skimage讀取顯示與保存圖片

    這篇文章主要為大家介紹了python數(shù)字圖像處理使用skimage讀取顯示與保存圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Django3.0 異步通信初體驗(yàn)(小結(jié))

    Django3.0 異步通信初體驗(yàn)(小結(jié))

    這篇文章主要介紹了Django3.0 異步通信初體驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • pandas 對(duì)日期類型數(shù)據(jù)的處理方法詳解

    pandas 對(duì)日期類型數(shù)據(jù)的處理方法詳解

    這篇文章主要介紹了pandas 對(duì)日期類型數(shù)據(jù)的處理方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論

北安市| 花垣县| 太和县| 沾益县| 乌兰察布市| 揭东县| 宜宾市| 鹿泉市| 荃湾区| 花莲市| 台江县| 勐海县| 海盐县| 唐海县| 保德县| 汶川县| 台中县| 皋兰县| 宁陕县| 垫江县| 嵊泗县| 禹城市| 桐乡市| 汉川市| 连江县| 安庆市| 临安市| 鹿邑县| 会昌县| 吐鲁番市| 五大连池市| 深泽县| 墨江| 抚州市| 海安县| 缙云县| 扬州市| 宁陕县| 河曲县| 东阳市| 略阳县|