Что такое чекеры и как же их писать?

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Авторство: germans

Источник: xss.is

Статья ориентирована на новичков в Python, а может быть и нет.

К
ак понять, что такое чекер?!..- Зайдя в интернет, я понял, что там нет того значения слова, о котором я хочу рассказать вам сегодня. Чекеры - скрипт, проверяющий входящие данные, с целью узнать, что же там с этими самыми данными?..-
Обычно, имеют в виду чекер login:password - на валидность(рабочий аккаунт или нет), но нет, не стоит ограничиваться лишь этим, это не предел. Чекеры могут работать как на запросах(requests), так и на симуляции(playwright,selenium). Основная масса делается конечно же на запросах, в чём её преимущества над эмуляцией? Вот в чём:
- Скорость, и еще раз скорость, представьте один браузер, который ели-ели запускается и вынужден еще ручками вписывать данные, представили? А теперь представьте один верно составленный запрос, по которому ты клацнул, и хоп, у тебя уже все данные есть.
- Не зависит от сайта. Меня конечно могут начать сейчас душить, а вдруг компания проведет какие-либо поправки в запросах, апи?..- Честно, я ни разу не сталкивался с таким, а вот сайт же, изменив совсем немного свой дизайн(в случае поиска где требуются вводить данные по Xpath), у нас всё пойдет по одному не очень культурному месту..
- Нагрузка на ОС, это еще очень важный критерий, ведь проверять в 1 потоке браузера - 1 млн. данных, такое себе увлечение, думаю все согласны? Вы скажете, а может мы просто поставим 10000 потоков браузера?!!..- Нет, и еще раз нет. Машина на 32 ядрах вместе с 32гб RAM не вывезла даже и 100 браузеров.. В запросах же нагрузка конечно тоже есть, но не такая чтобы она отбивала все железки компьютера.


В каких случаях тогда нужно использовать эмуляцию? В случае тяжелой защиты сайта, такое было у меня на практике один раз относительно недавно. Сайт имел защиту cloudflare..- Люди, слышавшие про такую защиту и про Python, скажут: "Почему ты не использовал библиотеку cloudscrape?", она вымерла, подавно вымерла. В Cloudflare тоже сидят не дурачки и всё это отслеживают, сейчас же эта защита(по моему субъективному мнению) обходится лишь двумя способами первый - это использованием undetected-browser в связке с хорошими прокси, а так же нужно открывать тот самый сайт с защитой не сразу же как мы запустили эмулятор, а через js скрипт, чтобы CF не считал его сайт целевым. Второй способ - заключается в сниффинге трафика с мобильного приложения сайта, там может быть другое апи и запросы, проверено на примере - Alibaba.

Я думаю на сегодня хватит с теорией и стоит переходить к практике, предлагаю вам написать вместе со мной простенький чекер трек-кодов UPS. Не запускаем первым делом IDE, давайте вообще посмотрим с чем нам предстоит работать. Переходим по ссылке (привязана) и смотрим, что у нас происходит. Какая либо сторонняя защита на сайте отсутствует, а именно Cloudflare, это будем честны, очень сильно облегчает нам работу. Нам сразу же предлагают ввести трек-код, как это мило с их души, прямо подают нам всё на золотом блюдечке, не так ли?
Спойлер: Скриншот главной страницы
1702558399088.png


Писать всё это дело мы будем на запросах. Давайте откроем инструменты разработчика и выберем там Network либо же сеть на русском. Требуется включить сохранение журнала, чтобы в случае редиректа нас на другую страницу мы видели все запросы(без этого дела, данные будут пропадать).
Спойлер: Скриншот инструменты разработчика
1702558578715.png


Теперь нам предстоит посмотреть, что же такого происходит если мы хотим узнать данные о нашей посылке. Заполняем поле треком и нажимаем трек, думаю тут ничего сложного..- Бум, по нажатию кнопки, у нас сразу происходит куча всяких действий и прочей лабуды, но нам то нужен только один единственный запрос, который расскажет нам всё о нашей посылочке.
Спойлер: Запись действий
1702558861505.png


Теперь нам стоит найти нужный нам запрос, вы скажете так много спама и прочего мусора, как искать то? Стоит знать и помнить, что запросы, когда мы отправляем данные на сервер - это POST запрос, а когда мы просто хотим получить данные c cервера- это GET запрос. Компании не идиоты(наверное), и не будут называть все скрипты как я, зачастую это выглядит будто я уронил стакан на клавиатуру. Нам нужен запрос, который отвечает за статус нашей посылки, чисто логически можем понять, что и название запроса должно содержать в себе Status, но как мы видим на скриншоте выше в спойлере, то у нас два действия в записи, которые содержат в себе Status, но чуть правее мы видим ответ 204(успешный запрос, но без ответа) и что это такое, нет, нам не нужен запрос, который вернул пустые данные. Смотрим еще чуть ниже и видим второй, и видим 200 ответ, то есть ответ есть, и это POST запрос на https://webapis.ups.com/track/api/Track/GetStatus?loc=en_CA ; Бамц, вот мы и нашли наш запрос, теперь ознакомимся с Header's
Спойлер: Хедеры запроса
1702559469304.png


Куча циферок и неких данных, но не стоит пугаться этим набором символов, нас должен пугать лишь X-Xsrf-Token и где его доставать. Второе - это как выглядит тело запроса
Спойлер: Тело запроса
1702559581358.png


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

Как писать код, раз мы решили делать все через запросы, то мы можем использовать стандартную библиотеку requests или же asyncio-http (для асинхронной работы), я буду использовать requests. Давайте для начала создадим код, который будет отправлять запрос, а мы будем получать данные пришла посылка или нет. Не стоит нам забывать и про XSRF-TOKEN, про который я говорил ранее, где же нам его получать? Нам стоить проверить cookie-файлы нашей сессии на сайте UPS.
Спойлер: Куки
1702559857482.png


Такие данные могут храниться как в куках сайта, так и в самом html-коде сайта(microsoft отличный тому пример). Теперь нам остается получить этот самый X-XSRF-TOKEN и отправить запрос, мы думаем..- Но, не так уж всё и легко просто, вспоминаем так же про наличие cookies в Хедере нашего запроса, то есть мы вынуждены делать это всё в некой сессии, где будут сохраняться наши кукисы. Это не проблема, requests имеет возможность создавать сессию. Всё! Теперь точно всё, мы изучили сайт и понимаем что нам и откуда доставать и как, переходим к написанию кода.

Я приложу сразу весь рабочий код, и приложу в нём комментарии, проведем некое такое объяснение кода.

Спойлер: код
Python: Скопировать в буфер обмена
Код:
import requests # Импортирование нужных нам библиотек, requests - для работы с запросами, json - для работы с json-словарями
import json

url = "https://webapis.ups.com/track/api/Track/GetStatus?loc=en_US" # Задаем линк куда мы будем слать запрос

with open("track_code.txt", "r") as file: # Открываем все наши трек-коды из текстового документа track_code.txt в виде массива
    tracking_numbers = [line.strip() for line in file]

session = requests.Session() # Создаем сессию, в которой будут сохраняться кукисы и остальные данные

headers = {
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    } # Хедеры для андетекта, что мы простой юзер сети интернета
  
initial_response = session.get('https://www.ups.com/track', headers=headers) # Гет запрос, получаем данные с этой страницы с целью получения кукисов
x = initial_response.cookies.get_dict() # Сохраняем кукисы в виде словарика ключ-значение
token = x['X-XSRF-TOKEN-ST'] # Получаем нужный нам XSRF токен

for tracking_number in tracking_numbers: # перебор всех трек-кодов из текстового документа, который мы загрузили в виде массива
    payload = json.dumps({
        "Locale": "en_US",
        "TrackingNumber": [tracking_number]
    }) # Грузим нашу дату, чтобы сайт понимал какой трек мы проверяем
    headersfortrack = {
        'authority': 'webapis.ups.com',
        'method': 'POST',
        'path': '/track/api/Track/GetStatus?loc=en_US',
        'scheme': 'https',
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'ru,en;q=0.9',
        'Cache-Control': 'no-cache',
        'Content-Length': '107',
        'Content-Type': 'application/json',
        'Origin': 'https://www.ups.com',
        'Pragma': 'no-cache',
        'Sec-Ch-Ua': '"Chromium";v="116", "Not)A;Brand";v="24", "YaBrowser";v="23"',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Ch-Ua-Platform': '"Windows"',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.686 YaBrowser/23.9.5.686 Yowser/2.5 Safari/537.36',
        'X-Xsrf-Token': f'{token}'
    } #Заполняем хедеры, cookies сами подтянутся при запросе, XSRF токен так же не забываем указать


    try: # Блок try-except с целью ловить ошибки, и если на 1 треке случилась ошибка, то он не прекращал работу
        response = session.post(url, headers=headersfortrack, data=payload) # делаем пост запрос на апи сайта, указываем наши хедеры через headers = *, и аналогично data
        response_json = json.loads(response.text) # грузим ответ от апи в виде json
        package_status = response_json.get("trackDetails", [])[0].get("packageStatus", "") # получаем статус нашей посылки
        file_name = f"{package_status.replace(' ', '_')}.txt" # задаем имя текстовому документу в котором сохраняем результаты посылок

        with open(file_name, "a") as status_file: # открываем тхт документ, стоит 'a' с целью чтобы он добавлял текстовые данные, сам документ создастся сам
            status_file.write(tracking_number + "\n") # записываем наши данные

    except Exception as e: # в случае любой ошибки Exception(отвечает за именно любую ошибку) выводим её
        print("Ошибка:", e)

Код на этом заканчивается, можно по желанию прикрутить мультипоток, использование прокси. По окончанию работы сохранился текстовый документ Delivered.txt
Спойлер: Результат
1702560731398.png


Внутри нашего документа лежат треки, которые были доставлены.

Спасибо всем прочитавшим эту статью, но я не пока еще не особо понял что интересно контингенту сия форума. Пишите ваши пожелания на следующие статьи, и вопросы.
 
Сверху Снизу