Anti-CaptchaプラグインをPuppeteerまたはSeleniumに適用する方法
ブラウザ自動化の時、PuppeteerとSeleniumは2つの主要なエンジンであり、当社のプラグインはそれらにシームレスに統合できます。ここで、NodeJSとPythonプログラミング言語を使ってPuppeteerとSeleniumに適用する方法をそれぞれ説明します。この2つから選択する場合は、ネイティブ環境としてNodeJS + Puppeteerの組み合わせを強くお勧めします。
1.依存関係をインストールします。NodeJSの場合は、以下の所定のnpmパッケージをインストールするだけです。Pythonの場合は、パッケージをインストールして、このページから実行ファイル「chromedriver」 をダウンロードしてください。ドライバのバージョンは、システムにインストールされているChromeのバージョンと一致している必要があります。
npm install adm-zip puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
2.Chrome用のZIP版プラグインをダウンロードし、プロジェクトフォルダに解凍してください。実際のバージョンはここにあります。プログラムでも可能です。
//npm install adm-zip
const https = require('https')
const fs = require('fs');
const AdmZip = require("adm-zip");
const pluginURL = 'https://antcpt.com/anticaptcha-plugin.zip';
(async () => {
// プラグインをダウンロードします
await new Promise((resolve) => {
https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
})
// 解凍します
const zip = new AdmZip("./plugin.zip");
await zip.extractAllTo("./plugin/", true);
})();
3.次に、./plugin/js/config_ac_api_key.jsファイルにAPIキーを設定します。APIキーはカスタマーエリアにあります。動作させるためには、いくらかのプラス残高が必要です。
const apiKey = 'API_KEY_32_BYTES';
if (fs.existsSync('./plugin/js/config_ac_api_key.js')) {
let confData = fs.readFileSync('./plugin/js/config_ac_api_key.js', 'utf8');
confData = confData.replace(/antiCapthaPredefinedApiKey = ''/g, `antiCapthaPredefinedApiKey = '${apiKey}'`);
fs.writeFileSync('./plugin/js/config_ac_api_key.js', confData, 'utf8');
} else {
console.error('plugin configuration not found!')
}
4.プラグインでブラウザの設定を初期化します。Puppeteerの場合、「puppeteer-extra」パッケージ用のプラグイン「puppeteer-extra-plugin-stealth」をお勧めします。これにより、ウェブ自動化Chromiumブラウザのすべての形跡が隠されます。
//npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({
headless: false,
ignoreDefaultArgs: [
"--disable-extensions",
"--enable-automation"
],
args: [
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process',
'--allow-running-insecure-content',
'--disable-blink-features=AutomationControlled',
'--no-sandbox',
'--mute-audio',
'--no-zygote',
'--no-xshm',
'--window-size=1920,1080',
'--no-first-run',
'--no-default-browser-check',
'--disable-dev-shm-usage',
'--disable-gpu',
'--enable-webgl',
'--ignore-certificate-errors',
'--lang=en-US,en;q=0.9',
'--password-store=basic',
'--disable-gpu-sandbox',
'--disable-software-rasterizer',
'--disable-background-timer-throttling',
'--disable-backgrounding-occluded-windows',
'--disable-renderer-backgrounding',
'--disable-infobars',
'--disable-breakpad',
'--disable-canvas-aa',
'--disable-2d-canvas-clip-aa',
'--disable-gl-drawing-for-tests',
'--enable-low-end-device-mode',
'--disable-extensions-except=./plugin',
'--load-extension=./plugin'
]
});
const page = await browser.newPage();
})();
5.ターゲットページに移動し、必要に応じてフォームに記入します。プラグインが自動的にRecaptchaをピックアップして解決を開始します。
(async () => {
const url = 'https://anti-captcha.com/demo/?page=recaptcha_v2_textarea';
const login = 'Test login';
const password = 'Test password';
try {
await page.goto(url, {
waitUntil: "networkidle0"
});
} catch (e) {
console.error('err while loading the page: '+e);
}
// ナビゲーションタイムアウトエラーを無効にします
await page.setDefaultNavigationTimeout(0);
await page.$eval('#login', (element, login) => {
element.value = login;
}, login);
await page.$eval('#password', (element, password) => {
element.value = password;
}, password);
})();
6. 次は少しトリッキーな部分です。一部ののウェブフォームでは、Recaptchaを解いた後に送信ボタンを押す必要がありますが、他ではコールバックを利用して自動的に送信します。最初のケースでは、Recaptcha を解いた直後に送信ボタンを押したいです。これを適切なタイミングで行うには、単にセレクタ .antigate_solver.solved が表示されるのを待ち、送信ボタンを押せばよいです。
// 「solved」セレクターが表示されるのを待ちます
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('{{ $t('articles.how-to-integrate.code-comments.recaptcha-solved') }}');
// 送信ボタンを押します
await Promise.all([
page.click('#submitButton'),
page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('タスクが完了し、recaptchaがバイパスされました');
これで、フォーム記入が完成し、Recaptchaが解決されバイパスされました。完全なコード例は以下です:
// first run the following to install required npm packages:
//
// npm install adm-zip follow-redirects puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
//
//
const https = require('follow-redirects').https;
const fs = require('fs');
const AdmZip = require("adm-zip");
const apiKey = 'YOUR_API_KEY_HERE!';
const pluginURL = 'https://antcpt.com/anticaptcha-plugin.zip';
const url = 'https://anti-captcha.com/demo/?page=recaptcha_v2_textarea';
const login = 'Test login';
const password = 'Test password';
let page = null;
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
// プラグインをダウンロードします
await new Promise((resolve) => {
https.get(pluginURL, resp => resp.pipe(fs.createWriteStream('./plugin.zip').on('close', resolve)));
})
// 解凍します
const zip = new AdmZip("./plugin.zip");
await zip.extractAllTo("./plugin/", true);
// 設定ファイルでAPIキーを設定します
await new Promise((resolve, reject) => {
if (fs.existsSync('./plugin/js/config_ac_api_key.js')) {
let confData = fs.readFileSync('./plugin/js/config_ac_api_key.js', 'utf8');
confData = confData.replace(/antiCapthaPredefinedApiKey = ''/g, `antiCapthaPredefinedApiKey = '${apiKey}'`);
fs.writeFileSync('./plugin/js/config_ac_api_key.js', confData, 'utf8');
resolve();
} else {
console.error('plugin configuration not found!')
reject();
}
});
// ブラウザの起動オプションを設定します
const options = {
headless: false,
ignoreDefaultArgs: [
"--disable-extensions",
"--enable-automation"
],
args: [
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process',
'--allow-running-insecure-content',
'--disable-blink-features=AutomationControlled',
'--no-sandbox',
'--mute-audio',
'--no-zygote',
'--no-xshm',
'--window-size=1920,1080',
'--no-first-run',
'--no-default-browser-check',
'--disable-dev-shm-usage',
'--disable-gpu',
'--enable-webgl',
'--ignore-certificate-errors',
'--lang=en-US,en;q=0.9',
'--password-store=basic',
'--disable-gpu-sandbox',
'--disable-software-rasterizer',
'--disable-background-timer-throttling',
'--disable-backgrounding-occluded-windows',
'--disable-renderer-backgrounding',
'--disable-infobars',
'--disable-breakpad',
'--disable-canvas-aa',
'--disable-2d-canvas-clip-aa',
'--disable-gl-drawing-for-tests',
'--enable-low-end-device-mode',
'--disable-extensions-except=./plugin',
'--load-extension=./plugin'
]
}
try {
// プラグインでブラウザを起動します
const browser = await puppeteer.launch();
page = await browser.newPage();
} catch (e) {
console.log('could not launch browser: '+e.toString())
return;
}
// ターゲットページに移動します
try {
await page.goto(url, {
waitUntil: "networkidle0"
});
} catch (e) {
console.error('err while loading the page: '+e);
}
// ナビゲーションタイムアウトエラーを無効にします
await page.setDefaultNavigationTimeout(0);
// フォームに記入します
await page.$eval('#login', (element, login) => {
element.value = login;
}, login);
await page.$eval('#password', (element, password) => {
element.value = password;
}, password);
// 「solved」セレクターが表示されるのを待ちます
await page.waitForSelector('.antigate_solver.solved').catch(error => console.log('failed to wait for the selector'));
console.log('{{ $t('articles.how-to-integrate.code-comments.recaptcha-solved') }}');
// 送信ボタンを押します
await Promise.all([
page.click('#submitButton'),
page.waitForNavigation({ waitUntil: "networkidle0" })
]);
console.log('recaptcha解決');
})();
おまけ:Chromeはプラグインによるブラウザの自動化をサポートしていないので、ヘッドレスモードでプラグインを実行するトリックがあります。アプリケーションに仮想デスクトップを提供するXvfbというユーティリティを使ってください。
# パッケージをインストールします
apt-get install -y xvfb
# 表示変数を設定します
export DISPLAY=:0
# Xvfbをデーモンとしてバックグラウンドで起動します(1回のみ)
/usr/bin/Xvfb :0 -screen 0 1024x768x24 &
# 表示するまでしばらく待ちます(1回のみ)
sleep 5
# プレフィックス「xvfb-run」を「node」または「python」スクリプトに追加します
xvfb-run node myscript.js
# または
xvfb-run python myscript.py