Cendertron, стратегия обхода скользящей капчи для динамических поисковых роботов
существуетCendertronВ серии Besian Dynamic Reptile мы представили дизайн безопасных рептилий, а кластер рептилий, эта статья должна обсудить обходную стратегию для скользящего кода проверки.
Стратегия и код, используемые в этой статье, взяты изКак обойти «ползунок CAPTCHA» с помощью JS и Puppeteerодна статья.
Обход скользящей проверки в сканере
Верификация является одной из распространенных стратегий защиты от сканирования.Теперь на многих сайтах мы внедряем методы скользящей верификации для проверки подлинности посетителей. Например, следующий известный скользящий плагин jQuery:
При имитации входа в систему нам часто требуется обойти такую скользящую проверку, а динамический краулер на основе Puppeteer также обеспечивает удобство, часто нам нужно выполнить следующие шаги: переместиться в середину ползунка, нажать мышь, переместить мышь и отпустите мышь.
const puppeteer = require('puppeteer');
async function run() {
const browser = await puppeteer.launch({
headless: false,
defaultViewport: { width: 1366, height: 768 }
});
const page = await browser.newPage();
await page.goto('http://kthornbloom.com/slidetosubmit/');
await page.type('input[name="name"]', 'Puppeteer Bot');
await page.type('input[name="email"]', 'js@automation.com');
let sliderElement = await page.$('.slide-submit');
let slider = await sliderElement.boundingBox();
let sliderHandle = await page.$('.slide-submit-thumb');
let handle = await sliderHandle.boundingBox();
await page.mouse.move(
handle.x + handle.width / 2,
handle.y + handle.height / 2
);
await page.mouse.down();
await page.mouse.move(handle.x + slider.width, handle.y + handle.height / 2, {
steps: 10
});
await page.mouse.up();
await page.waitFor(3000);
// success!
await browser.close();
}
run();
В практическом случае мы можем взять в качестве примера интерфейс регистрации Taobao:
const puppeteer = require('puppeteer');
async function run() {
const browser = await puppeteer.launch({
headless: false,
defaultViewport: { width: 1366, height: 768 }
});
const page = await browser.newPage();
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => false
});
});
await page.goto('https://world.taobao.com/markets/all/sea/register');
let frame = page.frames()[1];
await frame.waitForSelector('.nc_iconfont.btn_slide');
const sliderElement = await frame.$('.slidetounlock');
const slider = await sliderElement.boundingBox();
const sliderHandle = await frame.$('.nc_iconfont.btn_slide');
const handle = await sliderHandle.boundingBox();
await page.mouse.move(
handle.x + handle.width / 2,
handle.y + handle.height / 2
);
await page.mouse.down();
await page.mouse.move(handle.x + slider.width, handle.y + handle.height / 2, {
steps: 50
});
await page.mouse.up();
await page.waitFor(3000);
// success!
await browser.close();
}
run();
Другой распространенный слайдер — это слайдер, похожий на головоломку:
const puppeteer = require('puppeteer');
const Rembrandt = require('rembrandt');
async function run() {
const browser = await puppeteer.launch({
headless: false,
defaultViewport: { width: 1366, height: 768 }
});
const page = await browser.newPage();
let originalImage = '';
await page.setRequestInterception(true);
page.on('request', request => request.continue());
page.on('response', async response => {
if (response.request().resourceType() === 'image')
originalImage = await response.buffer().catch(() => {});
});
await page.goto('https://monoplasty.github.io/vue-monoplasty-slide-verify/');
const sliderElement = await page.$('.slide-verify-slider');
const slider = await sliderElement.boundingBox();
const sliderHandle = await page.$('.slide-verify-slider-mask-item');
const handle = await sliderHandle.boundingBox();
let currentPosition = 0;
let bestSlider = {
position: 0,
difference: 100
};
await page.mouse.move(
handle.x + handle.width / 2,
handle.y + handle.height / 2
);
await page.mouse.down();
while (currentPosition < slider.width - handle.width / 2) {
await page.mouse.move(
handle.x + currentPosition,
handle.y + handle.height / 2 + Math.random() * 10 - 5
);
let sliderContainer = await page.$('.slide-verify');
let sliderImage = await sliderContainer.screenshot();
const rembrandt = new Rembrandt({
imageA: originalImage,
imageB: sliderImage,
thresholdType: Rembrandt.THRESHOLD_PERCENT
});
let result = await rembrandt.compare();
let difference = result.percentageDifference * 100;
if (difference < bestSlider.difference) {
bestSlider.difference = difference;
bestSlider.position = currentPosition;
}
currentPosition += 5;
}
await page.mouse.move(
handle.x + bestSlider.position,
handle.y + handle.height / 2,
{ steps: 10 }
);
await page.mouse.up();
await page.waitFor(3000);
// success!
await browser.close();
}
run();
Здесь мы используем простой метод сравнения изображений, то есть в процессе скольжения, если найдено различие, удовлетворяющее порогу, считается, что скольжение прошло успешно.
Конфигурация паука
существуетCendertron, предусмотрен специальный тип Slider Captcha Monkey, а во входящий SpiderOption можно добавить следующие параметры:
export interface SpiderOption {
allowRedirect: boolean;
depth: number;
// 页面插件
monkies?: {
sliderCaptcha: {
sliderElementSelector: string;
sliderHandleSelector: string;
};
};
}
дальнейшее чтение
Вы можете прочитать серию статей автора любым из следующих способов, охватывающих введение в технические данные, язык и теорию программирования, веб-интерфейс и большой интерфейс, разработку и инфраструктуру на стороне сервера, облачные вычисления и большие данные, науку о данных и искусственный интеллект. , дизайн продукта и многие другие области:
- Просматривайте онлайн в Gitbook, где каждая серия соответствует собственному репозиторию Gitbook.
Awesome Lists | Awesome CheatSheets | Awesome Interviews | Awesome RoadMaps | Awesome-CS-Books-Warehouse |
---|
теория языка программирования | Ява в действии | JavaScript в действии | Перейти в действие | Питон в действии | Ржавчина в действии |
---|