安居客滑動(dòng)驗(yàn)證碼破解(僅供學(xué)習(xí)交流參考)

# -*- coding: utf-8 -*-

import random,? time

from PIL import Image

from time import sleep

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

class DealVerifyCode(object):

? ? def __init__(self):

? ? ? ? """

? ? ? ? 初始化項(xiàng)

? ? ? ? """

? ? ? ? self.headers = {

? ? ? ? ? ? "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \

? ? ? ? ? ? ? ? ? ? ? ? ? AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"

? ? ? ? }

? ? ? ? self.driver = webdriver.Chrome()

? ? def slide_block(self, dis):

? ? ? ? """

? ? ? ? 滑動(dòng)滑塊操作

? ? ? ? :param dis: 滑動(dòng)的距離

? ? ? ? :return:

? ? ? ? """

? ? ? ? element = self.driver.find_element_by_xpath('//div[@class="dvc-slider__handler"]')

? ? ? ? if element:

? ? ? ? ? ? tracks = self.get_tracks(dis)

? ? ? ? ? ? ActionChains(self.driver).click_and_hold(on_element=element).perform()

? ? ? ? ? ? for track in tracks['forward_tracks']:

? ? ? ? ? ? ? ? ActionChains(self.driver).move_by_offset(xoffset=track, yoffset=0).perform()

? ? ? ? ? ? sleep(0.5)

? ? ? ? ? ? for track in tracks['back_tracks']:

? ? ? ? ? ? ? ? ActionChains(self.driver).move_by_offset(xoffset=track, yoffset=0).perform()

? ? ? ? ? ? # 小范圍震蕩一下独泞,進(jìn)一步迷惑極驗(yàn)后臺(tái)抗悍,這一步可以極大地提高成功率

? ? ? ? ? ? ActionChains(self.driver).move_by_offset(xoffset=-3, yoffset=0).perform()

? ? ? ? ? ? time.sleep(0.5)

? ? ? ? ? ? ActionChains(self.driver).move_by_offset(xoffset=3, yoffset=0).perform()

? ? ? ? ? ? time.sleep(0.5)

? ? ? ? ? ? ActionChains(self.driver).release(on_element=element).perform()

? ? def get_tracks(self, dis):

? ? ? ? """

? ? ? ? 模擬人為拖動(dòng)滑塊行為涂圆,快到缺口位置時(shí)秫舌,減緩?fù)蟿?dòng)的速度

? ? ? ? :param dis: 滑動(dòng)距離

? ? ? ? :return: 軌跡

? ? ? ? """

? ? ? ? dis += 20

? ? ? ? v = 0

? ? ? ? t = 0.3

? ? ? ? # 保存0.3內(nèi)的位移

? ? ? ? forward_tracks = []

? ? ? ? current = 0

? ? ? ? mid = dis * 4 / 5

? ? ? ? while current <= dis:

? ? ? ? ? ? if current < mid:

? ? ? ? ? ? ? ? a = random.uniform(2, 3)

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? a = -3

? ? ? ? ? ? v0 = v

? ? ? ? ? ? s = v0 * t + 0.5 * a * (t ** 2)

? ? ? ? ? ? current += s

? ? ? ? ? ? forward_tracks.append(round(s))

? ? ? ? ? ? m = random.uniform(1, 1.5)

? ? ? ? ? ? v = v0 + m * a * t

? ? ? ? # 反著滑動(dòng)到準(zhǔn)確位置

? ? ? ? back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1]? # 總共等于-20

? ? ? ? return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks}

? ? def get_image(self, url):

? ? ? ? """

? ? ? ? 獲取驗(yàn)證碼圖片

? ? ? ? :param url: 驗(yàn)證碼頁面地址

? ? ? ? :return: 驗(yàn)證碼圖片對(duì)象

? ? ? ? """

? ? ? ? self.driver.get(url)

? ? ? ? dis = 280

? ? ? ? self.slide_block(dis)

? ? ? ? self.driver.save_screenshot('./img.png')

? ? ? ? img_obj = Image.open('img.png')

? ? ? ? img = self.driver.find_element_by_xpath('//img[@class="dvc-captcha__bgImg"]')

? ? ? ? location = img.location

? ? ? ? size = img.size

? ? ? ? left = location['x']

? ? ? ? top = location['y']

? ? ? ? right = left + size['width']

? ? ? ? bottom = top + size['height']

? ? ? ? # print left, top, right, bottom

? ? ? ? # 將屏幕截圖裁剪

? ? ? ? verify_img = img_obj.crop((left, top, right, bottom))

? ? ? ? # verify_img.show()

? ? ? ? verify_img.save('./verify_img.jpg')

? ? ? ? return verify_img

? ? def get_position(self, image):

? ? ? ? """

? ? ? ? 對(duì)比像素確定缺口位置

? ? ? ? :param image: 驗(yàn)證碼圖片對(duì)象

? ? ? ? :return: 滑動(dòng)的距離

? ? ? ? """

? ? ? ? image = image.convert('L')

? ? ? ? # image.show()

? ? ? ? threshold = 150

? ? ? ? threshold2 = 50

? ? ? ? num = 10

? ? ? ? for i in range(55, image.size[0] - 20):

? ? ? ? ? ? for j in range(0, image.size[1] - 20):

? ? ? ? ? ? ? ? flag = True

? ? ? ? ? ? ? ? for l in range(0, num):

? ? ? ? ? ? ? ? ? ? pixel = image.getpixel((i, j)) - image.getpixel((i + 1, j + l))

? ? ? ? ? ? ? ? ? ? if pixel < threshold2: flag = False

? ? ? ? ? ? ? ? for l in range(0, num):

? ? ? ? ? ? ? ? ? ? pixel = image.getpixel((i, j + l))

? ? ? ? ? ? ? ? ? ? if pixel < threshold: flag = False

? ? ? ? ? ? ? ? if flag:

? ? ? ? ? ? ? ? ? ? return i

? ? def run(self, url):

? ? ? ? """

? ? ? ? 運(yùn)行調(diào)度

? ? ? ? :param url: 驗(yàn)證碼圖片地址

? ? ? ? :return:

? ? ? ? """

? ? ? ? verify_url = url

? ? ? ? img = self.get_image(verify_url)

? ? ? ? dis = self.get_position(img)

? ? ? ? if dis:

? ? ? ? ? ? real_dis = dis - 8? # 實(shí)際滑動(dòng)距離,增減數(shù)值具體情況具體分析

? ? ? ? else:

? ? ? ? ? ? real_dis = 200

? ? ? ? self.slide_block(real_dis)

? ? ? ? time.sleep(2)

? ? ? ? try:

? ? ? ? ? ? tips = self.driver.find_element_by_xpath('//div[@class="dvc-slider__tips"]')

? ? ? ? ? ? if tips:

? ? ? ? ? ? ? ? self.run(verify_url)

? ? ? ? except:

? ? ? ? ? ? pass

? ? ? ? ? ? # self.driver.quit()

if __name__ == '__main__':

? ? url = 'https://www.anjuke.com/captcha-verify/?callback=shield&from=antispam&serialID=f51e8ecae16400c96feb87fba1cddc37_2a8c6e02a1044e3bb0e223a55f029d42&history=aHR0cHM6Ly9jcy5hbmp1a2UuY29tLw%3D%3D'

? ? deal = DealVerifyCode()

? ? deal.run(url)

注意:

只是實(shí)現(xiàn)了滑動(dòng)驗(yàn)證碼,至于滑塊軌跡算法助琐,并未解決祭埂,如果有好的軌跡算法,歡迎溝通

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兵钮,一起剝皮案震驚了整個(gè)濱河市蛆橡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掘譬,老刑警劉巖泰演,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異葱轩,居然都是意外死亡睦焕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門靴拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垃喊,“玉大人,你說我怎么就攤上這事袜炕”久眨” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵偎窘,是天一觀的道長(zhǎng)乌助。 經(jīng)常有香客問我溜在,道長(zhǎng),這世上最難降的妖魔是什么他托? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任掖肋,我火速辦了婚禮,結(jié)果婚禮上赏参,老公的妹妹穿的比我還像新娘志笼。我一直安慰自己,他們只是感情好登刺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布籽腕。 她就那樣靜靜地躺著,像睡著了一般纸俭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上南窗,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天揍很,我揣著相機(jī)與錄音,去河邊找鬼万伤。 笑死窒悔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敌买。 我是一名探鬼主播简珠,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虹钮!你這毒婦竟也來了聋庵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤芙粱,失蹤者是張志新(化名)和其女友劉穎祭玉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春畔,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脱货,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了律姨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片振峻。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖择份,靈堂內(nèi)的尸體忽然破棺而出扣孟,到底是詐尸還是另有隱情,我是刑警寧澤缓淹,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布哈打,位于F島的核電站塔逃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏料仗。R本人自食惡果不足惜湾盗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望立轧。 院中可真熱鬧格粪,春花似錦、人聲如沸氛改。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胜卤。三九已至疆导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葛躏,已是汗流浹背澈段。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舰攒,地道東北人败富。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摩窃,于是被迫代替她去往敵國和親兽叮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容