我們可以借助插件來(lái)做
打開(kāi)插件,找到自己需要的驗(yàn)證碼
篩選有用的路徑
把對(duì)應(yīng)的視圖函數(shù)也拿過(guò)來(lái)煞烫,注意還需要一個(gè)geetest.py的文件
具體實(shí)
urls
#滑動(dòng)驗(yàn)證碼url(r'^pc-geetest/register', pcgetcaptcha, name='pcgetcaptcha'),? ? url(r'^pc-geetest/ajax_validate', pcajax_validate, name='pcajax_validate'),
views
fromapp01.geetestimportGeetestLibpc_geetest_id ="b46d1900d0a894591916ea94ea91bd2c"pc_geetest_key ="36fc3fe98530eea08dfc6ce76e3d24c4"mobile_geetest_id ="7c25da6fe21944cfe507d2f9876775a9"mobile_geetest_key ="f5883f4ee3bd4fa8caec67941de1b903"# 滑動(dòng)驗(yàn)證碼defpcgetcaptcha(request):user_id ='test'gt = GeetestLib(pc_geetest_id, pc_geetest_key)? ? status = gt.pre_process(user_id)? ? request.session[gt.GT_STATUS_SESSION_KEY] = status? ? request.session["user_id"] = user_id? ? response_str = gt.get_response_str()returnHttpResponse(response_str)# 滑動(dòng)驗(yàn)證碼defpcajax_validate(request):ifrequest.method =="POST":# 驗(yàn)證的驗(yàn)證碼ret = {"flag":False,"error_msg":None}? ? ? ? gt = GeetestLib(pc_geetest_id, pc_geetest_key)? ? ? ? challenge = request.POST.get(gt.FN_CHALLENGE,'')? ? ? ? validate = request.POST.get(gt.FN_VALIDATE,'')? ? ? ? seccode = request.POST.get(gt.FN_SECCODE,'')? ? ? ? status = request.session[gt.GT_STATUS_SESSION_KEY]? ? ? ? user_id = request.session["user_id"]? ? ? ? print("status",status)ifstatus:? ? ? ? ? ? result = gt.success_validate(challenge, validate, seccode, user_id)else:? ? ? ? ? ? result = gt.failback_validate(challenge, validate, seccode)ifresult:#如果驗(yàn)證驗(yàn)證碼正確啄骇,就驗(yàn)證用戶名是否正確username = request.POST.get("username")? ? ? ? ? ? password = request.POST.get("password")# 驗(yàn)證用戶名和密碼user = auth.authenticate(username=username, password=password)ifuser:# 如果驗(yàn)證成功就讓登錄ret["flag"] =Trueauth.login(request, user)else:? ? ? ? ? ? ? ? ret["error_msg"] ="用戶名和密碼錯(cuò)誤"else:? ? ? ? ? ? ret["error_msg"] ="驗(yàn)證碼錯(cuò)誤"returnHttpResponse(json.dumps(ret))else:returnrender(request,"login.html")views
login.html
Title滑動(dòng)驗(yàn)證碼的時(shí)候?qū)雥% csrf_token %}用戶名密碼{#? ? ? ? ? ? ? ? ? ? ? ? ? ? 文字部分#}驗(yàn)證碼{#? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖片部分#}{##}下次自動(dòng)登錄
登錄
注冊(cè)
{#滑動(dòng)驗(yàn)證碼#}? ? var handlerPopup = function (captchaObj) {? ? ? ? $("#submit").click(function () {
? ? ? ? ? ? captchaObj.show();
? ? ? ? });
? ? ? ? //定時(shí)函數(shù)
? ? ? ? $(".login").click(function () {
? ? ? ? ? ? function foo() {
? ? ? ? ? ? ? ? $(".error").html("")
? ? ? ? ? ? }
? ? ? ? ? ? // 成功的回調(diào)
? ? ? ? ? ? captchaObj.onSuccess(function () {
? ? ? ? ? ? ? ? var validate = captchaObj.getValidate();
? ? ? ? ? ? ? ? $.ajax({
? ? ? ? ? ? ? ? ? ? url: "/pc-geetest/ajax_validate", // 進(jìn)行二次驗(yàn)證
? ? ? ? ? ? ? ? ? ? type: "post",
? ? ? ? ? ? ? ? ? ? dataType: "json",
? ? ? ? ? ? ? ? ? ? headers: {"X-CSRFToken": $.cookie('csrftoken')},
? ? ? ? ? ? ? ? ? ? data: {
? ? ? ? ? ? ? ? ? ? ? ? username: $('#username').val(),
? ? ? ? ? ? ? ? ? ? ? ? password: $('#password').val(),
? ? ? ? ? ? ? ? ? ? ? ? geetest_challenge: validate.geetest_challenge,
? ? ? ? ? ? ? ? ? ? ? ? geetest_validate: validate.geetest_validate,
? ? ? ? ? ? ? ? ? ? ? ? geetest_seccode: validate.geetest_seccode
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? success: function (data) {
? ? ? ? ? ? ? ? ? ? ? ? console.log(data);
? ? ? ? ? ? ? ? ? ? ? ? if (data["flag"]) {
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? alert(location.search);#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? alert(location.search.slice(6));#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? 方式一#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? if (location.search.slice(6)) {#}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {#? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果用戶沒(méi)有登錄點(diǎn)贊的時(shí)候,當(dāng)用戶后來(lái)又登錄了,就直接讓跳轉(zhuǎn)到當(dāng)前點(diǎn)贊的那個(gè)路徑#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? location.href = location.search.slice(6)#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? }#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? else {#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? window.location.href = '/index/'#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? }#}
{#? ? ? ? ? ? ? ? ? ? ? ? ? ? 方式二:#}
? ? ? ? ? ? ? ? ? ? ? ? ? ? alert($.cookie("next_path"));
? ? ? ? ? ? ? ? ? ? ? ? ? ? if ($.cookie("next_path")){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? location.href = $.cookie("next_path")
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? location.href = "/index/"
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? $(".error").html(data["error_msg"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? setTimeout(foo, 3000)
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
? ? ? ? ? ? });
? ? ? ? });
? ? ? ? ? ? // 將驗(yàn)證碼加到id為captcha的元素里
? ? ? ? ? ? captchaObj.appendTo("#popup-captcha");
? ? ? ? ? ? // 更多接口參考:http://www.geetest.com/install/sections/idx-client-sdk.html
? ? ? ? };
? ? // 驗(yàn)證開(kāi)始需要向網(wǎng)站主后臺(tái)獲取id尺棋,challenge,success(是否啟用failback)
? ? $.ajax({
? ? ? ? url: "/pc-geetest/register?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存
? ? ? ? type: "get",
? ? ? ? dataType: "json",
? ? ? ? success: function (data) {
? ? ? ? ? ? // 使用initGeetest接口
? ? ? ? ? ? // 參數(shù)1:配置參數(shù)
? ? ? ? ? ? // 參數(shù)2:回調(diào)绵跷,回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象膘螟,之后可以使用它做appendTo之類的事件
? ? ? ? ? ? initGeetest({
? ? ? ? ? ? ? ? gt: data.gt,
? ? ? ? ? ? ? ? challenge: data.challenge,
? ? ? ? ? ? ? ? product: "popup", // 產(chǎn)品形式,包括:float碾局,embed荆残,popup。注意只對(duì)PC版驗(yàn)證碼有效
? ? ? ? ? ? ? ? offline: !data.success // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī)净当,一般不需要關(guān)注
? ? ? ? ? ? ? ? // 更多配置參數(shù)請(qǐng)參見(jiàn):http://www.geetest.com/install/sections/idx-client-sdk.html#config
? ? ? ? ? ? }, handlerPopup);
? ? ? ? }
? ? });login.html
爬蟲(chóng)
破解極驗(yàn)滑動(dòng)驗(yàn)證碼
一些網(wǎng)站會(huì)在正常運(yùn)行的正常的賬號(hào)密碼認(rèn)證之外加上一些驗(yàn)證
碼内斯,以此來(lái)明確地區(qū)分人行為,從一定程度上達(dá)到反爬的效果像啼,對(duì)于簡(jiǎn)單的驗(yàn)證碼tesserocr就可以搞定如下
圖片.png
但一些網(wǎng)站加入了滑動(dòng)驗(yàn)證碼俘闯,
圖片.png
對(duì)于這類驗(yàn)證,如果我們直接模擬表單請(qǐng)求,繁瑣的認(rèn)證參數(shù)與認(rèn)證流程會(huì)特別的麻煩我們可以用selenium驅(qū)動(dòng)瀏覽器來(lái)解決這個(gè)問(wèn)題忽冻,大致分為
#1真朗、輸入賬號(hào)、密碼僧诚,然后點(diǎn)擊登陸#2遮婶、點(diǎn)擊按鈕,彈出沒(méi)有缺口的圖#3湖笨、針對(duì)沒(méi)有缺口的圖片進(jìn)行截圖#4旗扑、點(diǎn)擊滑動(dòng)按鈕,彈出有缺口的圖#5赶么、針對(duì)有缺口的圖片進(jìn)行截圖#6肩豁、對(duì)比兩張圖片,找出缺口,即滑動(dòng)的位移#7清钥、按照人的行為行為習(xí)慣琼锋,把總位移切成一段段小的位移#8、按照位移移動(dòng)#9祟昭、完成登錄
實(shí)現(xiàn)
安裝:selenium+chrome/phantomjs#安裝:PillowPillow:基于PIL缕坎,處理python3.x的圖形圖像庫(kù).因?yàn)镻IL只能處理到python2.x,而這個(gè)模塊能處理Python3.x篡悟,目前用它做圖形的很多.http://www.cnblogs.com/apexchu/p/4231041.htmlC:\Users\Administrator>pip3 install pillowC:\Users\Administrator>python3Python3.6.1(v3.6.1:69c0db5, Mar212017,18:41:36) [MSC v.190064bit (AMD64)] on win32Type"help","copyright","credits"or"license"formore information.>>> from PIL import Image>>>
view.code
fromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWaitfromPILimportImageimporttimedefget_snap():'''
? ? 對(duì)整個(gè)網(wǎng)頁(yè)截圖谜叹,保存成圖片,然后用PIL.Image拿到圖片對(duì)象
? ? :return: 圖片對(duì)象
? ? '''driver.save_screenshot('snap.png')? ? page_snap_obj=Image.open('snap.png')returnpage_snap_objdefget_image():'''
? ? 從網(wǎng)頁(yè)的網(wǎng)站截圖中搬葬,截取驗(yàn)證碼圖片
? ? :return: 驗(yàn)證碼圖片
? ? '''img=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_canvas_img')))? ? time.sleep(2)#保證圖片刷新出來(lái)localtion=img.location? ? size=img.size? ? top=localtion['y']? ? bottom=localtion['y']+size['height']? ? left=localtion['x']? ? right=localtion['x']+size['width']? ? page_snap_obj=get_snap()? ? crop_imag_obj=page_snap_obj.crop((left,top,right,bottom))returncrop_imag_objdefget_distance(image1,image2):'''
? ? 拿到滑動(dòng)驗(yàn)證碼需要移動(dòng)的距離
? ? :param image1:沒(méi)有缺口的圖片對(duì)象
? ? :param image2:帶缺口的圖片對(duì)象
? ? :return:需要移動(dòng)的距離
? ? '''threshold=60left=57foriinrange(left,image1.size[0]):forjinrange(image1.size[1]):? ? ? ? ? ? rgb1=image1.load()[i,j]? ? ? ? ? ? rgb2=image2.load()[i,j]? ? ? ? ? ? res1=abs(rgb1[0]-rgb2[0])? ? ? ? ? ? res2=abs(rgb1[1]-rgb2[1])? ? ? ? ? ? res3=abs(rgb1[2]-rgb2[2])ifnot(res1 < thresholdandres2 < thresholdandres3 < threshold):returni-7#經(jīng)過(guò)測(cè)試荷腊,誤差為大概為7returni-7#經(jīng)過(guò)測(cè)試,誤差為大概為7defget_tracks(distance):'''
? ? 拿到移動(dòng)軌跡急凰,模仿人的滑動(dòng)行為女仰,先勻加速后勻減速
? ? 勻變速運(yùn)動(dòng)基本公式:
? ? ①v=v0+at
? ? ②s=v0t+?at2
? ? ③v2-v02=2as
? ? :param distance: 需要移動(dòng)的距離
? ? :return: 存放每0.3秒移動(dòng)的距離
? ? '''#初速度v=0#單位時(shí)間為0.2s來(lái)統(tǒng)計(jì)軌跡,軌跡即0.2內(nèi)的位移t=0.3#位移/軌跡列表抡锈,列表內(nèi)的一個(gè)元素代表0.2s的位移tracks=[]#當(dāng)前的位移current=0#到達(dá)mid值開(kāi)始減速mid=distance*4/5whilecurrent < distance:ifcurrent < mid:# 加速度越小疾忍,單位時(shí)間的位移越小,模擬的軌跡就越多越詳細(xì)a=2else:? ? ? ? ? ? a=-3#初速度v0=v#0.2秒時(shí)間內(nèi)的位移s=v0*t+0.5*a*(t**2)#當(dāng)前的位置current+=s#添加到軌跡列表tracks.append(round(s))#速度已經(jīng)達(dá)到v,該速度作為下次的初速度v=v0+a*treturntrackstry:? ? driver=webdriver.Chrome()? ? driver.get('https://account.geetest.com/login')? ? wait=WebDriverWait(driver,10)#步驟一:先點(diǎn)擊按鈕,彈出沒(méi)有缺口的圖片button=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_radar_tip')))? ? button.click()#步驟二:拿到?jīng)]有缺口的圖片image1=get_image()#步驟三:點(diǎn)擊拖動(dòng)按鈕床三,彈出有缺口的圖片button=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_slider_button')))? ? button.click()#步驟四:拿到有缺口的圖片image2=get_image()# print(image1,image1.size)# print(image2,image2.size)#步驟五:對(duì)比兩張圖片的所有RBG像素點(diǎn)一罩,得到不一樣像素點(diǎn)的x值,即要移動(dòng)的距離distance=get_distance(image1,image2)#步驟六:模擬人的行為習(xí)慣(先勻加速拖動(dòng)后勻減速拖動(dòng))撇簿,把需要拖動(dòng)的總距離分成一段一段小的軌跡tracks=get_tracks(distance)? ? print(tracks)? ? print(image1.size)? ? print(distance,sum(tracks))#步驟七:按照軌跡拖動(dòng)聂渊,完全驗(yàn)證button=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_slider_button')))? ? ActionChains(driver).click_and_hold(button).perform()fortrackintracks:? ? ? ? ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()else:? ? ? ? ActionChains(driver).move_by_offset(xoffset=3,yoffset=0).perform()#先移過(guò)一點(diǎn)ActionChains(driver).move_by_offset(xoffset=-3,yoffset=0).perform()#再退回來(lái),是不是更像人了time.sleep(0.5)#0.5秒后釋放鼠標(biāo)ActionChains(driver).release().perform()#步驟八:完成登錄input_email=driver.find_element_by_id('email')? ? input_password=driver.find_element_by_id('password')? ? button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'login-btn')))? ? input_email.send_keys('18611453110@163.com')? ? input_password.send_keys('linhaifeng123')# button.send_keys(Keys.ENTER)button.click()importtime? ? time.sleep(200)finally:? ? driver.close()
案列:
破解博客園后臺(tái)登錄
fromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWaitfromPILimportImageimporttimedefget_snap():driver.save_screenshot('full_snap.png')? ? page_snap_obj=Image.open('full_snap.png')returnpage_snap_objdefget_image():img=driver.find_element_by_class_name('geetest_canvas_img')? ? time.sleep(2)? ? location=img.location? ? size=img.size? ? left=location['x']? ? top=location['y']? ? right=left+size['width']? ? bottom=top+size['height']? ? page_snap_obj=get_snap()? ? image_obj=page_snap_obj.crop((left,top,right,bottom))# image_obj.show()returnimage_objdefget_distance(image1,image2):start=57threhold=60foriinrange(start,image1.size[0]):forjinrange(image1.size[1]):? ? ? ? ? ? rgb1=image1.load()[i,j]? ? ? ? ? ? rgb2=image2.load()[i,j]? ? ? ? ? ? res1=abs(rgb1[0]-rgb2[0])? ? ? ? ? ? res2=abs(rgb1[1]-rgb2[1])? ? ? ? ? ? res3=abs(rgb1[2]-rgb2[2])# print(res1,res2,res3)ifnot(res1 < threholdandres2 < threholdandres3 < threhold):returni-7returni-7defget_tracks(distance):distance+=20#先滑過(guò)一點(diǎn)补疑,最后再反著滑動(dòng)回來(lái)v=0t=0.2forward_tracks=[]? ? current=0mid=distance*3/5whilecurrent < distance:ifcurrent < mid:? ? ? ? ? ? a=2else:? ? ? ? ? ? a=-3s=v*t+0.5*a*(t**2)? ? ? ? v=v+a*t? ? ? ? current+=s? ? ? ? forward_tracks.append(round(s))#反著滑動(dòng)到準(zhǔn)確位置back_tracks=[-3,-3,-2,-2,-2,-2,-2,-1,-1,-1]#總共等于-20return{'forward_tracks':forward_tracks,'back_tracks':back_tracks}try:# 1歧沪、輸入賬號(hào)密碼回車driver = webdriver.Chrome()? ? driver.implicitly_wait(3)? ? driver.get('https://passport.cnblogs.com/user/signin')? ? username = driver.find_element_by_id('input1')? ? pwd = driver.find_element_by_id('input2')? ? signin = driver.find_element_by_id('signin')? ? username.send_keys('linhaifeng')? ? pwd.send_keys('xxxxx')? ? signin.click()# 2、點(diǎn)擊按鈕莲组,得到?jīng)]有缺口的圖片button = driver.find_element_by_class_name('geetest_radar_tip')? ? button.click()# 3、獲取沒(méi)有缺口的圖片image1 = get_image()# 4暖夭、點(diǎn)擊滑動(dòng)按鈕锹杈,得到有缺口的圖片button = driver.find_element_by_class_name('geetest_slider_button')? ? button.click()# 5、獲取有缺口的圖片image2 = get_image()# 6迈着、對(duì)比兩種圖片的像素點(diǎn)竭望,找出位移distance = get_distance(image1, image2)# 7、模擬人的行為習(xí)慣裕菠,根據(jù)總位移得到行為軌跡tracks = get_tracks(distance)? ? print(tracks)# 8咬清、按照行動(dòng)軌跡先正向滑動(dòng),后反滑動(dòng)button = driver.find_element_by_class_name('geetest_slider_button')? ? ActionChains(driver).click_and_hold(button).perform()# 正常人類總是自信滿滿地開(kāi)始正向滑動(dòng),自信地表現(xiàn)是瘋狂加速fortrackintracks['forward_tracks']:? ? ? ? ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()# 結(jié)果傻逼了旧烧,正常的人類停頓了一下影钉,回過(guò)神來(lái)發(fā)現(xiàn),臥槽掘剪,滑過(guò)了,然后開(kāi)始反向滑動(dòng)time.sleep(0.5)forback_trackintracks['back_tracks']:? ? ? ? ActionChains(driver).move_by_offset(xoffset=back_track, yoffset=0).perform()# 小范圍震蕩一下平委,進(jìn)一步迷惑極驗(yàn)后臺(tái),這一步可以極大地提高成功率ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()? ? ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()# 成功后夺谁,騷包人類總喜歡默默地欣賞一下自己拼圖的成果廉赔,然后戀戀不舍地松開(kāi)那只臟手time.sleep(0.5)? ? ActionChains(driver).release().perform()? ? time.sleep(10)# 睡時(shí)間長(zhǎng)一點(diǎn),確定登錄成功finally:? ? driver.close()
修訂版本
fromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWaitfromPILimportImageimporttimedefget_snap(driver):driver.save_screenshot('full_snap.png')? ? page_snap_obj=Image.open('full_snap.png')returnpage_snap_objdefget_image(driver):img=driver.find_element_by_class_name('geetest_canvas_img')? ? time.sleep(2)? ? location=img.location? ? size=img.size? ? left=location['x']? ? top=location['y']? ? right=left+size['width']? ? bottom=top+size['height']? ? page_snap_obj=get_snap(driver)? ? image_obj=page_snap_obj.crop((left,top,right,bottom))# image_obj.show()returnimage_objdefget_distance(image1,image2):start=57threhold=60foriinrange(start,image1.size[0]):forjinrange(image1.size[1]):? ? ? ? ? ? rgb1=image1.load()[i,j]? ? ? ? ? ? rgb2=image2.load()[i,j]? ? ? ? ? ? res1=abs(rgb1[0]-rgb2[0])? ? ? ? ? ? res2=abs(rgb1[1]-rgb2[1])? ? ? ? ? ? res3=abs(rgb1[2]-rgb2[2])# print(res1,res2,res3)ifnot(res1 < threholdandres2 < threholdandres3 < threhold):returni-7returni-7defget_tracks(distance):distance+=20#先滑過(guò)一點(diǎn)匾鸥,最后再反著滑動(dòng)回來(lái)v=0t=0.2forward_tracks=[]? ? current=0mid=distance*3/5whilecurrent < distance:ifcurrent < mid:? ? ? ? ? ? a=2else:? ? ? ? ? ? a=-3s=v*t+0.5*a*(t**2)? ? ? ? v=v+a*t? ? ? ? current+=s? ? ? ? forward_tracks.append(round(s))#反著滑動(dòng)到準(zhǔn)確位置back_tracks=[-3,-3,-2,-2,-2,-2,-2,-1,-1,-1]#總共等于-20return{'forward_tracks':forward_tracks,'back_tracks':back_tracks}defcrack(driver):#破解滑動(dòng)認(rèn)證# 1蜡塌、點(diǎn)擊按鈕,得到?jīng)]有缺口的圖片button = driver.find_element_by_class_name('geetest_radar_tip')? ? button.click()# 2勿负、獲取沒(méi)有缺口的圖片image1 = get_image(driver)# 3馏艾、點(diǎn)擊滑動(dòng)按鈕,得到有缺口的圖片button = driver.find_element_by_class_name('geetest_slider_button')? ? button.click()# 4笆环、獲取有缺口的圖片image2 = get_image(driver)# 5攒至、對(duì)比兩種圖片的像素點(diǎn),找出位移distance = get_distance(image1, image2)# 6躁劣、模擬人的行為習(xí)慣迫吐,根據(jù)總位移得到行為軌跡tracks = get_tracks(distance)? ? print(tracks)# 7、按照行動(dòng)軌跡先正向滑動(dòng)账忘,后反滑動(dòng)button = driver.find_element_by_class_name('geetest_slider_button')? ? ActionChains(driver).click_and_hold(button).perform()# 正常人類總是自信滿滿地開(kāi)始正向滑動(dòng)志膀,自信地表現(xiàn)是瘋狂加速fortrackintracks['forward_tracks']:? ? ? ? ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()# 結(jié)果傻逼了,正常的人類停頓了一下鳖擒,回過(guò)神來(lái)發(fā)現(xiàn)溉浙,臥槽,滑過(guò)了,然后開(kāi)始反向滑動(dòng)time.sleep(0.5)forback_trackintracks['back_tracks']:? ? ? ? ActionChains(driver).move_by_offset(xoffset=back_track, yoffset=0).perform()# 小范圍震蕩一下蒋荚,進(jìn)一步迷惑極驗(yàn)后臺(tái)戳稽,這一步可以極大地提高成功率ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()? ? ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()# 成功后,騷包人類總喜歡默默地欣賞一下自己拼圖的成果期升,然后戀戀不舍地松開(kāi)那只臟手time.sleep(0.5)? ? ActionChains(driver).release().perform()deflogin_cnblogs(username,password):driver = webdriver.Chrome()try:# 1惊奇、輸入賬號(hào)密碼回車driver.implicitly_wait(3)? ? ? ? driver.get('https://passport.cnblogs.com/user/signin')? ? ? ? input_username = driver.find_element_by_id('input1')? ? ? ? input_pwd = driver.find_element_by_id('input2')? ? ? ? signin = driver.find_element_by_id('signin')? ? ? ? input_username.send_keys(username)? ? ? ? input_pwd.send_keys(password)? ? ? ? signin.click()# 2、破解滑動(dòng)認(rèn)證crack(driver)? ? ? ? time.sleep(10)# 睡時(shí)間長(zhǎng)一點(diǎn)播赁,確定登錄成功finally:? ? ? ? driver.close()if__name__ =='__main__':? ? login_cnblogs(username='linhaifeng',password='xxxx')
作者:酷酷的小明
鏈接:http://www.reibang.com/p/2c726ff42029
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有颂郎。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處容为。