Создание бесплатного API для генерации изображений, используя перехваченные запросы Flux

 # Inspecting and Replaying HTTP Requests: Создание Flux API на Python

https://wlux.net/threads/30663/
HTTP-запросы — это основной способ взаимодействия нашего кода с внешними сервисами. Однако для эффективного использования этих запросов нам нужно уметь их отслеживать и повторять. Сегодня мы подробно разберём, как это делать, используя Flux API для бесплатной генерации фотографий. Рассмотрим каждый шаг на примере Python и Flux Schnell API.
## Подготовка окружения
### 1. Установка необходимых библиотек
Прежде чем начать, убедитесь, что у вас установлены все необходимые библиотеки. В нашем случае мы будем использовать `requests` для отправки HTTP-запросов.

Python:

pip install requests

### 2. Обзор Flux API
Flux API позволяет генерировать изображения, используя различные модели. В нашем примере мы будем использовать Flux-Schnell (Free), которая предоставляет бесплатный доступ к генерации фотографий.
### 3. Настройка инструментов разработчика
Для начала, откроем инструменты разработчика в вашем браузере. Нажмите `F12` или `Ctrl+Shift+I` (в зависимости от вашего браузера) и перейдите на вкладку «Сеть» (Network).
####  — Выбор модели Flux-Schnell
На этом этапе выбираем модель Flux-Schnell (Free), так как именно её мы будем использовать для генерации фотографий.
### 4. Отправка запроса на генерацию фотографии
####  — Введение данных и создание запроса
Вводим необходимые данные и нажимаем кнопку «Create (Free)». Внимательно следим за вкладкой «Сеть» в инструментах разработчика. Обычно ожидание занимает около 100 секунд.
####  — Поиск запроса flux-schnell
Ищем запрос с именем flux-schnell и нажимаем на него правой кнопкой мыши.
####  — Копирование запроса
Выбираем опцию «Copy» и затем «Copy as fetch». Это позволит нам получить все необходимые данные для повторения запроса.
## Разбор fetch запроса на Python
### 5. Подготовка запроса на Python
Теперь, когда у нас есть данные из fetch, мы можем преобразовать их в запрос на Python, используя библиотеку `requests`.
#### Fetch запрос

Код:

fetch("[URL]https://flux1ai.com/api/flux-schnell[/URL]", {
  "headers": {
    "accept": "*/*",
    "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5",
    "content-type": "text/plain;charset=UTF-8",
    "priority": "u=1, i",
    "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin"
  },
  "referrer": "[URL='https://flux1ai.com/ru/create']FLUX.1: Frontier AI Image Generator Model | FLUX.1 AI[/URL]",
  "referrerPolicy": "strict-origin-when-cross-origin",
  "body": "{\"inputs\":\"cat\",\"selectedSize\":\"1:1\",\"parameters\":{\"width\":1024,\"height\":1024},\"used_credits\":0}",
  "method": "POST",
  "mode": "cors",
  "credentials": "include"
});

### 6. Конвертация запроса в Python
Разделим этот шаг на более мелкие части и детально рассмотрим, как правильно записать текст в `headers`, `cookies` и `body`.
#### 6.1 Подготовка headers
В JavaScript-версии fetch-запроса заголовки передаются в объекте `headers`. В Python мы будем использовать словарь (dictionary).

Python:

headers = {
    "accept": "*/*",
    "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5",
    "content-type": "text/plain;charset=UTF-8",
    "priority": "u=1, i",
    "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin"
}

Каждую пару ключ-значение из fetch запроса мы переносим в соответствующий элемент словаря в Python. Обратите внимание на кавычки вокруг значений.
#### 6.2 Подготовка cookies
Cookies в fetch запросе передаются как часть заголовков. В Python мы можем добавить их к headers, но лучше использовать специальное поле для cookies в библиотеке requests.

Python:

cookies = {
    "NEXT_LOCALE": "ru",
    "ga": "GA1.1.1530375957.1727826042",
    "gcl_au": "1.1.1613491977.1727826042",
    "ga81XG3D4KH0": "GS1.1.1728290643.9.1.1728290647.0.0.0",
    "ga7FF4XEBKV2": "GS1.1.1728290643.9.1.1728290647.0.0.0",
    "Host-next-auth.csrf-token": "7bada9e3afe4fc325123e16417e4e236a531a523a0d1de135e1dc0d0eb204281%7Cbf531b412a5cadb530cd504015052f4096d5d790dd84ddba4f22bcbe1c3140ae",
    "Secure-next-auth.callback-url": "https%3A%2F%2Fflux1ai.com%2Fru%2Fcreate",
    "__Secure-next-auth.session-token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..DBig_LtsyHkY-B8K.rTCizFUCCYtJnj-wl3d7nm7idFMOqvbWwHTioYe5exbjyQINboXGwMTyswVrEJCsM-SIdhNDTsoyM4PX-iPFYpiRYhC-1fOl1DGbwmsxJ0q01ltVZ9GZsdrNhzO0JykoIw-6BKovZZ631_oM8RGxNtTdBcprp2vuVnVCK4RZPmA3FOCTyYMstAoRMr2yGVfaDrBxgog6c7kCoa5-ApSBWwHDZbOjr8ZJKJGWy5Eqqj0fZABApOKk1TxHYBI1PL9fqHxmWvr173okfiAT6HvDkqAK1z4BMWmhtmho8l61RKq10QbPV3z9bKgNki537j0c1k8o09Hobnigk7C2XfJaoLnqVoAT54TtZg.YLPwgIbO59SXx0-HL1b-LQ"
}

Куки передаются в формате ключ-значение, каждая пара на отдельной строке.
#### 6.3 Подготовка body
Тело запроса (body) в fetch запросе передаётся как строка, которая содержит JSON. В Python мы можем использовать словарь и передавать его как JSON.

Python:

body = {
    "inputs": "cat",
    "selectedSize": "1:1",
    "parameters": {
        "width": 1024,
        "height": 1024
    },
    "used_credits": 0
}

Тело запроса нужно оформить в формате словаря, а библиотека requests автоматически преобразует его в JSON при отправке запроса.
#### 6.4 Отправка запроса
Теперь, когда у нас есть все компоненты запроса, мы можем собрать их и отправить запрос с помощью requests.

Python:

import requests
url = "https://flux1ai.com/api/flux-schnell"
response = requests.post(url, headers=headers, json=body, cookies=cookies)
print(response.json())

Этот код отправляет POST-запрос на сервер Flux API с нужными заголовками, куки и телом запроса.
### 7. Создание FastAPI с автодокументацией
Создадим простое API с использованием FastAPI, чтобы генерировать фотографии через Flux API. Разделим этот процесс на более мелкие шаги.
#### 7.1 Установка FastAPI и Uvicorn
Для начала установим необходимые библиотеки. FastAPI используется для создания API, а Uvicorn — для запуска сервера.

Код:

pip install fastapi uvicorn

#### 7.2 Создание файла приложения
Создадим файл `main.py` и начнём добавлять код шаг за шагом.
#### 7.3 Импорт необходимых модулей
В начале файла импортируем необходимые модули. FastAPI используется для создания приложения, HTTPException — для обработки ошибок, BaseModel — для создания схемы данных, requests — для отправки HTTP-запросов, а base64 — для декодирования изображения.

Python:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
import base64

#### 7.4 Создание FastAPI приложения
Создадим экземпляр приложения FastAPI.

Python:

app = FastAPI()

`app = FastAPI()` создаёт экземпляр приложения, которое будет обрабатывать HTTP-запросы.
#### 7.5 Определение схемы данных
Создадим класс, который будет представлять схему данных для запроса. Этот класс используется для валидации входных данных.

Python:

class ImageRequest(BaseModel):
    inputs: str
    selectedSize: str
    width: int
    height: int

Класс `ImageRequest` наследуется от `BaseModel` и определяет структуру входных данных. Здесь мы указываем, что запрос должен содержать четыре поля: `inputs`, `selectedSize`, `width` и `height`.
#### 7.6 Создание обработчика POST-запроса
Создадим обработчик для POST-запросов. Этот обработчик будет вызываться, когда клиент отправляет POST-запрос на URL `/generate_image`.

Python:

@app.post("/generate_image")
def generate_image(request: ImageRequest):

`@app.post(«/generate_image»)` — это декоратор, который указывает, что функция `generate_image` должна обрабатывать POST-запросы на URL `/generate_image`. Функция `generate_image` принимает один аргумент `request`, который автоматически заполняется данными из тела запроса.
#### 7.7 Определение URL и headers
Укажем URL, на который будет отправляться запрос, и заголовки запроса.

Python:

    url = "https://flux1ai.com/api/flux-schnell"
    headers = {
        "accept": "*/*",
        "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5",
        "content-type": "text/plain;charset=UTF-8",
        "priority": "u=1, i",
        "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin"
    }

Переменная `url` содержит адрес API, а переменная `headers` — словарь с заголовками HTTP-запроса.
#### 7.8 Определение cookies
Укажем куки, которые будут отправляться вместе с запросом.

Python:

    cookies = {
        "NEXT_LOCALE": "ru",
        "ga": "GA1.1.1530375957.1727826042",
        "gcl_au": "1.1.1613491977.1727826042",
        "ga81XG3D4KH0": "GS1.1.1728290643.9.1.1728290647.0.0.0",
        "ga7FF4XEBKV2": "GS1.1.1728290643.9.1.1728290647.0.0.0",
        "Host-next-auth.csrf-token": "7bada9e3afe4fc325123e16417e4e236a531a523a0d1de135e1dc0d0eb204281%7Cbf531b412a5cadb530cd504015052f4096d5d790dd84ddba4f22bcbe1c3140ae",
        "Secure-next-auth.callback-url": "https%3A%2F%2Fflux1ai.com%2Fru%2Fcreate",
        "__Secure-next-auth.session-token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..DBig_LtsyHkY-B8K.rTCizFUCCYtJnj-wl3d7nm7idFMOqvbWwHTioYe5exbjyQINboXGwMTyswVrEJCsM-SIdhNDTsoyM4PX-iPFYpiRYhC-1fOl1DGbwmsxJ0q01ltVZ9GZsdrNhzO0JykoIw-6BKovZZ631_oM8RGxNtTdBcprp2vuVnVCK4RZPmA3FOCTyYMstAoRMr2yGVfaDrBxgog6c7kCoa5-ApSBWwHDZbOjr8ZJKJGWy5Eqqj0fZABApOKk1TxHYBI1PL9fqHxmWvr173okfiAT6HvDkqAK1z4BMWmhtmho8l61RKq10QbPV3z9bKgNki537j0c1k8o09Hobnigk7C2XfJaoLnqVoAT54TtZg.YLPwgIbO59SXx0-HL1b-LQ"
    }

Переменная `cookies` содержит словарь с куки, которые будут отправляться вместе с запросом.
#### 7.9 Определение тела запроса
Определим тело запроса, которое будет отправляться в формате JSON.

Python:

    body = {
        "inputs": request.inputs,
        "selectedSize": request.selectedSize,
        "parameters": {
            "width": request.width,
            "height": request.height
        },
        "used_credits": 0
    }

Переменная `body` содержит словарь с параметрами запроса, которые были переданы в запросе клиента.
#### 7.10 Отправка запроса и обработка ответа
Отправим запрос на сервер Flux API и обработаем ответ.

Python:

    response = requests.post(url, headers=headers, json=body, cookies=cookies)
    if response.status_code != 200:
        raise HTTPException(status_code=response.status_code, detail="Error from Flux API")
    data = response.json()
    image_data = data.get("imageBase64")
    if not image_data:
        raise HTTPException(status_code=500, detail="Invalid response from Flux API")
    return {"image": image_data}

Отправляем POST-запрос с указанным URL, заголовками, телом запроса и куки. Если сервер вернул ошибку, возбуждаем исключение HTTPException с соответствующим статусом и сообщением. Если запрос успешен, извлекаем и возвращаем данные изображения.
#### 7.11 Запуск FastAPI приложения
Чтобы запустить FastAPI приложение, используем Uvicorn. Добавим в конец файла команду для запуска сервера.

Python:

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Эта команда запускает Uvicorn сервер на порту 8000 и позволяет нашему приложению обрабатывать запросы.
#### 7.12 Проверка автодокументации
FastAPI автоматически создаёт документацию для API. Чтобы увидеть её, запустите сервер и перейдите по адресу:

Код:

http://localhost:8000/docs

Вы увидите интерфейс Swagger UI, где сможете тестировать своё API и видеть подробную информацию о всех эндпоинтах.
### Итоги и Заключение
Теперь, когда мы подробно разобрали процесс создания и воспроизведения HTTP-запросов с помощью Flux API, а также создания собственного API с использованием FastAPI, у нас есть полный пример кода, который можно использовать в своих проектах. Мы узнали, как инспектировать HTTP-запросы, правильно записывать заголовки, куки и тело запроса, а также как создать простое и эффективное API с автодокументацией.
Используя эти знания, вы сможете не только генерировать изображения с помощью Flux API, но и разрабатывать свои собственные API и сервисы. В следующей статье мы покажем, как создать Telegram-бота на основе этого API, что откроет ещё больше возможностей для автоматизации и интеграции.
### Полный код обычного запроса на Flux API
Вот полный код для выполнения запроса к Flux API с использованием библиотеки `requests`:

Python:

import requests
url = "https://flux1ai.com/api/flux-schnell"
headers = {
    "accept": "*/*",
    "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5",
    "content-type": "text/plain;charset=UTF-8",
    "priority": "u=1, i",
    "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-origin"
}
cookies = {
    "NEXT_LOCALE": "ru",
    "ga": "GA1.1.1530375957.1727826042",
    "gcl_au": "1.1.1613491977.1727826042",
    "ga81XG3D4KH0": "GS1.1.1728290643.9.1.1728290647.0.0.0",
    "ga7FF4XEBKV2": "GS1.1.1728290643.9.1.1728290647.0.0.0",
    "Host-next-auth.csrf-token": "7bada9e3afe4fc325123e16417e4e236a531a523a0d1de135e1dc0d0eb204281%7Cbf531b412a5cadb530cd504015052f4096d5d790dd84ddba4f22bcbe1c3140ae",
    "Secure-next-auth.callback-url": "https%3A%2F%2Fflux1ai.com%2Fru%2Fcreate",
    "__Secure-next-auth.session-token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..DBig_LtsyHkY-B8K.rTCizFUCCYtJnj-wl3d7nm7idFMOqvbWwHTioYe5exbjyQINboXGwMTyswVrEJCsM-SIdhNDTsoyM4PX-iPFYpiRYhC-1fOl1DGbwmsxJ0q01ltVZ9GZsdrNhzO0JykoIw-6BKovZZ631_oM8RGxNtTdBcprp2vuVnVCK4RZPmA3FOCTyYMstAoRMr2yGVfaDrBxgog6c7kCoa5-ApSBWwHDZbOjr8ZJKJGWy5Eqqj0fZABApOKk1TxHYBI1PL9fqHxmWvr173okfiAT6HvDkqAK1z4BMWmhtmho8l61RKq10QbPV3z9bKgNki537j0c1k8o09Hobnigk7C2XfJaoLnqVoAT54TtZg.YLPwgIbO59SXx0-HL1b-LQ"
}
body = {
    "inputs": "cat",
    "selectedSize": "1:1",
    "parameters": {
        "width": 1024,
        "height": 1024
    },
    "used_credits": 0
}
response = requests.post(url, headers=headers, json=body, cookies=cookies)
if response.status_code == 200:
    data = response.json()
    image_base64 = data.get("imageBase64")
    if image_base64:
        print("Image generated successfully!")
    else:
        print("Failed to retrieve image.")
else:
    print("Error:", response.status_code)

### Полный код FastAPI приложения
А теперь представим полный код нашего FastAPI приложения:

Python:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
import base64
app = FastAPI()
class ImageRequest(BaseModel):
    inputs: str
    selectedSize: str
    width: int
    height: int
@app.post("/generate_image")
def generate_image(request: ImageRequest):
    url = "https://flux1ai.com/api/flux-schnell"
    headers = {
        "accept": "*/*",
        "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5",
        "content-type": "text/plain;charset=UTF-8",
        "priority": "u=1, i",
        "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin"
    }
    cookies = {
        "NEXT_LOCALE": "ru",
        "ga": "GA1.1.1530375957.1727826042",
        "gcl_au": "1.1.1613491977.1727826042",
        "ga81XG3D4KH0": "GS1.1.1728290643.9.1.1728290647.0.0.0",
        "ga7FF4XEBKV2": "GS1.1.1728290643.9.1.1728290647.0.0.0",
        "Host-next-auth.csrf-token": "7bada9e3afe4fc325123e16417e4e236a531a523a0d1de135e1dc0d0eb204281%7Cbf531b412a5cadb530cd504015052f4096d5d790dd84ddba4f22bcbe1c3140ae",
        "Secure-next-auth.callback-url": "https%3A%2F%2Fflux1ai.com%2Fru%2Fcreate",
        "__Secure-next-auth.session-token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..DBig_LtsyHkY-B8K.rTCizFUCCYtJnj-wl3d7nm7idFMOqvbWwHTioYe5exbjyQINboXGwMTyswVrEJCsM-SIdhNDTsoyM4PX-iPFYpiRYhC-1fOl1DGbwmsxJ0q01ltVZ9GZsdrNhzO0JykoIw-6BKovZZ631_oM8RGxNtTdBcprp2vuVnVCK4RZPmA3FOCTyYMstAoRMr2yGVfaDrBxgog6c7kCoa5-ApSBWwHDZbOjr8ZJKJGWy5Eqqj0fZABApOKk1TxHYBI1PL9fqHxmWvr173okfiAT6HvDkqAK1z4BMWmhtmho8l61RKq10QbPV3z9bKgNki537j0c1k8o09Hobnigk7C2XfJaoLnqVoAT54TtZg.YLPwgIbO59SXx0-HL1b-LQ"
    }
    body = {
        "inputs": request.inputs,
        "selectedSize": request.selectedSize,
        "parameters": {
            "width": request.width,
            "height": request.height
        },
        "used_credits": 0
    }
    response = requests.post(url, headers=headers, json=body, cookies=cookies)
    if response.status_code != 200:
        raise HTTPException(status_code=response.status_code, detail="Error from Flux API")
    data = response.json()
    image_data = data.get("imageBase64")
    if not image_data:
        raise HTTPException(status_code=500, detail="Invalid response from Flux API")
    return {"image": image_data}
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

### Заключение
В этой статье мы узнали, как создать API с использованием FastAPI, которое отправляет запросы на Flux API для генерации изображений. Мы разобрали все ключевые моменты, такие как создание схемы данных, обработка запросов и автоматическая документация, и теперь у нас есть функциональный сервер, который может принимать запросы и возвращать изображения.
В следующей статье мы покажем, как использовать это API для создания Telegram-бота, который будет генерировать изображения и взаимодействовать с пользователями через мессенджер.
Спасибо за внимание и до встречи в следующей статье!
### Полезные ссылки:
— FastAPI Documentation
— Flux Schnell API
— Uvicorn Documentation