Гайд на тему: Как с помощью POST запроса произвести выгрузку изображения на веб-ресурсы.



  • Для примера будем использовать файлообменник: https://dropfiles.ru/#

    Так происходит загрузка изображения средствами браузера:

    alt text

    Проанализировав запросы, можем понять, что происходит POST запрос:

    отправляемые данные.png

    Казалось бы все просто, формируем схожий запрос и победа, но не тут то было.
    Есть загвоздка, мы не видим каким образом передается изображение.
    Сначала посмотрим, что передается:

    ------WebKitFormBoundary7b3QaHozwsO6SsYd
    Content-Disposition: form-data; name="u_key"
    
    b06403b386cc08fbc84dca91e6faec65
    ------WebKitFormBoundary7b3QaHozwsO6SsYd
    Content-Disposition: form-data; name="files[]"; filename="Заставка.jpg"
    Content-Type: image/jpeg
    
    
    ------WebKitFormBoundary7b3QaHozwsO6SsYd--
    

    Первый параметр понятен:

    ------WebKitFormBoundary7b3QaHozwsO6SsYd
    Content-Disposition: form-data; name="u_key"
    
    b06403b386cc08fbc84dca91e6faec65
    

    Это ключ, который висит на инпуте, его можем спарсить, кинув обычный GET к сайту:

    GET первый.png

    Вытягиваем его с ответа регуляркой, либо же xpath`ом, кому как удобней:

    GET первый.png

    С этим разобрались, сразу расскажу о непонятном значении WebKit:

    WebKitFormBoundary7b3QaHozwsO6SsYd
    

    Здесь всё просто, статическая часть:

    WebKitFormBoundary
    

    И 16 рандомных символов (Верхнего, нижнего регистра англ букв + цифры от 0 до 9)
    Так сконкатенировав две строки: WebKitFormBoundary + 16 символов, у нас выйдет уникальный параметр, что и требуется для запроса.

    Приступим к тому, с чем я столкнулся и пол дня просидел, решав. А именно эта часть кода:

    ------WebKitFormBoundary7b3QaHozwsO6SsYd
    Content-Disposition: form-data; name="files[]"; filename="Заставка.jpg"
    Content-Type: image/jpeg
    
    ------WebKitFormBoundary7b3QaHozwsO6SsYd--
    

    Фишка в том, что по сути запрос +- так и выглядит, но не отображается 1 параметр, а это само изображение. Сразу к тому, как и в каком виде его туда всунуть:

    Нужно указать формат изображение base64 и через двоеточие, без пробелов, указать переменную, в которой находится переменная содержится сама картинка (При чтении изображения, не забыть поставить галку на "Сохранить в формате base64":

    GET первый.png

    PS: В дальнейшем у меня будет путь прописан в переменной, что не запутались.

    Далее переходим к формированию самого POST запроса:

    1. Указываем URL: https://dropfiles.ru/jqu/ (Именно сюда отсылается изображение, это мы увидели с браузера, где просматривали параметры запроса)
    2. Заголовок. Я его полностью скопировал, за исключением строки:
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundary[[WEB_KIT]]
    

    Здесь как видно, я заменил значение WebKit сгенерированным выше. Остальное оставил без изменений. Скорее всего больше 80% параметров вообще можно убрать, на работу не повлияет.
    Кстати не забываем про параметр "Content-Length", длина передаваемого значения, частенько из-за него появляются ошибки в запросах.

    GET первый.png

    Далее перейдем к самому телу запроса:

    GET первый.png

    ------WebKitFormBoundary[[WEB_KIT]]
    Content-Disposition: form-data; name="u_key"
    
    [[U_KEY]]
    ------WebKitFormBoundary[[WEB_KIT]]
    Content-Disposition: form-data; name="files[]"; filename="sss.png"
    Content-Type: image/png
    
    base64:[[VARIABLE_WITH_BASE64_ENCODING]]
    
    ------WebKitFormBoundary[[WEB_KIT]]--
    

    Видно, что везде заменен WebKit
    Указан спарщенный ключ [[U_KEY]]
    И в отличие от оригинала, который был в браузере, появилась ещё одна строка:

    base64:[[VARIABLE_WITH_BASE64_ENCODING]]
    

    Как уже было сказано, в переменной [[VARIABLE_WITH_BASE64_ENCODING]] содержится изображение в base64.

    Таким образом тело запроса сформировано, но осталось разобраться с Content-Type (Типом содержимого этого тела).

    Из стандартных вариантов мы имеем:

    application/x-www-form-urlencoded
    multipart/form-data
    application/json
    

    По сути 2 параметр нам подходит, но он не полон и работать с ним скрипт у нас не будет.
    Дописываем его и получаем:

    multipart/form-data; boundary=----WebKitFormBoundary[[WEB_KIT]]
    

    Выглядит это так:

    GET первый.png

    Все, запрос у нас сформирован, Запускаем скрипт и наблюдаем, что изображение на сервис загружено:

    alt text

    Вот ответ который мы получили:

    {
      "files": [
        {
          "name": "c11d1fc54d0eb18b6102316b8ebe6991.jpeg",
          "size": 4463808,
          "type": "image/jpeg",
          "niceSize": "4.26 MB",
          "realName": "Заставка.jpg",
          "fileKey": "bde6488feb97671a1b653d634ff75861",
          "delFileKey": "27aeb3be164f818574c20f8408fb555c",
          "delete_url": "https://dropfiles.ru/jqu/?file=c11d1fc54d0eb18b6102316b8ebe6991.jpeg",
          "delete_type": "DELETE"
        }
      ]
    }
    

    Этим можно было бы закончить гайд, но я добью парой строк именно для этого сервиса.
    Путём проверок и сверки строк выяснил, что параметр "fileKey" отвечает за ссылку на изображение.
    Сама форма ссылки:

    https://dropfiles.ru/download/[[FileKey]].html
    

    По итогу генерим строку и выходит рабочий URL:
    https://dropfiles.ru/download/bde6488feb97671a1b653d634ff75861.html

    Так же можем кинуть GET запрос и спарсить ссылку уже на само изображение, будет она такого типа:

    /files/718bef28580ca04ce2f37a4afe84ccfc.jpeg
    

    Так же собираем полную ссылку:
    https://dropfiles.ru/files/718bef28580ca04ce2f37a4afe84ccfc.jpeg

    Ну и чекать нужно, бывает, что с 1 запроса перекидывает на сайт (якобы мы его посетили), а уже по 2 запросу по этой же ссылке скачивается изображение. Но не суть.

    Таким образом мы разобрались как отправлять по POST запросу изображение по средствам BAS.
    Удачи тебе в написании будущих проектов)
    Скрипт: Пример скрипта.xml```
    code_text



  • @Empire-Cash-Bot said in Гайд на тему: Как с помощью POST запроса произвести выгрузку изображения на веб-ресурсы.:

    base64:[[VARIABLE_WITH_BASE64_ENCODING]]

    а как ты вообще разобрался что нужно подставить ниже base64:[[VARIABLE_WITH_BASE64_ENCODING]] и Content-Type дописать? просто методым тыка? в сниффе запроса ведь этого нет. Ещё я урок на ютубе смотрел, там в столбик вот этот Content-Despositon не передаёют, а через конструктор данных запроса параметры вставляют, но я ещё сам плохо в запросах разберуюсь вообще не найду норм инфу по ним



  • @Zack9 часть с браузера анализатора взял, другую определил так: В старой версии BAS записал запросы, оттуда и понял как именно происходит специфическое составление запроса именно в самом басе. В совокупности и получилось нащупать рабочий метод.


Log in to reply