Python+selenium破解拼圖驗(yàn)證碼的腳本
實(shí)現(xiàn)思路
很多網(wǎng)站都有拼圖驗(yàn)證碼
1.首先要了解拼圖驗(yàn)證碼的生成原理
2.制定破解計(jì)劃,考慮其可能性和成功率。
3.編寫腳本
很多網(wǎng)站的拼圖驗(yàn)證碼都是直接借助第三方插件,也就是一類一種解法。
筆者遇到的這種拼圖驗(yàn)證碼實(shí)際上是多個(gè)小碎片經(jīng)過重新組合成的一張整體,首先要在網(wǎng)站上抓取這種小碎片圖片并下載到本地
我們先捋一捋大體思路:
獲取所有碎片圖片----找出他們的排列順序邏輯-----找出他們中含有顏色深的真正位置的那個(gè)小碎塊的序號-----根據(jù)每塊碎片的寬度和上下和這個(gè)深色小塊的序號算出距離----用selenium向右移動(dòng)滑塊到這個(gè)距離
核心代碼
先導(dǎo)入必要的包:
# -*- coding:utf-8 -*- import colorsys import urllib,os,uuid,re,time from PIL import Image from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver
抓到并下載到本地
def create(locapath,fileName): filePath=locapath+'/'+fileName if not os.path.exists(filePath): file=open(filePath,'a+') file.close() return filePath def downloadImg(): list = openBrowser() for i in range(2): fileName = str(i) + '_test.jpg' urllib.urlretrieve(list[i], create('/Users/zijiawang/Downloads/', fileName)) #下載到本地 time.sleep(3) def openBrowser(): global wzj wzj = webdriver.Firefox() wzj.get('https://。。。。') image1_url = wzj.find_elements_by_class_name('gt_cut_bg_slice')[0].get_attribute('style') image1_url=image1_url[23:-38] image2_url = wzj.find_elements_by_class_name('gt_cut_fullbg_slice')[0].get_attribute('style') image2_url=image2_url[23:-38] return [image1_url,image2_url]
分割并獲取rgb顏色
ef getcolor(image): list = [[x,y] for x in range(26) for y in range(2)] listt = [] colors = [] for i in range(len(list)): l = list[i][0]*12+12 w = list[i][1]*58+58 listt.append([12*0.25+i/2*12, 58*0.25+((i+10)%2)*58]) listt.append([12*0.25+i/2*12, 58*0.75+((i+10)%2)*58]) listt.append([12*0.75+i/2*12, 58*0.25+((i+10)%2)*58]) listt.append([12*0.75+i/2*12, 58*0.75+((i+10)%2)*58]) for i in range(len(listt)): colors.append(image[listt[i][0],listt[i][1]]) return colors
找出不同的小碎片序號
def getDeferent(): deferent = [] for i in range(208): if abs(color1[i][2] - color2[i][2]) >20: print u'B差值: ',color1[i][2]-color2[i][2] deferent.append(i) # print ([i,abs(color1[i][0] - color2[i][0]),abs(color1[i][1] - color2[i][1]),abs(color1[i][2] - color2[i][2])]) return deferent def getUPDOWN(): deferent = getDeferent() xlist = [] ylist = [] for i in deferent: if (i / 4) % 2 == 0: xlist.append(i) else: ylist.append(i) uplist = [] downlist = [] for i in xlist: uplist.append(i / 4) for i in ylist: downlist.append(i / 4) for i in range(len(uplist)): uplist[i] /= 2 for i in range(len(downlist)): downlist[i] /= 2 func = lambda x, y: x if y in x else x + [y] up = reduce(func, [[], ] + uplist) func = lambda x, y: x if y in x else x + [y] down = reduce(func, [[], ] + downlist) return up,down
編寫好排列方法,會用的
def bubble(l): for index in range(len(l) - 1, 0 , -1): for two_index in range(index): if l[two_index] > l[two_index + 1]: l[two_index], l[two_index + 1] = l[two_index + 1], l[two_index] return l
最后的進(jìn)行解析,拼裝源碼
def end(): orders = getUPDOWN() orderx = orders[0] ordery = orders[1] print 'x:',orderx print 'y:',ordery orderX = [145, 157, 277, 265, 169, 181, 253, 241, 97, 109, 301, 289, 73, 85, 37, 25, 1, 13, 133, 121, 49, 61, 229, 217, 193, 205] orderY = [157, 145, 265, 277, 181, 169, 241, 253, 109, 97, 289, 301, 85, 73, 25, 37, 13, 1, 121, 133, 61, 49, 217, 229, 205, 193] print u'X:',orderX print u'Y:',orderY for x in range(26): orderX[x] -= 1 orderX[x] /= 12 for y in range(26): orderY[y] -= 1 orderY[y] /= 12 endX = [] endY = [] for i in range(len(orderX)): for j in range(len(orderx)): if orderx[j] == orderX[i]: endX.append(i) break for i in range(len(orderY)): for j in range(len(ordery)): if ordery[j] == orderY[i]: endY.append(i) break print 'endx:',endX print 'endy:',endY os.remove('/Users/zijiawang/Downloads/0_test.jpg') os.remove('/Users/zijiawang/Downloads/1_test.jpg') all = [] all = endX+endY # print 'all:',all #系統(tǒng)最多可實(shí)驗(yàn)5次 func = lambda x, y: x if y in x else x + [y] all_old = reduce(func, [[], ] + all) # print 'all_old:',all_old all_end =bubble(all_old) print 'all_end:',all_end duandata = 1000 for i in range(1,len(all_end)): if all_end[i]-1 in all_end: pass else: duandata = all_end[i] print u'斷點(diǎn)為:',duandata guess =[] if duandata != 1000: if endX != [] and endY!=[]: print u'斷點(diǎn)1' guess = [duandata,all_end[0]] elif endX ==[]: print u'斷點(diǎn)2' guess = [duandata, endY[0]] elif endY == []: print u'斷點(diǎn)3' guess = [duandata, endX[0]] else: print u'無斷點(diǎn)' guess = [ all_end[0]] end_guess =[] print u'猜測的點(diǎn):',guess for i in guess: end_guess.append(i * 12 - 38) end_guess.append(i * 12 - 28) end_guess.append(i * 12 - 20) end_guess.append(i * 12 - 17) end_guess.append(i * 12 - 15) print u'猜測的位移量: ',end_guess return end_guess
主函數(shù)
if __name__ == '__main__': downloadImg() color1 = getcolor(Image.open('/Users/zijiawang/Downloads/0_test.jpg').load()) color2 = getcolor(Image.open('/Users/zijiawang/Downloads/1_test.jpg').load()) guess = end() for i in guess: print i,wzj.title try: ele = wzj.find_element_by_xpath('//div[@class="gt_slider_knob gt_show"]') except: ele = wzj.find_element_by_xpath('//div[@class="gt_slider_knob gt_show moving"]') ActionChains(wzj).click_and_hold(ele).perform() ActionChains(wzj).move_to_element_with_offset(ele, 0,i).perform()
因每個(gè)網(wǎng)站的都大同小異,這里不寫具體測試的網(wǎng)站了,以免對其造成壓力。此算法屬于高度定制的,應(yīng)用其他網(wǎng)站需要改些參數(shù),但是代碼注釋較小。需要注釋,不明白的地方請留言哈。
以上就是Python+selenium破解拼圖驗(yàn)證碼的腳本的詳細(xì)內(nèi)容,更多關(guān)于Python selenium拼圖驗(yàn)證碼的資料請關(guān)注腳本之家其它相關(guān)文章!
- 利用Python生成隨機(jī)驗(yàn)證碼詳解
- Python實(shí)現(xiàn)隨機(jī)生成圖片驗(yàn)證碼詳解
- Python+Selenium+Pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識別
- Python實(shí)現(xiàn)新版正方系統(tǒng)滑動(dòng)驗(yàn)證碼識別
- python通過pillow識別動(dòng)態(tài)驗(yàn)證碼的示例代碼
- python調(diào)用文字識別OCR輕松搞定驗(yàn)證碼
- 基于Python實(shí)現(xiàn)原生的登錄驗(yàn)證碼詳情
- Python編程使用DRF實(shí)現(xiàn)一次性驗(yàn)證碼OTP
- 詳解Python結(jié)合Genetic?Algorithm算法破解網(wǎng)易易盾拼圖驗(yàn)證
相關(guān)文章
Python實(shí)現(xiàn)在一行中交換兩個(gè)變量
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)在一行中交換兩個(gè)變量功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08Flask框架重定向,錯(cuò)誤顯示,Responses響應(yīng)及Sessions會話操作示例
這篇文章主要介紹了Flask框架重定向,錯(cuò)誤顯示,Responses響應(yīng)及Sessions會話操作,結(jié)合實(shí)例形式分析了flask框架中重定向,錯(cuò)誤顯示,Responses響應(yīng)及Sessions會話操作相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-08-08Django實(shí)現(xiàn)快速分頁的方法實(shí)例
分頁是我們?nèi)粘i_發(fā)中必不可少的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Django如何實(shí)現(xiàn)快速分頁的方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10pd.drop_duplicates刪除重復(fù)行的方法實(shí)現(xiàn)
drop_duplicates 方法實(shí)現(xiàn)對數(shù)據(jù)框 DataFrame 去除特定列的重復(fù)行,本文主要介紹了pd.drop_duplicates刪除重復(fù)行的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06