欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動(dòng)登陸功能

 更新時(shí)間:2024年05月23日 10:47:17   作者:wenyuan519  
日常工作當(dāng)中,為了提高工作效率,我們可能會(huì)寫腳本來自動(dòng)執(zhí)行任務(wù),有些網(wǎng)站因?yàn)樾枰脩舻顷?所以腳本的自動(dòng)登陸功能必不可少,這篇文章主要介紹了Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動(dòng)登陸功能,需要的朋友可以參考下

Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動(dòng)登陸

需求

日常工作當(dāng)中,為了提高工作效率,我們可能會(huì)寫腳本來自動(dòng)執(zhí)行任務(wù)。有些網(wǎng)站因?yàn)樾枰脩舻顷?,所以腳本的自動(dòng)登陸功能必不可少。

不過我們在登陸網(wǎng)站的時(shí)候經(jīng)常會(huì)出現(xiàn)驗(yàn)證碼,驗(yàn)證碼的目的就是為了防止機(jī)器登陸、自動(dòng)化腳本操作,那么有沒有辦法讓腳本能自動(dòng)識別驗(yàn)證碼實(shí)現(xiàn)登陸呢?

接下來我以 B 站為例給大家講解下,如何解決自動(dòng)登陸腳本中最關(guān)鍵的驗(yàn)證碼問題。

探索

首先需要體驗(yàn)下這個(gè)網(wǎng)站的登陸方式,了解下它的驗(yàn)證碼類型。

打開 B 站 https://www.bilibili.com/ ,打開控制臺(tái),點(diǎn)擊登陸,這時(shí)候會(huì)彈出中間小的登陸框,通常輸入完賬號和密碼,就會(huì)彈出驗(yàn)證碼框了,我們猜測驗(yàn)證碼的接口此時(shí)已經(jīng)請求了。

由于驗(yàn)證碼的英文是 captcha ,我們在 network 面板里搜 captcha

發(fā)現(xiàn)了一個(gè)和驗(yàn)證碼相關(guān)的接口

https://passport.bilibili.com/x/passport-login/captcha

點(diǎn)開看接口返回結(jié)果,果然有一些有用的信息,我們發(fā)現(xiàn)驗(yàn)證碼類型是 geetest 。

{
  "code": 0,
  "message": "0",
  "ttl": 1,
  "data": {
    "type": "geetest",
    "token": "b416c387953540608bb5da384b4e372b",
    "geetest": {
      "challenge": "aeb4653fb336f5dcd63baecb0d51a1f3",
      "gt": "ac597a4506fee079629df5d8b66dd4fe"
    },
    "tencent": {
      "appid": ""
    }
  }
}

通過搜索發(fā)現(xiàn)了 B 站使用的驗(yàn)證碼服務(wù)是 geetest 提供的,國內(nèi)有很多網(wǎng)站都用的這個(gè)服務(wù), geetest 驗(yàn)證碼的特點(diǎn)是移動(dòng)拼圖、按順序選擇文字或者數(shù)字。

那么接下來,就來尋找可以識別 geetest 驗(yàn)證碼的辦法。

小編了解了市面上提供的驗(yàn)證碼解決方案,效果比較好的基本都是 OCR 服務(wù)商,對比之后發(fā)現(xiàn) 2Captcha 的服務(wù)非常好,解碼速度快、服務(wù)器連接穩(wěn)定、支持多種語言 API、價(jià)格公道,小編決定試用下 2Captcha

2Captcha 官網(wǎng)

接下來就展示使用 Nodejs + Playwright + 2Captcha 來解決 B 站的登陸驗(yàn)證碼問題。

如果想用其他語言和框架,比如 Python + Selenium ,也可以參照這個(gè)教程,解決問題的思路都是一樣的。

解決

1.如何識別驗(yàn)證碼

先仔細(xì)閱讀官方文檔 2Captcha API Geetest,解決方案寫的很詳細(xì),簡單來說

  • 通過攔截網(wǎng)站接口,獲取gt、challenge這兩個(gè)校驗(yàn)碼參數(shù),請求http://2captcha.com/in.php,得到驗(yàn)證碼 ID
  • 隔一段時(shí)間再請求http://2captcha.com/res.php,得到校驗(yàn)成功的標(biāo)識 challenge、validate、seccode

1.如何應(yīng)用驗(yàn)證結(jié)果

拿到最關(guān)鍵的 validate 之后,模擬用戶填寫賬號密碼登陸,攔截驗(yàn)證碼請求接口的返回參數(shù),替換為校驗(yàn)成功的參數(shù),隨即觸發(fā)登陸接口。

接下來,我們分析下詳細(xì)步驟

環(huán)境準(zhǔn)備

我們先搭建一下腳本執(zhí)行環(huán)境。

我們使用 Node.js + Playwright 來寫腳本。

  • 先確保你的電腦本地已經(jīng)安裝了 Nodejs
  • 再新建空項(xiàng)目,安裝 Playwright
mkdir bypass-captcha
cd bypass-captcha
npm init
npm i -D playwright

我們采用 Playwright 的庫模式,詳細(xì)文檔:Playwright

1.在項(xiàng)目根目錄新建一個(gè)腳本文件 captcha.js,填入以下內(nèi)容,命令行運(yùn)行node captcha.js來簡單測試下是否能正常啟動(dòng)項(xiàng)目

const {
    chromium
} = require("playwright");
(async () => {
    const browser = await chromium.launch({
        headless: false,
    });
    const page = await browser.newPage();
    await page.goto("https://www.bilibili.com/");
    await browser.close();
})();

正常情況下會(huì)彈出一個(gè)谷歌瀏覽器界面,顯示 B 站首頁,隨后瀏覽器自動(dòng)關(guān)閉。

請求 in.php 接口

首先整理下請求http://2captcha.com/in.php接口所需要的參數(shù)有哪些,可以看下參數(shù)列表,我們關(guān)注下必傳參數(shù)

參數(shù)類型必選描述
keyString您的 API key
methodStringgeetest - 定義您正在發(fā)送的是 Geetest 的驗(yàn)證碼
gtString在目標(biāo)網(wǎng)站上找到的 gt 參數(shù)
challengeString在目標(biāo)網(wǎng)站上找到的 challenge 參數(shù)
api_serverString在目標(biāo)網(wǎng)站上找到的 api_server 參數(shù)
pageurlString您看到 Geetest 驗(yàn)證碼時(shí)所在網(wǎng)頁的完整 URL
header_acaoInteger 默認(rèn): 00 - 禁用 1 - 啟用。 如果啟用 in.php 將在響應(yīng)中包含 Access-Control-Allow-Origin:* 標(biāo)頭。 用于 Web 應(yīng)用程序中的跨域 AJAX 請求。 res.php 也支持
pingbackString解決驗(yàn)證碼時(shí)將發(fā)送的 pingback(回調(diào))響應(yīng)的 URL。 URL 應(yīng)該在服務(wù)器上注冊。 更多信息在這里
jsonInteger 默認(rèn): 00 - 服務(wù)器將以純文本形式發(fā)送響應(yīng) 1 - 告訴服務(wù)器以 JSON 格式發(fā)送響應(yīng)
soft_idInteger軟件開發(fā)人員的 ID。 將他們的軟件與 2Captcha 集成的開發(fā)人員將獲得獎(jiǎng)勵(lì):軟件用戶支出的 10%。
proxyString格式: login:password@123.123.123.123:3128 您可以找到更多關(guān)于代理的信息這里。
proxytypeString代理類型: HTTP, HTTPS, SOCKS4, SOCKS5.
userAgentString您的 userAgent 將傳遞給我們的工作人員并用于解決驗(yàn)證碼。
  • key是需要在 2Captcha 官網(wǎng)注冊賬戶后,后臺(tái)面板的賬戶設(shè)置中就有一個(gè)API key,當(dāng)然要起讓 key 生效的話還需要充值一定金額
  • method 是一個(gè)固定值 geetest
  • gt 和 challenge 之前已經(jīng)在網(wǎng)站登錄頁面的接口中看到了。不過這里有個(gè)注意點(diǎn),gt是每個(gè)網(wǎng)站只有一個(gè)值,B 站這里是固定的ac597a4506fee079629df5d8b66dd4fe,但是 challenge 是一個(gè)動(dòng)態(tài)值,每次 API 請求都會(huì)獲得一個(gè)新的 challenge 值。在頁面上加載驗(yàn)證碼后,challenge 值就會(huì)失效。 所以要在網(wǎng)站登錄頁加載的時(shí)候監(jiān)聽https://passport.bilibili.com/x/passport-login/captcha這個(gè)請求,每次重新識別出新的 challenge 值。下面會(huì)講解如何監(jiān)聽到。
  • pageurl就是登錄頁的地址https://www.bilibili.com/

于是我們可以得到類似這樣一個(gè)請求接口

http://2captcha.com/in.php?key=1abc234de56fab7c89012d34e56fa7b8&method=geetest&gt=ac597a4506fee079629df5d8b66dd4fe&challenge=12345678abc90123d45678ef90123a456b&pageurl=https://www.bilibili.com/

1.接下來就解決每次進(jìn)首頁獲取新的 challenge

模擬用戶點(diǎn)擊登錄的流程

  • 先啟動(dòng)谷歌瀏覽器,打開 B 站首頁
  • 點(diǎn)擊頂部的登錄按鈕,會(huì)彈出登錄框
  • 這時(shí)候驗(yàn)證碼接口已經(jīng)發(fā)出,在這里監(jiān)聽驗(yàn)證碼接口返回的參數(shù),就能截獲到gtchallenge的值
const {
    chromium
} = require("playwright");
(async () => {
    // 選擇Chrome瀏覽器,設(shè)置headless: false 能看到瀏覽器界面
    const browser = await chromium.launch({
        headless: false,
    });
    const page = await browser.newPage();
    // 打開B站
    await page.goto("https://www.bilibili.com/");
    const [response] = await Promise.all([
        // 請求驗(yàn)證碼接口
        page.waitForResponse(
            (response) =>
            response.url().includes("/x/passport-login/captcha") &&
            response.status() === 200
        ),
        // 點(diǎn)擊頂部的登錄按鈕
        page.click(".header-login-entry"),
    ]);
    // 獲取到接口返回信息
    const responseJson = await response.body();
    // 解析出  gt 和 challenge
    const json = JSON.parse(responseJson);
    const gt = json.data.geetest.gt;
    const challenge = json.data.geetest.challenge;
    console.log("得到 gt", gt, "challenge", challenge);
    // 暫停5秒,防止瀏覽器關(guān)閉太快,來不及看到效果
    sleep(5000);
    // 關(guān)閉瀏覽器
    await browser.close();
})();
/**
 * 模擬sleep功能,延遲一定時(shí)間,單位毫秒
 * Delay for a number of milliseconds
 */
function sleep(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}

1.使用request庫來單獨(dú)請求in.php接口

先安裝 request

npm i request

現(xiàn)在可以開始正式的請求 http://2captcha.com/in.php 接口了

// 請求 in.php 接口
const inData = {
    key: API_KEY,
    method: METHOD,
    gt: gt,
    challenge: challenge,
    pageurl: PAGE_URL,
    json: 1,
};
request.post(
    "http://2captcha.com/in.php", {
        json: inData
    },
    function(error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log("response", body);
        }
    }
);

正常情況下,這時(shí)候會(huì)返回驗(yàn)證碼 ID ,比如 {"status":1,"request":"2122988149"} ,取 request 字段即可。

如果接口返回代碼 ERROR_ZERO_BALANCE ,表明您的賬戶余額不足,需要充值,我這里充值了最低額度用于演示,大家根據(jù)自己需要適當(dāng)體驗(yàn)下。

擴(kuò)展學(xué)習(xí)

1.為了提升安全性,我們將 API Key 寫在環(huán)境變量文件中來引用。

在根目錄新建一個(gè)環(huán)境變量文件.env,寫入API Key的值

# .env文件
API_KEY="d34y92u74en96yu6530t5p2i2oe3oqy9"

1.然后安裝dotenv庫,用來獲取到環(huán)境變量

npm i dotenv

1.在 js 腳本中使用

require("dotenv").config();

這樣通過 process.env.API_KEY 就能取到 .env 中的變量了,通常 .env 文件不上傳到代碼倉庫,保證個(gè)人信息的安全性。

如果不想把信息寫到文件中的同時(shí)確保安全性,也可以直接在控制臺(tái)輸入傳入 Node.js 環(huán)境變量,比如

API_KEY=d34y92u74en96yu6530t5p2i2oe3oqy9 node captcha.js

請求 res.php 接口請求接口之前,我們也整理下所需參數(shù)

GET 參數(shù)類型必選描述
keyString您的 API key
actionStringget - 得到您的驗(yàn)證碼的答案
idIntegerin.php 返回的驗(yàn)證碼 ID
jsonInteger 默認(rèn): 1服務(wù)器將始終以 JSON 格式返回 Geetest 驗(yàn)證碼的響應(yīng)。
  • key 就是 API_KEY,上一個(gè)接口也用到了
  • action 就是固定值 get
  • id 是剛剛 in.php 返回的驗(yàn)證碼 ID

???????上一個(gè)請求 20 秒之后,再請求 http://2captcha.com/res.php 接口獲取驗(yàn)證結(jié)果

request.get(
    `http://2captcha.com/res.php?key=${API_KEY}&action=get&id=${ID}&json=1`,
    function(error, response, body) {
        if (!error && response.statusCode == 200) {
            const data = JSON.parse(body);
            if (data.status == 1) {
                console.log(data.request);
            }
        }
    }
);

接口會(huì)返回三個(gè)值 challenge 、 validateseccode ,每一個(gè)參數(shù)都是一個(gè)字符串

{
  "geetest_challenge": "aeb4653fb336f5dcd63baecb0d51a1f3",
  "geetest_validate": "9f36e8f3a928a7d382dad8f6c1b10429",
  "geetest_seccode": "9f36e8f3a928a7d382dad8f6c1b10429|jordan"
}

其中 challenge 就是前面我們攔截到的參數(shù), validate 是校驗(yàn)結(jié)果標(biāo)識, seccode 內(nèi)容和 validate 基本一致,只多了一個(gè)單詞。我們需要將 validate 存儲(chǔ)下來備用。

這里有時(shí)候會(huì)碰到驗(yàn)證碼無法校驗(yàn)通過的情況,可以多嘗試幾次,或者聯(lián)系 2Captcha 官網(wǎng)排查問題

到這里,驗(yàn)證碼校驗(yàn)結(jié)果的信息已經(jīng)獲取完整,接下來就是拿校驗(yàn)結(jié)果去登陸了。

登陸

1.先來研究下正常用戶點(diǎn)擊驗(yàn)證碼校驗(yàn)成功后的登陸流程

我們發(fā)現(xiàn)了三個(gè)接口

https://api.geetest.com/ajax.php:驗(yàn)證碼接口,用于生成驗(yàn)證碼和校驗(yàn)驗(yàn)證碼是否通過。校驗(yàn)接口返回?cái)?shù)據(jù)中的 validate 字段就是 2Captcha 服務(wù)獲取到的 geetest_validate。

https://passport.bilibili.com/x/passport-login/web/key?_=1649087831803:密碼加密接口,用于獲取 hash 和公鑰

https://passport.bilibili.com/x/passport-login/web/login:登陸接口,入?yún)ㄙ~號、密碼、tokenchallenge、validateseccode

我們分析這幾個(gè)接口,可以得出兩個(gè)登陸方案。

  • 第一個(gè)方案,在Node.js 環(huán)境下請求加密接口和登陸接口,獲取用戶 Cookie 信息,后續(xù)用戶登陸直接攜帶 Cookie 信息即可。這個(gè)方案的難點(diǎn)是需要單獨(dú)處理密碼加密,對新手不太友好。
  • 第二個(gè)方案,用 Playwright 模擬用戶填寫賬號密碼登陸,隨機(jī)點(diǎn)擊驗(yàn)證碼觸發(fā)登陸,攔截驗(yàn)證碼接口的返回參數(shù),替換為校驗(yàn)成功的標(biāo)識,隨即觸發(fā)登陸接口。

我們采用第二種方案。

不過也遇到一個(gè)坑,就是 Node.js 環(huán)境下,驗(yàn)證碼圖片加載不出來,后面發(fā)現(xiàn)驗(yàn)證碼接口 https://api.geetest.com/ajax.php 同時(shí)負(fù)責(zé)拉取驗(yàn)證碼圖片和校驗(yàn)驗(yàn)證碼,我們直接攔截拉取驗(yàn)證碼圖片時(shí)的請求,替換校驗(yàn)結(jié)果就能觸發(fā)登陸了,不需要等圖片驗(yàn)證碼出來。這個(gè)細(xì)節(jié)很關(guān)鍵。

到此這篇關(guān)于Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動(dòng)登陸功能的文章就介紹到這了,更多相關(guān)Nodejs Playwright 2Captcha 驗(yàn)證碼識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用vs code開發(fā)Nodejs程序的使用方法

    使用vs code開發(fā)Nodejs程序的使用方法

    本篇文章主要介紹了使用vs code開發(fā)Nodejs程序的使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 一文詳解如何在IDEA中配置Node.js

    一文詳解如何在IDEA中配置Node.js

    idea中支持運(yùn)行很多種編程語言,只需要在電腦中安裝好對應(yīng)的語言環(huán)境,下面這篇文章主要給大家介紹了關(guān)于如何在IDEA中配置Node.js的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • node.js中stream流中可讀流和可寫流的實(shí)現(xiàn)與使用方法實(shí)例分析

    node.js中stream流中可讀流和可寫流的實(shí)現(xiàn)與使用方法實(shí)例分析

    這篇文章主要介紹了node.js中stream流中可讀流和可寫流的實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式分析了node.js stream流可讀流和可寫流基本分類、原理、定義、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • 修改NPM全局模式的默認(rèn)安裝路徑的方法

    修改NPM全局模式的默認(rèn)安裝路徑的方法

    這篇文章主要介紹了修改NPM全局模式的默認(rèn)安裝路徑的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 從零開始學(xué)習(xí)Node.js

    從零開始學(xué)習(xí)Node.js

    這篇文章主要介紹了從零開始學(xué)習(xí)Node.js結(jié)合具體實(shí)例形式分析了使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • Nodejs監(jiān)聽日志文件的變化的過程解析

    Nodejs監(jiān)聽日志文件的變化的過程解析

    最近有在做日志文件的分析,其中有一個(gè)需求:A服務(wù)器項(xiàng)目需要用Nodejs監(jiān)聽日志文件的變化,當(dāng)項(xiàng)目產(chǎn)生了新的日志信息,將新的部分通過socket傳輸?shù)紹服務(wù)器項(xiàng)目,本文重點(diǎn)給大家介紹Nodejs監(jiān)聽日志文件的變化的相關(guān)知識,一起看看吧
    2019-08-08
  • 詳解nodejs 文本操作模塊-fs模塊(三)

    詳解nodejs 文本操作模塊-fs模塊(三)

    本篇文章主要介紹了nodejs 文本操作模塊-fs模塊(三),詳細(xì)的講訴了readFile,和writeFile方法,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • nodejs進(jìn)階(6)—連接MySQL數(shù)據(jù)庫示例

    nodejs進(jìn)階(6)—連接MySQL數(shù)據(jù)庫示例

    本篇文章主要介紹了nodejs進(jìn)階(6)—連接MySQL數(shù)據(jù)庫示例,詳細(xì)的介紹了NodeJS操作MySQL數(shù)據(jù)庫,作為應(yīng)用最為廣泛的開源數(shù)據(jù)庫則成為我們的首選,有興趣的可以了解一下。
    2017-01-01
  • node.js中的事件處理機(jī)制詳解

    node.js中的事件處理機(jī)制詳解

    相信接觸過編程的同學(xué)應(yīng)該都了解,在訪問任何網(wǎng)頁的時(shí)候,會(huì)伴隨著許多的事件,例如點(diǎn)擊菜單,移動(dòng)鼠標(biāo)等等。那么node.js是如何處理的?下面通過這篇文章就來給大家詳細(xì)的介紹下node.js中的事件處理機(jī)制,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • node.js中的fs.readdirSync方法使用說明

    node.js中的fs.readdirSync方法使用說明

    這篇文章主要介紹了node.js中的fs.readdirSync方法使用說明,本文介紹了fs.readdirSync方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評論