Всички публикации

Вътре в Unblocker флага: Какво всъщност прави `unblocker: true`

Един флаг превключва три опции: реални хедъри на браузъра, съвпадаща сигнатура на връзката и автоматична декомпресия за gzip и brotli. Ето какво прави и защо.

Повечето скрейпъри се провалят преди прочитането дори на един хедър.

Сървърът проверява сигнатурата на ниво връзка, която вашият клиент изпраща, и решава дали сте браузър, или клиентска библиотека, която се представя за такъв. Python requests, net/http на Go, обикновен curl: всички те предават отличителен отпечатък в момента на установяване на връзката. Сайтовете със защити (Datadome, Akamai, Imperva, управляваната част на Cloudflare) прекъсват връзката или ви сервират challenge страница, преди вашият User-Agent изобщо да има значение.

Това е проблемът, който unblocker: true решава в FourA. През последния месец фиксирахме компонентите, които го карат да работи надеждно.

Какво ново

unblocker: true е единичен флаг при всяка /api/single заявка. Включете го и ние правим три неща: инжектираме набор от хедъри на браузъра, изпращаме заявката през транспорт, който съвпада с това, което реален браузър предава по мрежата, и декомпресираме всичко, което сървърът връща (gzip, brotli, deflate). Първите две са налични от бета версията. Третото (автоматична декомпресия на brotli) излезе на 25 март, а работата по фиксиране на версиите приключи на следващия ден, за да се поддържат хедърите и транспорта в пълен синхрон.

Как работи

Ето как изглежда една заявка:

curl -X POST "https://api.foura.ai/api/single" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "url": "https://example.com/products",
    "method": "GET",
    "unblocker": true
  }'

Отдолу работят три слоя.

Инжектиране на хедъри. Задаваме пълния пакет хедъри на браузъра: User-Agent, Sec-Ch-Ua, Sec-Ch-Ua-Platform, Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest, Accept, Accept-Language и Accept-Encoding. Редът има значение. Реалните браузъри ги изпращат в специфична последователност, а библиотеките за детекция проверяват за това.

Сигнатура на връзката. Нашият транспорт съответства на ниво байтове на актуална сесия на браузър: същата подредба на разширенията, същите предпочитания за шифри, същите особености на handshake. Стандартен curl, Python requests и net/http на Go произвеждат сигнатури, които се маркират автоматично за милисекунди в защитена инфраструктура.

Автоматична декомпресия. Когато unblocker е включен, задаваме Accept-Encoding на gzip, deflate, br и транспортът разопакова тялото. Получавате обратно декодиран низ (или Buffer, ако подадете returnBuffer: true). Без ръчна обработка на brotli, без несъответствия между хедъри и тяло, когато сайт избере deflate вместо gzip.

Защо фиксирането на версиите е важно

Сигнатурите на връзката са обвързани с версиите. Детайлите на мрежово ниво на браузъра този месец не са тези от миналия месец, а сайт, който снема отпечатъци внимателно, ще забележи отклонението. Ние фиксираме движещите се части заедно, така че хедърите, navigator обектите и сигнатурата на връзката да отчитат една и съща версия на браузъра.

Ако това звучи сложно, наистина е така. Имахме проблем с несъответствие по време на миграцията към monorepo през март, когато една част се обнови автоматично, а останалите излязоха от синхрон. Решението бяха два commit-а: фиксиране на движещата се част и недоверие към пакетния мениджър да поддържа нещата в синхрон вместо вас.

Въздействие

При вътрешни тестове срещу цели със сериозно снемане на отпечатъци (финанси, пътувания, защитена електронна търговия), разликата между unblocker: false и unblocker: true е разликата между challenge страница и 200. Обикновен curl, който достига до управляван Cloudflare, получава 403 от първия път. Същият URL с unblocker: true минава, защото връзката изглежда като сесия на браузър на мрежово ниво.

Но за сайтове, които не снемат отпечатъци (повечето публични API, по-стари CMS шаблони, всичко, което е ограничено само от IP rate limits), оставянето на unblocker изключен е напълно ок и спестява няколко милисекунди при договарянето на връзката. Използвайте го там, където ви е нужен.

За Power Users

Няколко модела, които си струва да знаете.

Комбинирайте unblocker с residential proxy, когато целта проверява и репутацията на IP адреса. Datacenter IP адресите заедно с перфектна сигнатура на връзката все още се маркират в ASN мрежи, които сайтът е добавил в черен списък. Нашият proxy endpoint (/api/proxy) се ротира според целевия домейн, така че добавянето на "proxy": "residential" към заявката обикновено е достатъчно.

Пропуснете unblocker, когато извиквате JSON API, които не се интересуват от браузъри. Допълнителните хедъри всъщност могат да изглеждат подозрително за API, което очаква програмен клиент, например бекенд, който извиква собствена микроуслуга.

Ако сайтът използва JavaScript anti-bot (интерактивни предизвикателства на Turnstile, PerimeterX в най-строгия му вид, Akamai Bot Manager с включени евристики), само unblocker няма да е достатъчен. Нуждаете се от browser endpoint, който изпълнява предизвикателството в пълен браузър. Това е различен продукт с различно ценообразуване в кредити и сме писали за него в Задачи в браузъра: Как да скрейпвате сайтове с много JavaScript.

Също така можете да комбинирате unblocker с блока validate, за да отхвърляте отговори, които технически връщат 200, но съдържат challenge страница:

{
  "url": "https://example.com/products",
  "method": "GET",
  "unblocker": true,
  "validate": {
    "data": { "fail": ["captcha", "Access Denied"] }
  }
}

Това превръща тихите провали в класифицирани провали, което е важно за проследяването на успеваемостта ви в таблото.

Какво предстои

Браузърите пускат нова стабилна версия на всеки четири седмици. Ние обновяваме нашия стак, за да съответства. Не е нужно да променяте нищо от ваша страна: unblocker: true продължава да сочи към версията на браузъра, която сме верифицирали от край до край.

По-трудната работа предстои. HTTP/3 fingerprinting вече се появява при управляваните anti-bot решения, QUIC транспортът е по-сложен за симулиране от по-стария транспорт и започва миграцията от статични пакети с хедъри към истинска динамична емулация. Защитените сайтове преминаха към проверка на подредбата на HTTP/2 рамките и разликата между "библиотека, която изглежда като браузър" и "браузър" ще се свива и от двете страни. Ще пишем за това, когато го пуснем.