Як я писав бота для аукціону AliExpress

imageЗнаєте, на aliexpress є такі аукціони — Gaga Deals, зараз там смітник, але колись були дуже цікаві пропозиції. Їхня ідея полягала в тому, що:
     
  • Продажі стартують кожну годину
  •  
  • Число товарів обмежена
  •  
  • Хто перший встав того і тапки
  •  
Були дуже смачні лоти зі знижкою 90%, топові смартфони цього року за 200-300 доларів, минулорічні по 100 доларів. Розігрувалося всього по 5 штук кожної позиції. Спробував виграти вручну, зрозуміло нічого не вийшло. Ну і вирішив я написати бота…
 
Насамперед прощупав як воно взагалі працює, вручну. Всі свої спроби виграти я записував Фідлером, потім копався в його звітах. Поки копався, думав якого бота написати. Почав було робити консольний додаток з відправкою запитів через сокети і парсинга відповідей. Розігрувалися спочатку смачні лоти, і всі спроби виграти їх вручну були безуспішними, але я не засмучувався, аналізував трафік, програмував кроки з того що проаналузвати. Тут підтяглися нікому непотрібні лоти. Нарешті то я пройшов далі і побачив капчу. Консольний додаток відпало відразу. Спало на думку написати розширення для хрому. Метою було допомогти мені швидко доклікаться до капчі, поставити курсор для введення, і потім кликати далі. Сказано зроблено, для такого розширення потрібно всього 2 файлу: manifest.json і content.js . У маніфесті прописуємо content.js як інжектіруемого скрипт і все, тепер він виконується на кожній сторінці. А там через document.querySelector вибираємо потрібні елементи та програмно натискаємо по ним. Бот або краще назвати поки його Helper працює на ура, непотрібні товари замовляє без проблем, а потрібні все одно опиняються вже продані. Занадто повільно.
 
Частково проблема була в тому, що зворотний звіт на сайті відстає від реальних годин, за годину напевно на 5 хвилин. Плюс якщо оновити одночасно 2 сторінки вони можуть завантажиться зі зрушенням в лічильнику в 2 секунди.
Отже треба постійно оновлювати сторінку і стежити за актуальним лічильником. Відкрив кілька вкладок, став писати бота з обміном інформацією через localstorage розширення, але на неактивних вкладках були постійні проблеми, то скрипт НЕ стартує, то querySelector нічого не знаходить, то в обраному елементі тексту з часом, що залишився ні — парсити нічого. А у активної сторінки завжди все працювало.
Проблема мабуть в оптимізації браузера з невидимими вкладками, треба всі сторінки на увазі тримати. Зробив 9 фреймів прямо всередині головної сторінки, в яких оновлювалися постійно сторінки продукту з лічильником, але тепер прямого доступу до фрейму не було. Дивно, всі сторінки на одному домені, скрипт працює з контексту розширення, але при спробі доступу до frames [i]. ContentDocument — індіанська національна хата — "фігвам" називається. Виявилося що китайці на головній сторінці привласнювали document.domain = «aliexpress.com» — до домену другого рівня, не знаю навіщо їм це треба, інших фреймів на сторінці немає. Я спробував повернути назад, не тут то було. Виявляється рівень домену зменшувати можна, а збільшувати не можна. Навіть якщо сторінка завантажена з того-ж домена який ти хочеш привласнити. Довелося всюди міняти домен на другий рівень — прямий доступ до фреймів отримав. Парс час, обчислював найкраще і не чіпав його поки хто небудь не завантажувався з більш кращим часом, оновлював інші фрейми — це працювало, кращий лічильник завжди був готовий до кліку. Потім число фреймів скоротив до 4.
Налагодив розширення на непотрібних лотах, при настанні часу «Ч» воно мене благополучно вело до капчі, яку я вводив і натискав enter, далі замовлення оформлявся автоматично. Все підготовлено, і я став чекати новий розіграш.
 
Під час наступного розіграшу мене чекав сюрприз у вигляді діалогових вікон вибору кольору і / або комплектації, такого я ще не бачив і мій бот на них зупинявся, швидко були дописані відповідні кроки і…
 
Всі продано, постійно все продано. Занадто повільно, що робити? Китайські та індійські сервіси з розпізнавання капчі спрацюють не швидше мене. Нормальну програму з розпізнавання до розширення не прикрутиш. Вже подумував повернутися до консольного додатку, і закинув питання на роботі хто — що знає будь-які модулі або бібліотеки з розпізнавання капчі. Став дивитися як завантажувати капчу, звідки взяти url. як зауважив особливість, картинка капчі подгружается з іншого домену «checktoken1.alibaba.com» , в url підставляється ідентифікатор сесії і все, при оновленні картинки — цифри щоразу різні.
 
 І тут мене осінило капч можна розпізнати заздалегідь.
Вона мабуть працює так: коли приходить запит на сервер капчі, він генерує текст і по ньому картинку. Зберігає останнє відповідність тексту і id сесії в базі, без перевірки що взагалі така сесія існує і була відкрита сторінка з капчі. А вже після відправки форми перевіряється відповідність введеного тексту користувачем і тексту з бази.
 
Перевірив я свою здогадку так: у hosts заблокував домен checktoken1.alibaba.com для checktoken1.alibaba. co прописав потрібний IP і завантажив картинку в іншій вкладці (щодо цього я боявся найбільше, з підробленого домену картинка могла б і не завантажиться і довелося б використовувати другий комп). Оновив форму з капчі. Ввів старе значення, форма спрацювала, капча валідна, досвідченим шляхом встановив значення скидання сесії в 15 хвилин.
Допрацював сторінку з фреймами, зробив текстове поле і картинку з іншого домену, вводив капчу приблизно за 5 хвилин до розіграшу, і розширення працювало як годинник, якщо звичайно не була фейк і не було інших злісних роботів.
 
Власне тепер можна було б повернутися до консольного додатку, без браузера воно б працювало набагато спритніше, але лінь матушка мені підказувала — навіщо писати знову коли і так працює.
 
Восени 2013-го розробники aliexpress щось зробили з капчі, Незрозумілий заздалегідь їх перестала задовольняти, і мій бот перестав працювати. У режимі Helper'a з ручним розпізнаванням капчі замовлення оформляється занадто повільно.
 
 
Разом
 
З великого виграв фотик Nikon d5100 за $ 246 в травні 2013, телефон nokia lumia 800 за $ 136 в березні 2013, blackberry bold 9900 за $ 136. Нічого з топових пропозицій так і не зміг виграти, або там фейки або боти ще по зліше мого там пасуться. Через місяці 2-4 я перевіряв хто скупив ці топові позиції — покупці були тільки з Росії, Білорусії та України.
 
 Ісходникі розширення на GitHub

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.