Как я писал бота для аукциона 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
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 30

    +10
    Нашего человека не проведешь. Он на каждую задачу напишет хитрого бота.
      –34
      Это что такое вообще? Мне снова 13 лет и я на античат.ру попал?
        0
        «Это деменция, сэр»
        +4
        В сторону selenium не смотрели? Такую же инъекцию делать через executeScript, из плюсов — не надо будет мучаться с фреймами, можно пул из браузеров сделать. Плюс домашний комп свободен. С капчей тоже можно через ручной ввод, хороших сервисов автораспознования я пока не нашел
          +1
          смотрел в сторону PhantomJS, но переписывать было лень, к тому же это было больше развлечение.
          0
          Я думаю, у китайцев пинг меньше, вот и забирают топовые лоты быстрее вашего
            +3
            Через месяца 2-4 я проверял кто скупил эти топовые позиции — покупатели были только из России, Белоруссии и Украины.

              +1
              Ах да, покупатели — наши соотечественники. Предполагаю запуск скрипта с местного VPS (или от друга-китайца)
                +1
                хостинг в США, Сан-Хосе Калифорния. Даже нашел хостера но виртуалку купить не решился. вот если бы написл консольное тогда имело бы смысл
                +13
                Ничего из топовых предложений так и не смог выиграть, либо там фейки либо боты ещё по злее моего там пасутся


                Не было там раньше фейков, все топовые позиции я спокойно выигрывал. У меня был бот на несколько учетных записей на всю семью :)

                А капча теперь зависит от идентификатора товара, таким образом, до начала торгов невозможно узнать какая она будет.
                  +1
                  Нужно было запрос отсылать по часам компа, а не яваскрипта. И ещё делать упреждение на пол-пинга.
                    +1
                    Хм… я просто стиль у кнопки менял в фаербаге за 5 минут до окончания таймера, после чего проходил на оформление покупки и ждал 5 минут.
                    Когда таймер доходил до нуля, нажимал submit на форме.
                    Пару раз сработало. Деньги списались.
                    Но самое интересное, продавец после личным сообщением написал, что я не успел и товар был куплен до меня. Деньги вернули.
                    Т.е. в распродажах выигрывают первые несколько покупателей. Остальных система способна пропустить, но они в пролёте.
                      +1
                      Продавец вас обманул, там на их форуме было много таких историй, ушлые продавцы не хотят продавать телефон за бесценок и придумывают разные истории. Некоторые честно писали, что денег нет, семью кормить надо и если он продаст товар по такой цене то разорится. после жалобы в Администрацию — проблемы испарялись.
                        0
                        Самый красивый вариант развода, это когда ты выйграл, а до момента оплаты продавец выставляет новую цену доставки, такую, что общая стоимость увеличивается до небес.
                      +3
                      Знакомо. Но мы пошли дальше, написали бота на Java с веб интерфейсом. Капчу он тоже получал заранее с сайта капчиломалки, и автоматом за 2 секунды до начала торгов начинал жестко ддостить али с попыткой купить товар.
                      Запускали бота с кучи машин, в том числе арендовали сервера у амазона, т.к, выяснили что сервера гаги хостятся в калифорнии, в итоге мы смогли уменьшить пинг до 3-4мс.
                      Купили очень много вещей себе и друзьям, но к сожалению все равно много товаров даже нашим ботом мы не смогли купить, т.к. буквально через 200-500мс после начала сделки мы получали в ответ — «Sold out».
                      Интересно кто их выигрывал?

                      К сожалению после введения новой капчи, которая привязана не к сессии, как было раньше, а к продукту, бот тоже перестал работать.

                      Кому интересно, ниже я приложил 2 скриншота интерфейс бота. Вообще «экранов» было больше, но сейчас не смогу сделать скриншоты, т.к. али опять что-то поменяли и бот перестал даже добавлять товары. В спойлере так же описание других экранов нашего бота.

                      Скриншоты и описания интерфейса
                      Список товаров, которые мы хотим купить:


                      Первый шаг добавления товара:


                      Могу описать словами какие возможности были у бота:

                      Добавление товара
                      • В первом шаге нужно было выбрать на какой аккаунт покупать (а так же добавлять новые аккаунты), приоритет (чем выше приоритет товара тем больше потоков долбилось в али), ну и вставить ссылку на товар. Название получалось автоматически, но его можно было менять.
                      • На втором, если в товаре можно было выбирать цвет, размер и пр., то у нас так же был выбор. Если в товаре такого выбора не было, то переходили сразу на третий шаг
                      • На третьем шаге нужно было выбрать адрес доставки (если их больше одного в аккаунте). Адреса получались автоматически из аккаунта. Если был один адрес, то переходили на 4 шаг.
                      • На 4 шаге, выбирали способ доставки. Напротив каждого была указана цена.
                      • Вконце появлялось общее окно, на котором можно было ознакомиться со всеми настройками и либо подтвердить, либо вернуться к редактированию.


                      Список товаров
                      У каждого товара был таймер, показывающий через сколько начнется сделка. Если сделка проша, то таймер исчезал, а в статусе появлялась информация успех или провал с тултипом.
                      Была возможность экспортировать и импортировать весь список (например чтобы перенести на другие нащи сервера).
                      А так же возможность фильтровать, например показывать только товары определенных аккаунтов, или только успешные и т.д.

                        +2
                        До смены алгоритма каптчи я выигрывал практически все что хотел, так как мой бот не пытался открывать страницу с товаром, а сразу формировал правильный POST для покупки с каптчей.
                          0
                          Так и у нас так же.
                          Проблема была как раз в том что запрос ушел, потом али начинал тупить, потом в ответ приходил Sold out.
                          Большинство товаров мы конечно выигрывали, но вот что-то дорогое, вроде Samsung Galaxy S4 или аналогичные устройства, уже не получалось.
                          Точнее получалось, но в лучшем случае 1 раз из 10.
                            0
                            А сколько паралельных сессий открывали? У меня 100 одновременных соединений было на сервере. Все родственники ходят с телефонами от ali :)
                              0
                              Приоритет * 3, так что в среднем 9
                              Раньше было больше, но после того как нас али на пару часов блочил за ддос атаки пришлось уменьшить
                                0
                                А Вас али не блокировал за такое количество соединений?
                                А то мы, через некоторое время отправки кучи запросов к али, тали получать от апача сообщение о блокировке. Которое пропадало только через несколько часов. Блокировка шла тупо по IP.
                                  0
                                  Вообще ни разу не блокировали, хотя мучал я его изрядно…
                            0
                            А чисто из любопытства, Вы не разгадали секрет генерации ссылки для новой капчи? Мне интересно, это вообзще реально?
                              0
                              Пытался расшифровать, но явно нужно подобрать пароль от хеша, сам хеш это сессия + номер продукта. Нехватает мощности видеокарт его разгадать, к сожалению.
                                0
                                Ну учитывая что теперь там продают в основном «волосы девственниц» (как это называл коллега), то в общем то смысла от бота больше нет…
                                  0
                                  Согласен, фактически, последняя более-менее нормальная распродажа была курток и сумок по 1$, я купил немного на дачу :)
                            0
                            Мне было жаль тратить много времени, первая версия ~ 2 дня, и последующие распродажы тоже 2 дня примерно.
                            вт если бы топовый выграл то продолжил бы заморачиваться. а так… я себе так ничего не взял, всё на работе предложил коллегам.
                            +17
                            Внезапно выяснилось, что аукционы на Али — на самом деле соревнование программистов, у кого бот быстрее сориентируется и купит товар.
                              +7
                              Высокочастотный трейдинг :)
                                0
                                Торговать ботом можно не только на бирже :)
                              • НЛО прилетело и опубликовало эту надпись здесь

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое