記錄一次谷歌人機驗證碼破解過程


前言

  哈嘍,各位小伙伴,你們好呀,今天呢,咱們來說一下google,我們都知道,google是目前地表最強的搜索引擎了,我們可以借助google龐大的搜索資源找到一些自己想要的資源,可能是一些收費電影,可能是一些奇門小說,可能是某個角落的種子,不管怎么說,google搜索還是挺給力的,但是呢,有梯子的我們可能都遇到過,我們搜索的多了,會有這種情況

 

  這種驗證碼呢,叫做ReCaptcha驗證碼,相對來說,是比較繁瑣的驗證碼之一

  當然了,ReCaptcha不止谷歌一家再用,國外的網站很多都是使用這種驗證碼,但是在國內不多,因為在國內比較容易被牆,所以用的少,但是我們是高端玩家,在自由的internet,我們怎么可能只局限於國內,下面,我們就針對ReCaptcha驗證碼破解

  

  測試網站:https://www.google.com/recaptcha/api2/demo

  谷歌提供的范例,實際網站驗證碼和這個一模一樣

 

  ReCaptcha驗證碼樣式

 

 

 

為什么使用第三方平台

 

  嗯,看到這可能有人會對我不屑一顧,說辣雞才會用第三方平台,要是按照技術來划分的話,我真的辣雞,哈哈

  但是這里要抬杠一下,並不是說用第三方平台就是辣雞,我們可以想象一下,如果是滑動驗證碼,我們當然有一試的能力,python可以調用OpenCV,看看文檔,當然是可以實現了,但是有個問題是,你可能針對的一個網站的滑動驗證識別好了,但是可能每個網站的滑動驗證碼都不太一樣,在用OpenCV識別的時候,可能就會識別率低的情況,要是在公司,一直完不成任務,嗯,,,等着被炒魷魚吧,再說,像谷歌人機個人也解決不了,沒有NB的機器學習是不可能的,所以只能用第三方平台,畢竟,完成任務才是首要任務

  這里選用的第三方平台:https://2captcha.com/

為什么推薦2captcha平台

  我們先說一下現在打碼平台機制都有哪些

  第一種呢,就是打碼平台訓練好各種各樣的數據,比如,哪些是花,哪些是車,然后我們把圖片發送給打碼平台,他給我們結果,但是這樣會有個問題,如果訓練的不好,我們這邊的結果也是很不好的,各種不准確,影響效果

  第二種呢,就是平台雇人,我們把整個驗證碼都給打碼平台,平台找人幫助我們點擊,然后把結果給我們,我們在登錄了或者做其他

  我們可以看出來,肯定是第二種更加靈活地,現在階段,機器再NB,至少 在驗證碼上准確率還是不如人的

  2captcha平台目前采用的就是第二種方式,賺取的是中間差價,但是識別率是我用過最高的,曾經因為選錯了平台,一直不成功,加班加點,鼠標都被我砸壞了,,所以,選擇一個合適的平台還是很重要的

所需工具

 

  Chromedriver:瀏覽器驅動,可以理解為一個沒有界面的chrome瀏覽器

 

  Selenium:用於模擬人對瀏覽器進行點擊、輸出、拖拽等操作,就相當於是個人在使用瀏覽器,也常常用來應付反爬蟲措

 

開始行動

  既來之則安之,選擇了2captcha,就要看看人家的官網啦

  打開官網

  嗯...純英文,我也看不懂..怎么辦呢,別着急,我帶你們一步一步分析主要功能

  

  登錄賬號

 

  登錄完成后,會自動跳到主頁

  第一個紅色圈起來的地方表示剩余多少錢,沒有錢的話記得要氪金,否則是不能用滴,氪金過程這里就不多做解釋了哈,問題不大

  第二個紅色圈起來的地方表示這是你的唯一key,每次請求要帶上這個key的,所以要保管好

 

  進入主題,研究文檔

  點擊紅色圈的地方,API,一般API都是文檔,let's go

 

 

 

  En....什么玩意..完全看不懂,別慌,往下滑

  滑到rates,我們知道,谷歌人機是ReCaptcha,但是三個呢,到底是哪個呢,我就來帶大家看看

  首先點擊ReCaptcha(oldmethod),這個是老的方法,咱也不知道唉,所以就先看看這個吧,從淺到深嘛,這里呢,我都直接翻譯了一下,方便我們觀看

  Look,人家也說了,舊方法解決ReCaptcha准確率比較低,建議使用新方法,那我們就點擊新方法去看看

 

  我們找到了,這種屬於ReCaptcha v2驗證碼,確實和谷歌人機挺一樣的,我們來看一下文檔是怎么寫的

 

 

 

 

 

  人家說,我們先找到data-sitekey參數,然后將data-sitekey參數提交到https://2captcha.com/in.php

等個15-20s再向https://2captcha.com/res.php獲取結果

  然后找到id=g-recaptcha-responsetextarea標簽,將display:none 這個css刪除

  將給我們字符串添加到textarea輸入框點擊提交,就完成了

  是不是很簡單,我們也來試一下

 

  打開谷歌的示例樣式

 

 

  我們打開開發者工具,搜索data-sitekey,可以看到,真的有一個

 

  我們賦值一下這個data-sitekey,並且用代碼獲取到最后的結果

  然后我們找到 id=g-recaptcha-response textarea標簽,將他的display屬性刪除

 

 

  但是有點不太對

 

  我們的

 

 

 

  2captcha的示例的

 

 

 

  我們可以看到,2captcha是個刪除display之后,textarea框是直接展示出來的,但是我們刪除display之后,基本沒用絲毫動靜,這...

  別着急,人家都想到了,我們往下滑滑

 

  既然我們不能直接顯示出來textarea,那就說明我們是隱式的ReCaptcha驗證碼,其實他的原理呀,也挺簡單

  如果你學過一些前端,會些js,你可能就會想到,雖然我看不到這個textarea,但是通過js我們仍然能更改textarea的數據,只是說,我們鼠標點擊不了而已,人家也說了,看第一個紅圈的位置,通過此js,我們我們就可以把向2captcha獲取的值賦值上,第二個圈js是提交表單,其實就是我們人點擊提交而已,只不過是js代碼幫我們完成了,這樣,我們也完成了一個偷天換日

小試牛刀

  好嘞,我們就先來手動搞一下,在上述中,我們已經根據data-sietkey拿到了最后的結果,顯然,我們只能通過js完成,那么,我們就試一下

  通過上述gif看到,我們通過js,確實繞過了點擊車輛識別了,其他識別,確實方便,

  但是我們不可能通過人每次這樣搞呀,但是因為牽扯到了執行js,所以只能使用selenium,所以,我們來看一下selenium上的效果吧

  Look,這樣,我們就針對谷歌人機(ReCaptcha)驗證碼,完成了自動登錄,如果爬取國外的某某網站時,如果遇到了ReCaptcha,我相信一定會對你有幫助

 

  完整代碼

 

import time

from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
import requests

# 常量
driver: WebDriver
USER = {}
API_KEY = "xxxxxxxxxxxxxxx"


# 初始化
def init():
    global driver
    driver = webdriver.Chrome("chromedriver.exe", desired_capabilities=None)


def open_google():
    driver.get("https://www.google.com/recaptcha/api2/demo")
    data_sitekey = driver.find_element_by_xpath('//*[@id="recaptcha-demo"]').get_attribute("data-sitekey")
    # iframe_src = driver.find_element_by_xpath('//*[@id="recaptcha-demo"]/div/div/iframe').get_attribute("src")
    # iframe_k = url_params_format(iframe_src).get("k")
    print(data_sitekey)
    page_url = "https://www.google.com/recaptcha/api2/demo"
    # print(iframe_k)
    u1 = f"https://2captcha.com/in.php?key={API_KEY}&method=userrecaptcha&googlekey={data_sitekey}&pageurl={page_url}&json=1&invisible=1"
    r1 = requests.get(u1)
    print(r1.json())
    rid = r1.json().get("request")
    u2 = f"https://2captcha.com/res.php?key={API_KEY}&action=get&id={int(rid)}&json=1"
    time.sleep(25)
    while True:
        print(u2)
        r2 = requests.get(u2)
        print(r2.json())
        if r2.json().get("status") == 1:
            form_tokon = r2.json().get("request")
            break
        time.sleep(5)
    wirte_tokon_js = f'document.getElementById("g-recaptcha-response").innerHTML="{form_tokon}";'
    submit_js = 'document.getElementById("recaptcha-demo-form").submit();'
    driver.execute_script(wirte_tokon_js)
    time.sleep(1)
    driver.execute_script(submit_js)


if __name__ == '__main__':
    init()
    open_google()
Code

 

 

 

 

  謝謝觀看,謝謝支持

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM