Leonid Filatov
Light Weight
Автор:
Эксклюзивно для форума: [2/2]
Ссылка на первую часть:
Во второй части статьи мы уже собственно напишем конфиг для OpenBullet 2.
Этот конфиг будет выступать в роли Брута/Чекера, в рамках обучения мы не будем делать навороченный чекер, я просто покажу вам по какому принципу это всё работает, а конкретно мы спарсим дату последнего заказа на аккаунте и все кредитные карты, которые привязаны к аккаунту. Так же в конце я оставлю ссылку на исходник, чтобы вы могли посмотреть, или модифицировать этот скрипт.
После изучения ОБЕИХ СТАТЕЙ (!!!), вы сможете писать свои простенькие брут/чекеры и уже будете знать как обойти одну из самых популярных защит в виде CSRF токена. Я думаю, что для успешного старта этой информации будет вполне достаточно.
Если вы хотите писать какие-то более сложные проекты, то тут только опыт и набивание руки, ибо почти для каждого проекта нужен свой подход, хоть и "база" у всех одинаковая.
Напомню, что нашей целью будет выступать сайт cpooutlets.com.
Для начала нам нужно скачать [кликабельно] его из официального репозитория на GitHub. Я думаю нет смысла объяснять как его установить, там и так всё очень просто и понятно.
После открытия программы мы можем сразу перейти к созданию и настройке конфига , для этого мы заходим в раздел "Configs" и жмём там на зелёную кнопку "New".
После чего у нас откроется окно, в котором мы должны ввести название проекта и имя автора (вводить можно что угодно).
Теперь в списке конфигов мы можем увидеть тот, который мы только что создали. Тыкаем на него 2 раза ПКМ, либо выбираем его и жмём Edit.
Отлично, мы открыли наш проект. Теперь давайте научимся добавлять новые действия в наш скрипт. Для этого нажмите на зелёный плюсик, после чего введите/выберите название нужного нам действия.
В этом уроке нам понадобятся только 4 действия:
Пока что не добавляем их в проект, а просто изучаем! Можете потыкать и посмотреть что вообще происходит когда добавляем действие, попробуйте добавить одно из действий, например "HTTP REQUEST" и посмотрите его содержимое.
Спойлер: Как выглядит содержимое действия "HTTP REQUEST"
Открываем наш конфинг, жмём на вкладку Config, потом там же, в выпавшем списке выбираем "Settings"
После того, как мы открыли окно настроек нам нужно поставить галочку напротив "Use proxies"
Спускаемся ниже и видим раздел "Data", в котором нужно указать какой формат данных будет использовать конфиг при работе, так как мы делаем брут (формат данных mail😛ass), то нас интересует формат "Credentials". Жмем по "Credentials" ПКМ, чтобы он переехали в зелёный столбец и жмем по "Default", чтобы он переехал в красный столбец.
На выходе должно получиться так:
Изменения в настройках сохранятся автоматически.
Нам осталось только найти какой-нибудь валидный аккаунт с заказами и кредитной картой, чтобы было откуда парсить нужные нам данные с аккаунта.
Обычно я просто нахожу строки в каком-нибудь популярном боте по поиску url:login😛ass, либо просто в свежих раздачах логов. Потом перебираю их в ручную, пока не найду аккаунт, который подходит под мои критерии.
Я буду использовать аккаунт:
Вы должны провести 365 дней на форуме для просмотра контента.
Извините, но поставлю хайд на аккаунт, чтобы он пожил как можно дольше. Будьте людьми, не меняйте пароль на аккаунте, дайте другим попробовать! Кому реально очень интересно, то можете написать мне в ЛС на форуме и я выдам вам этот аккаунт.
Теперь давайте вернёмся в наше окно разработки (Stacker) (см. этап 0.1, только жмем НЕ Settings, а Stacker).
Когда мы перешли в Stacker, то справа мы можем увидеть строку ввода "Data", в которую мы должны вписать наш аккаунт (в формате mail😛ass) и надпись "Wordlist Type", где мы должны выбрать "Credentials"
На этом настройка конфига перед разработкой завершена.
Вспоминаем первый урок, ведь там в конце мы собрали всю необходимую информацию о сайте.
Конкретно в нашем случае порядок действий такой:
В этом нам поможет функция "Parse" , жмём на зелёный плюсик и добавляем действие в проект (см. этап 0).
Парсинг USERNAME:
Спойлер: Скриншот
Парсинг PASSWORD:
Тут по аналогии с парсингом USERNAME.
Спойлер: Скриншот
И ещё не забываем нажимать "Save" внизу нашего проекта, чтобы сохранить изменения! НАЖИМАТЬ "SAVE" РЕКОМЕНДУЕТСЯ ПОСЛЕ ДОБАВЛЕНИЯ/УДАЛЕНИЯ КАЖДОГО НОВОГО ДЕЙСТВИЯ!
Спойлер: Скриншот
На данном этапе нам понадобится скомбинировать два действия, а именно функции "HTTP Request" и функция "Parse" , жмём на зелёный плюсик и добавляем эти действия в проект по очереди (см. этап 0).
Сейчас нам понадобятся знания из статьи. А именно из Этапа 2.1.
GET запрос на страницу авторизации:
Спойлер: Скриншоты
Парсинг CSRF токена из ответа на GET запрос:
Теперь наша задача сделать так, чтобы скрипт сохранял этот токен в переменную:
Теперь, нам нужна функция "KEYCHECK" (см. этап 0).
По сути, брут мы с вами уже создали. Осталось прикрутить к нему чекер.
Если на этом этапе скрипт увидит, что аккаунт валидный, то он перейдёт к следующему этапу, а именно - парсингу данных.
Теперь дело осталось за малым - спарсить дату последнего заказа и кредитные карты с аккаунта.
Нужные нам данные парсятся так же с помощью GET запроса. Но перед отправкой запроса нам нужно ещё понять на какой URL его вообще нужно отправлять.
Так давайте найдём страницу, на которой мы можем получить данные о наших заказах.
Поиск элемента, из которого можно СПАРСИТЬ ДАТУ ПОСЛЕДНЕГО ЗАКАЗА:
Составление XPATH с помощью ChatGPT:
Спойлер: Скриншот
Итак, на данный момент мы имеем следующее:
GET запрос на страницу с заказами:
Тут опять понадобится функция "HTTP Request"
Поднимаемся выше и смотрим "Этап 3" В ТЕКУЩЕЙ СТАТЬЕ. По сути всё тоже самое, отличаться будут только два пункта:
Давайте проверим, правильно ли Open Bullet обрабатывает этот запрос и за одно проверим, есть ли в ответе от сайта наш элемент с датой заказа.
Парсим дату заказа по XPATH из ответа:
Тут так же по сути тоже самое, что на Этапе 3, но с некоторыми отличиями:
Отлично, теперь осталось только спарсить все кредитные карты из аккаунта.
Сейчас нам нужно сделать всё тоже самое, что мы делали в пунктах 6.1 - 6.2.
Но тут есть небольшое отличие, ведь дату заказа мы спарсили всего одну, а карты нам нужно спарсить ВООБЩЕ ВСЕ!
Вылавливаем GET запрос:
Находим элемент, который содержит данные о картах:
Составление XPATH с помощью ChatGPT (2):
Проворачиваем те же действия, что и с элементами, содержащими дату последнего заказа.
Код: Скопировать в буфер обмена
Мы получили данные, которые нам нужны для успешной отправки GET запроса:
GET запрос на страницу с картами:
Поднимаемся выше и смотрим "Этап 6.2" В ТЕКУЩЕЙ СТАТЬЕ. По сути всё тоже самое, отличаться будут только два пункта:
Парсим данные всех карт по XPATH из ответа:
Тут так же по сути тоже самое, что на Этапе 6.2, но с одним отличием:
>Этап 7.1. Тестируем наш Brute/Checker в редакторе.<
Фух, почти всё! Финальный рывок!
Вроде бы такой маленький скрипт, но времени на написание статьи ушло прилично. Возможно много графомании, но я пытался объсянить, что называется "для самых маленьких".
Так же в Open Bullet 2 есть возможность делать такие же софты, но на сайты где есть защита в виде ReCaptcha и HCaptcha. Всё это тоже делается очень просто, но как говорил классик: "это уже совсем другая история". Возможно, что я в ближайшем в будущем выпущу отдельную статью на эту тему.
Хотел бы ещё добавить, что только на создании брутов и чекеров функционал OB2 не ограничивается, а если использовать BAS (Browser Automation Studio), то спектр возможностей в NO CODE расширяется просто до невозможного. Ведь зачем нужно кодить, если можно не кодить, верно?
И кстати, как и обещал в начале - оставляю исходник, можете поковыряться кому интересно.
Код: Скопировать в буфер обмена
Удачи, путник!
Эксклюзивно для форума: [2/2]
Ссылка на первую часть:
Предисловие
Ещё раз здравствуйте, форумчане! В
статьи мы уже поняли как ловить и правильно читать HTTP запросы, поняли что есть POST и GET запросы, и чем они отличаются, а так же узнали что такое CSRF токен и как его находить для дальнейшего использования в скрипте.Ещё раз здравствуйте, форумчане! В
Во второй части статьи мы уже собственно напишем конфиг для OpenBullet 2.
Этот конфиг будет выступать в роли Брута/Чекера, в рамках обучения мы не будем делать навороченный чекер, я просто покажу вам по какому принципу это всё работает, а конкретно мы спарсим дату последнего заказа на аккаунте и все кредитные карты, которые привязаны к аккаунту. Так же в конце я оставлю ссылку на исходник, чтобы вы могли посмотреть, или модифицировать этот скрипт.
После изучения ОБЕИХ СТАТЕЙ (!!!), вы сможете писать свои простенькие брут/чекеры и уже будете знать как обойти одну из самых популярных защит в виде CSRF токена. Я думаю, что для успешного старта этой информации будет вполне достаточно.
Если вы хотите писать какие-то более сложные проекты, то тут только опыт и набивание руки, ибо почти для каждого проекта нужен свой подход, хоть и "база" у всех одинаковая.
Напомню, что нашей целью будет выступать сайт cpooutlets.com.
>Этап 0. Быстрое введение в OpenBullet 2.<
OpenBullet 2 представляет собой программу, которая позволяет писать конфиги (в нашем случае брут/чекер) без знания кода. Построение логики скрипта происходит с помощью "кубиков".Для начала нам нужно скачать [кликабельно] его из официального репозитория на GitHub. Я думаю нет смысла объяснять как его установить, там и так всё очень просто и понятно.
После открытия программы мы можем сразу перейти к созданию и настройке конфига , для этого мы заходим в раздел "Configs" и жмём там на зелёную кнопку "New".
После чего у нас откроется окно, в котором мы должны ввести название проекта и имя автора (вводить можно что угодно).
Теперь в списке конфигов мы можем увидеть тот, который мы только что создали. Тыкаем на него 2 раза ПКМ, либо выбираем его и жмём Edit.
Отлично, мы открыли наш проект. Теперь давайте научимся добавлять новые действия в наш скрипт. Для этого нажмите на зелёный плюсик, после чего введите/выберите название нужного нам действия.
В этом уроке нам понадобятся только 4 действия:
- HTTP REQUEST — отправляет запрос на сервер (например, для получения данных с сайта или API). Нужен для отправки POST/GET запросов.
- PARSE — извлекает нужные данные из ответа сервера, либо из переменной (например, HTML-код, JSON, просто текст и т.д). Поможет нам обработать ответ от сервера, который мы получили в результате POST/GET запроса, например, спарсить CSRF токен из HTML кода страницы после GET запроса, или спарсить кредитные карты и дату последнего заказа.
- KEYCHECK — проверяет, соответствуют ли полученные данные заданным условиям (например, есть ли в ответе определённое слово или фраза). Эта функция поможет нам определить результат ответа от сервера. Например, если мы получили "error": Invalid login or password. Remember that password is case-sensitive, то после KEYCHECK скрипт прервётся со статусом FAIL (BAD) и сохранит аккаунт как невалидный, а если в ответе будет "success": true, то скрипт продолжит работу дальше, спарсит все необходимые данные и закончит скрипт со статусом SUCCESS (GOOD).
- RANDOM USER AGENT — Я думаю всё понятно из названия, позволяет нам получить случайный юзерагент, чтобы у каждого нашего потока был разный юзерагент, что поможет нам снизить вероятность блокировки наших запросов со стороны сервера. Да и в принципе для "анонимности" хорошо.
Пока что не добавляем их в проект, а просто изучаем! Можете потыкать и посмотреть что вообще происходит когда добавляем действие, попробуйте добавить одно из действий, например "HTTP REQUEST" и посмотрите его содержимое.
Спойлер: Как выглядит содержимое действия "HTTP REQUEST"
>Этап 0.1. Настройка конфига.<
Теперь давайте настроим конфиг, чтобы он работал с прокси и принимал базы в виде mail😛ass. Делается это всё очень быстро.Открываем наш конфинг, жмём на вкладку Config, потом там же, в выпавшем списке выбираем "Settings"
После того, как мы открыли окно настроек нам нужно поставить галочку напротив "Use proxies"
Спускаемся ниже и видим раздел "Data", в котором нужно указать какой формат данных будет использовать конфиг при работе, так как мы делаем брут (формат данных mail😛ass), то нас интересует формат "Credentials". Жмем по "Credentials" ПКМ, чтобы он переехали в зелёный столбец и жмем по "Default", чтобы он переехал в красный столбец.
На выходе должно получиться так:
Изменения в настройках сохранятся автоматически.
Нам осталось только найти какой-нибудь валидный аккаунт с заказами и кредитной картой, чтобы было откуда парсить нужные нам данные с аккаунта.
Обычно я просто нахожу строки в каком-нибудь популярном боте по поиску url:login😛ass, либо просто в свежих раздачах логов. Потом перебираю их в ручную, пока не найду аккаунт, который подходит под мои критерии.
Я буду использовать аккаунт:
Вы должны провести 365 дней на форуме для просмотра контента.
Извините, но поставлю хайд на аккаунт, чтобы он пожил как можно дольше. Будьте людьми, не меняйте пароль на аккаунте, дайте другим попробовать! Кому реально очень интересно, то можете написать мне в ЛС на форуме и я выдам вам этот аккаунт.
Теперь давайте вернёмся в наше окно разработки (Stacker) (см. этап 0.1, только жмем НЕ Settings, а Stacker).
Когда мы перешли в Stacker, то справа мы можем увидеть строку ввода "Data", в которую мы должны вписать наш аккаунт (в формате mail😛ass) и надпись "Wordlist Type", где мы должны выбрать "Credentials"
На этом настройка конфига перед разработкой завершена.
>Этап 0.2. Составляем последовательность действий.<
Если вы хотите, чтобы скрипт отрабатывал правильно, то нам нужно понять в каком порядке будут выполняться все действия.Вспоминаем первый урок, ведь там в конце мы собрали всю необходимую информацию о сайте.
Конкретно в нашем случае порядок действий такой:
- Сохраняем USERNAME и PASSWORD в переменные для дальнейшего использования в скрипте.
- Получаем случайный USER AGENT и сохраняем его в переменную, чтобы потом вставлять его в необходимые сайту заголовки (Request Headers, см ) для POST/GET запросов.
- Делаем GET запрос на страницу авторизации (https://www.cpooutlets.com/on/demandware.store/Sites-cpooutlets-Site/default/Login-Show).
- Парсим CSRF токен из ответа от GET запроса на страницу авторизации, сохраняем его в переменную, чтобы использовать его в POST запросе.
- Отправляем POST запрос на ссылку https://www.cpooutlets.com/on/demandware.store/Sites-cpooutlets-Site/default/Account-Login с содержимым в формате application/x-www-form-urlencoded.
- Проверяем ответ от сервера после POST запроса. Если получаем "error": Invalid login or password. Remember that password is case-sensitive, то аккаунт помечаем как BAD и завершаем поток. Если получаем "success": true, то аккаунт помечаем как SUCCESS (GOOD) и парсим дату последнего заказа и все кредитные карты, которые привязаны к аккаунту.
>Этап 1. Сохраняем USERNAME и PASSWORD в переменные.<
В этом нам поможет функция "Parse" , жмём на зелёный плюсик и добавляем действие в проект (см. этап 0).
Парсинг USERNAME:
- В поле "Label" пишем "USERNAME PARSING". - Название нашего действия, обозначение чисто для себя.
- В поле "Output Variable" пишем "USERNAME". - Имя переменной, в которую будет сохраняться USERNAME.
- Во вкладке "Input" в выпадающем окне выбираем "input.USERNAME". - Указываем парсеру откуда брать входные данные.
Спойлер: Скриншот
Парсинг PASSWORD:
Тут по аналогии с парсингом USERNAME.
- В поле "Label" пишем "PASSWORD PARSING".
- В поле "Output Variable" пишем "PASSWORD".
- Во вкладке "Input" в выпадающем окне выбираем "input.PASSWORD".
Спойлер: Скриншот
И ещё не забываем нажимать "Save" внизу нашего проекта, чтобы сохранить изменения! НАЖИМАТЬ "SAVE" РЕКОМЕНДУЕТСЯ ПОСЛЕ ДОБАВЛЕНИЯ/УДАЛЕНИЯ КАЖДОГО НОВОГО ДЕЙСТВИЯ!
>Этап 2. Получаем случайный USERAGENT и сохраняем его в переменную.<
В этом нам поможет функция "Random User Agent" , жмём на зелёный плюсик и добавляем действие в проект (см. этап 0).- В поле "Label" пишем "GET USER AGENT".
- В поле "Output Variable" пишем "USERAGENT".
- Во вкладке "Platform" в выпадающем окне выбираем "Windows". - Windows выбираем конкретно для этого проекта, там есть ещё много разных юзерагентов, в том числе и мобильные.
Спойлер: Скриншот
>Этап 3. Получаем CSRF-TOKEN и сохраняем его в переменную.<
На данном этапе нам понадобится скомбинировать два действия, а именно функции "HTTP Request" и функция "Parse" , жмём на зелёный плюсик и добавляем эти действия в проект по очереди (см. этап 0).
Сейчас нам понадобятся знания из статьи. А именно из Этапа 2.1.
GET запрос на страницу авторизации:
- В поле "Label" пишем "GET CSRF TOKEN".
- В поле "URL" вставляем ссылку на страницу авторизации "https://www.cpooutlets.com/on/demandware.store/Sites-cpooutlets-Site/default/Login-Show". - В первой части статьи мы узнали, что именно на этой странице находится форма авторизации.
- Во вкладке "Method" в выпадающем списке выбираем "GET". - Ну тут всё понятно я думаю, мы же делаем GET запрос.
- В поле "HTTP Version" пишем "2.0". - В первой части статьи мы узнали, что эта версия HTTP используется для запросов к сайту.
- В поле "Content Type" пишем "application/x-www-form-urlencoded".
- В поле "Custom Headers" пишем те заголовки, которые мы получили в этапе 2.1. в , ТОЛЬКО REQUEST HEADERS БЕРИТЕ НЕ ИЗ POST ЗАПРОСА, А ИЗ GET! Удаляем оттуда мусор по типу Cookie (потому что OpenBullet сам их сгенерит). И вместо значения юзерагента как в запросе, мы вставляем тот, который получили на этапе 2 в этой статье (см. выше). Чтобы сделать это, нам нужно вставить его в скобочки "<>", потому что именно так в OpenBullet указываются переменные. Не забываем выбрать режим работы с переменными напротив "Custom Headers". Вот что получилось на выходе:
Код:
User-Agent: <USERAGENT>
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br, zstd
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
TE: trailers
- Во вкладке "HTTP Library" в выпадающем списке выбираем "SystemNet". - Это библиотека для работы с HTTP/2
Спойлер: Скриншоты
Парсинг CSRF токена из ответа на GET запрос:
- Теперь нажимаем зелёную кнопку "START" в правом верхнем углу и проигрываем сценарий скрипта.
- В логе мы видим ответ от GET запроса. Ответ приходит в виде HTML кода.
- Снизу (под логом) в поле для поиска пишем csrf_token и жмем Search.
- Видим наш CSRF токен, он находится между name="csrf_token" value=" и "/>
Теперь наша задача сделать так, чтобы скрипт сохранял этот токен в переменную:
- Создаём кубик "Parse".
- В поле "Label" пишем "CSRF TOKEN PARSING".
- В поле "Output Variable" пишем "CSRF_TOKEN".
- Во вкладке "Input" в выпадающем окне выбираем "data.SOURCE".
- Ниже ставим галочку в чекбокс возле "LR" - спарсит то, что находится между теми словами, что мы укажем. В нашем случае токен между name="csrf_token" value=" и "/>.
- В поле "Left Delim" пишем "name="csrf_token" value="".
- В поле "Right Delim" пишем ""/>".
- Не забываем нажать "Save" и жмём ещё раз "Start". В результате в логе видим, что токен успешно сохранился в переменную.
>Этап 4. Отправляем POST запрос на авторизацию.<
На данном этапе нам понадобится функция "HTTP Request" и так же все знания из .- В поле "Label" пишем "ACCOUNT AUTH".
- В поле "URL" вставляем ссылку на страницу авторизации "https://www.cpooutlets.com/on/demandware.store/Sites-cpooutlets-Site/default/Account-Login". - В первой части статьи мы узнали, что ИМЕННО НА ЭТУ ССЫЛКУ ОТПРАВЛЯЕТСЯ POST ЗАПРОС.
- В поле "Content" пишем "loginEmail=<USERNAME>&loginPassword=<PASSWORD>&csrf_token=<CSRF_TOKEN>". - В первой части мы поняли, что данные отправляются в таком виде. А мы сюда подставляем наши значения из переменных.
- Во вкладке "Method" в выпадающем списке выбираем "POST".
- В поле "HTTP Version" пишем "2.0".
- В поле "Content Type" пишем "application/x-www-form-urlencoded". - Опять же в первой части мы увидели, что там испольузется этот формат данных при отправке запроса.
- В поле "Custom Headers" пишем те заголовки, которые мы получили в этапе 2.1. в первой статье, НА ЭТОТ РАЗ УЖЕ ИЗ POST ЗАПРОСА, только удаляем оттуда мусор по типу Cookie (потому что OpenBullet сам их сгенерит). И так же в юзерагент вставляем значения из переменной которую получили ранее!
- Во вкладке "HTTP Library" в выпадающем списке выбираем "SystemNet".
- Опять нажимаем "Save" и жмём ещё раз "Start". В результате в логе видим, что мы успешно вошли в аккаунт.
>Этап 5. Добавление определения GOOD или BAD.<
Теперь, нам нужна функция "KEYCHECK" (см. этап 0).
- Создаём кубик "KEYCHECK".
- В поле "Label" пишем "LOGIN STATUS CHECK".
- Ставим галочку в чекбокс "Ban if no match" (если не стоит по умолчанию). - Помещает результат в категорию "Ban" (по сути тоже BAD), если скрипт не находит вообще никаких совпадений в ответе от сервера (то есть если нет в ответе ни "Invalid login or password. Remember that password is case-sensitive", ни "success": true)
- Во вкладке "Keychains" два раза жмём на "Add".
- В первом появившемся окне ставим "Result Status" на "Fail". Потом жмём "String" и в появившемся поле напротив "Contains" пишем тот текст из ответа на POST запрос, который выходит при неверном логине/пароле, а именно: "Invalid login or password. Remember that password is case-sensitive" - Таким образом, если скрипт на этом этапе увидит, что ответ на наш POST запрос содержит в себе "Invalid login or password. Remember that password is case-sensitive", то он завершит поток со статусом "Fail" (то бишь BAD) и перейдёт к другому аккаунту.
- Во втором появившемся окне ставим "Result Status" на "Success". А в остальном делаем всё по аналогии с предыдущим шагом, только в поле поле напротив "Contains" пишем уже "success": true.
- Сохраняем проект, жмём кнопку "Start".
- Видим, что поток завершился успешно со статусом "BOT ENDED AFTER 3196 ms WITH STATUS: SUCCESS". Всё работает успешно, но т.к нету следующих действий, то скрипт на этом остановит свою работу.
По сути, брут мы с вами уже создали. Осталось прикрутить к нему чекер.
Если на этом этапе скрипт увидит, что аккаунт валидный, то он перейдёт к следующему этапу, а именно - парсингу данных.
Теперь дело осталось за малым - спарсить дату последнего заказа и кредитные карты с аккаунта.
>Этап 6.1. Прикручиваем чекер. Парсим дату последнего заказа. Поиск нужного GET запроса и элемента страницы, который содержит дату заказа.<
Поиск СТРАНИЦЫ И ЗАПРОСА С ИСТОРИЕЙ ЗАКАЗОВ:Нужные нам данные парсятся так же с помощью GET запроса. Но перед отправкой запроса нам нужно ещё понять на какой URL его вообще нужно отправлять.
Так давайте найдём страницу, на которой мы можем получить данные о наших заказах.
- Заходим на сайт cpooutlets.com, входим в аккаунт в ручную, открываем страницу своего профиля. Видим что там есть вкладка "My Orders".
- Заходим во вкладку "My Orders".
- Открываем сетевой монитор (CTRL + SHIFT + E)
- Видим, что можно поставить фильтр, чтобы показывать заказы за 12 месяцев. (По умолчанию стоит "Last 30 Days" и страница с заказами была пустая, т.е парсить нам бы было нечего, а этот фильтр позволил посмотреть все покупки за год). Жмем на "Last Twelve Months".
- Видим, что у нас открылись все заказы за год, а в сетевом мониторе появился GET запрос на URL "https://www.cpooutlets.com/on/deman...ts-Site/default/Order-Filtered?orderFilter=12". Это точно нужный нам запрос, потому что можем наблюдать в запросе параметр "orderFilter=12" (т.е фильтр заказов за 12 месяцев). Запомним этот URL.
Поиск элемента, из которого можно СПАРСИТЬ ДАТУ ПОСЛЕДНЕГО ЗАКАЗА:
- Теперь давайте проверим, в каком из элементов на странице находится дата последнего заказа у самого крайнего ордера. Для этого просто наводим на дату заказа мышкой, жмём ЛКМ и тапаем
хомякана кнопку "Inspect (Q)"
- Теперь мы видим, что дата последнего заказа находится в коде прямо под элементом <label>Placed</label>. А именно:
Код:
<li>
<label>Placed</label>
<p> Aug 12, 2024</p>
</li>
Составление XPATH с помощью ChatGPT:
- В этот раз у нас НЕ ПОЛУЧИТСЯ спарсить данные так же, как CSRF_TOKEN (через галочку LR, см. Этап 3), потому что слева и справа от даты заказа (Aug 12, 2024) находятся только <p> и </p>, а всё остальное находится выше. Таких совпадений в коде страницы будет просто уйма и скрипт будет парсить нам не то, что нужно. Нам нужно каким-то образом сказать скрипту, чтобы он спарсил текст который находится под <label>Placed</label>.
- Но всегда есть выход! В данной ситуации нам поможет XPATH. В этой статье я НЕ БУДУ долго объяснять что такое XPATH и как он работает, но просто для общего развития могу сказать, что XPATH - это как карта, которая помогает найти нужную часть на сайте. Она показывает, где именно на странице находится текст, кнопка или картинка.
- Для начала скопируем код всего элемента с датой заказа, для этого опять заходим в Inspector (см. чуть выше) и для этого наводим на родительский элемент, чтобы он выделился полностью (вместе со всем текстом) синим квадратом прямо на сайте, жмем "Edit as HTML" и копируем код элемента целиком. Для понимания смотрите скриншоты.
- Составить XPATH для этого элемента нам поможет ChatGPT. Подойдёт даже бесплатная, я думаю почти у всех она есть, сейчас грех её не иметь. Для этого просто пишем ей следующий prompt:
Код:
Сделай XPATH, который будет находить текст, который находится под Placed. Там всегда будет разная дата. Учти, что это XPATH для OpenBullet 2. Учти все его особенности.
<li>
<label>Placed</label>
<p> Aug 12, 2024</p>
</li>
Спойлер: Скриншот
- На выходе мы получили XPATH "//li[label[normalize-space()='Placed']]/p". Запомним его.
>Этап 6.2. Прикручиваем чекер. Парсим дату последнего заказа. Отправка GET запроса и парсинг даты заказа из ответа.<
Итак, на данный момент мы имеем следующее:
- Ссылка, которая позволяет нам посмотреть наши заказы за последние 12 месяцев - https://www.cpooutlets.com/on/deman...ts-Site/default/Order-Filtered?orderFilter=12
- XPATH элемента, который нужно спарсить - //li[label[normalize-space()='Placed']]/p
GET запрос на страницу с заказами:
Тут опять понадобится функция "HTTP Request"
Поднимаемся выше и смотрим "Этап 3" В ТЕКУЩЕЙ СТАТЬЕ. По сути всё тоже самое, отличаться будут только два пункта:
- В поле "Label" пишем "GET ORDERS".
- В поле "URL" вставляем ссылку на страницу с заказами "https://www.cpooutlets.com/on/deman...ts-Site/default/Order-Filtered?orderFilter=12".
Давайте проверим, правильно ли Open Bullet обрабатывает этот запрос и за одно проверим, есть ли в ответе от сайта наш элемент с датой заказа.
- Сохраняем проект, жмём кнопку "Start".
- После того как сценарий скрипта проиграется, то можете посмотреть лог и написать в поле "Search" что-нибудь от нашего элемента, давайте попробуем поискать по слову "Placed"
- Всё проходит успешно, мы получили код страницы после нашего GET запроса и нашли там наш элемент с датой заказа.
Парсим дату заказа по XPATH из ответа:
Тут так же по сути тоже самое, что на Этапе 3, но с некоторыми отличиями:
- Создаём кубик "Parse".
- В поле "Label" пишем "ORDER DATE PARSING".
- В поле "Output Variable" пишем "ORDER_DATE".
- Ставим галочку в чекбокс "Safe mode (catch exceptions to data.ERROR)". - ОБЯЗАТЕЛЬНО (!!!) ставим галочку в этот чекбокс, он поможет нам тогда, когда у аккаунта вообще не будет заказов, то есть и парсить скрипту будет нечего, а значит вылетит ошибка и будет сбой в работе скрипта. А эта галочка поможет включить на этом действии "Игнор ошибок", т.е если скрипт получит ошибку, то он просто запишет детали этой ошибки в переменную "data.ERROR" и продолжит работу. Ведь часто такое бывает, что на аккаунте есть привязанная карта, а заказов вообще нет, а парсинг карты у нас будет только на следующем этапе, поэтому нам нужно продожать.
- Ставим галочку в чекбокс "Is Capture". - ОБЯЗАТЕЛЬНО (!!!) ставим галочку в этот чекбокс когда мы парсим ту информацию, которую мы потом хотим сохранить в лог! При парсинге CSRF токена, логина и пароля мы не ставили эту галочку, потому что нам не нужно сохранять эти данные на выходе!
- Во вкладке "Input" в выпадающем окне выбираем "data.SOURCE".
- Ниже ставим галочку в чекбокс возле "Xpath".
- В поле "X Path" пишем "//li[label[normalize-space()='Placed']]/p".
- Сохраняем проект, жмём кнопку "Start".
- Теперь видим в логе, что Open Bullet удачно спарсил и захватил значение из нужного нам элемента для будущего сохранения в лог!
Отлично, теперь осталось только спарсить все кредитные карты из аккаунта.
>Этап 6.3. Прикручиваем чекер. Поиск нужного GET запроса и элемента страницы, который содержит данные о картах.<
Сейчас нам нужно сделать всё тоже самое, что мы делали в пунктах 6.1 - 6.2.
Но тут есть небольшое отличие, ведь дату заказа мы спарсили всего одну, а карты нам нужно спарсить ВООБЩЕ ВСЕ!
Вылавливаем GET запрос:
- Мы уже залогинены на сайте, теперь заходим на страницу, где есть наши кредитные карты и данные о них.
- В нашем случае это раздел "Payment Methods".
- Открываем сетевой монитор (CTRL + SHIFT + E).
- Обновляем страницу (F5).
- Видим, что есть GET запрос на страницу с данными о кредитных картах.
Находим элемент, который содержит данные о картах:
- Наводим мышку на дату окончания действия карты.
- Жмем ЛКМ, тапаем на кнопку "Inspect (Q)".
- Тут тоже видим, что данные о картах находятся в элементе <div class="card-info-group">, причём для каждой карты. Значит всё что нам остаётся, это просто спарсить данные из КАЖДОГО ТАКОГО ЭЛЕМЕНТА.
Составление XPATH с помощью ChatGPT (2):
Проворачиваем те же действия, что и с элементами, содержащими дату последнего заказа.
- Копируем весь HTML код любого из элементов с данными карты, прямо как мы это делали выше в пункте 6.1.
- Пишем ChatGPT такой Prompt:
Код: Скопировать в буфер обмена
Код:
Сделай XPATH, который будет находить текст, который будет в элементе div class="card-info-group" (4 цифры карты и EXP). Там всегда будет разная дата. Учти, что это XPATH для OpenBullet 2. Учти все его особенности.
<div class="card-info-group">
<p>************9390</p>
<p>Exp: 9/2018</p>
</div>
- Успешно получаем XPATH - //div[@class='card-info-group']/p/text()
>Этап 6.4. Прикручиваем чекер. Получаем данные о всех картах. Отправка GET запроса и парсинг данных карт из ответа.<
Мы получили данные, которые нам нужны для успешной отправки GET запроса:
- Ссылка, которая позволяет нам посмотреть данные о картах на аккаунте - https://www.cpooutlets.com/on/demandware.store/Sites-cpooutlets-Site/default/PaymentInstruments-List
- XPATH элемента, который нужно спарсить - //div[@class='card-info-group']/p/text()
GET запрос на страницу с картами:
Поднимаемся выше и смотрим "Этап 6.2" В ТЕКУЩЕЙ СТАТЬЕ. По сути всё тоже самое, отличаться будут только два пункта:
- В поле "Label" пишем "GET CARDS".
- В поле "URL" вставляем ссылку на страницу с картами "https://www.cpooutlets.com/on/demandware.store/Sites-cpooutlets-Site/default/PaymentInstruments-List".
Парсим данные всех карт по XPATH из ответа:
Тут так же по сути тоже самое, что на Этапе 6.2, но с одним отличием:
- Создаём кубик "Parse".
- В поле "Label" пишем "CARDS DETAILS PARSING".
- В поле "Output Variable" пишем "CARDS".
- Ставим галочку в чекбокс "Safe mode (catch exceptions to data.ERROR)".
- Ставим галочку в чекбокс "Recursive". - ОБЯЗАТЕЛЬНО (!!!) ставим этот чекбокс, если мы хотим спарсить и данные ИЗ ВСЕХ ЭЛЕМЕНТОВ! То есть скрипт найдёт все элементы по нашему XPATH и из каждого вытащит данные.
- Ставим галочку в чекбокс "Is Capture".
- Во вкладке "Input" в выпадающем окне выбираем "data.SOURCE".
- Ниже ставим галочку в чекбокс возле "Xpath".
- В поле "X Path" пишем "//div[@class='card-info-group']/p/text()".
- Сохраняем проект (кнопка "Save").
>Этап 7.1. Тестируем наш Brute/Checker в редакторе.<
Фух, почти всё! Финальный рывок!
- Для начала давайте проверим его просто в редакторе в один поток, а не в многопотоке. Давайте нажмём "Start" и посмотрим на лог.
- По логу видим, что карты были успешно спаршены, записаны в переменную CARDS и захвачены для записи в лог.
>Этап 7.2. Тестируем наш Brute/Checker в многопоточном режиме.<
Теперь проверим скрипт в многопотоке, покажу как запускать конфиги и как правильно указывать входные ресурсы для конфига (база в формате email😛ass, прокси).- Заходим во вкладку "Jobs" слева вверху.
- Нажимаем "New".
- Выбираем тип "Multi Run".
- В открывшемся окне жмем "Select Config".
- Выбираем наш конфиг и жмём "Accept".
- В поле "Bots" вписываем кол-во потоков. Я поставлю 30.
- Во вкладке "Proxy Mode" ставим значение "On"
- В разделе "Hit Outputs" жмем "File System" (результаты будут сохраняться в папку "Hits" в папке, в которую установлен Open Bullet 2). Как можете увидеть на скриншот ниже, то результаты можно отправлять и в Telegram/Discord, что очень удобно.
- В разделе "Data Pool" ставим чекбокс напротив "File". Указываем путь до .txt файла с базой в формате mail😛ass и выбираем тип данных Credentials.
- В разделе "Proxy sources" жмем на кнопку "File". Указываем путь до .txt файла с прокси и выбираем тип прокси. Я использую прокси Socks 5, поэтому поставлю такой тип.
- Жмём Accept.
- Видим, что во вкладке "Jobs" появилась наша задача, которую мы только что создали. Жмём на неё 2 раза ПКМ и проваливаемся в окно с нашей задачей.
- Нажимаем "Start" справа в верхнем углу.
- После того как скрипт закончит работу мы видим в логе СПРАВА результат успешных "пробитий".
- А так же СПРАВА СНИЗУ есть окошко, в котором мы видим сколько гудов (Hits), сколько бэдов (Fails), какое кол-во строк ушли в Ban (см. этап 5) и сколько наш скрипт перебирает комбинаций за минуту (CPM).
- Давайте теперь найдём наш результат в папке с OpenBullet. Откройте папку, в которую он установлен.
- Найдите папку "Hits", в которой будет название вашего проекта, откройте папку с именем вашего проекта и найдите там файл SUCCESS.txt
- В файле SUCCESS.txt будут все ваши успешные результаты.
>Этап 8. Конец. Пару слов от меня.<
Вот наш конфиг и готов! 😉Вроде бы такой маленький скрипт, но времени на написание статьи ушло прилично. Возможно много графомании, но я пытался объсянить, что называется "для самых маленьких".
Так же в Open Bullet 2 есть возможность делать такие же софты, но на сайты где есть защита в виде ReCaptcha и HCaptcha. Всё это тоже делается очень просто, но как говорил классик: "это уже совсем другая история". Возможно, что я в ближайшем в будущем выпущу отдельную статью на эту тему.
Хотел бы ещё добавить, что только на создании брутов и чекеров функционал OB2 не ограничивается, а если использовать BAS (Browser Automation Studio), то спектр возможностей в NO CODE расширяется просто до невозможного. Ведь зачем нужно кодить, если можно не кодить, верно?
И кстати, как и обещал в начале - оставляю исходник, можете поковыряться кому интересно.
Код: Скопировать в буфер обмена
Код:
Ссылка -> mega.nz/file/xe1jmIgR#xtTxXSjnlxLbD4E3VJo0jBkwpKpoYVI2a1pvzgs8kO8
Пароль от архива -> .IS (обязательно большими буквами)
Конфиг закидывать по пути -> OpenBullet2\UserData\Configs
Удачи, путник!
Вложения
-
1729791155020.png
15.7 КБ · Просмотры: 5 -
1729807670619.png
16.8 КБ · Просмотры: 5 -
1729812192720.png
18.3 КБ · Просмотры: 10 -
1729815756137.png
26.7 КБ · Просмотры: 2 -
1729821085909.png
18.6 КБ · Просмотры: 1 -
1729821422479.png
18.6 КБ · Просмотры: 0 -
1729822087186.png
21 КБ · Просмотры: 1 -
1729826394453.png
19.7 КБ · Просмотры: 0 -
1729828860413.png
41.5 КБ · Просмотры: 0