Cendertron, стратегия обхода скользящей капчи для динамических поисковых роботов

Node.js рептилия

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 в действии Перейти в действие Питон в действии Ржавчина в действии
Разработка программного обеспечения, Структуры данных и алгоритмы, Шаблоны проектирования, Архитектура программного обеспечения Современные основы веб-разработки и инженерные практики Гибридная разработка большого интерфейса и визуализация данных Практика разработки серверов и инженерная архитектура Распределенная инфраструктура Наука о данных, искусственный интеллект и глубокое обучение Проектирование продукта и пользовательский опыт