magnit_api/README.md
2026-03-09 11:26:53 +03:00

145 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Magnit price API
Локальный HTTP API и CLI для `magnit.ru`, который:
- принимает `store_code` и `query`;
- ищет товары через backend `POST /webgate/v2/goods/search`;
- сам обновляет `access token` через `POST /magnit-id/v1/auth/token/refresh`;
- хранит рабочую сессию в `magnit_session.json`.
## Быстрый старт
Запуск API:
```bash
python3 magnit_api.py serve --host 127.0.0.1 --port 8080
```
## Docker Compose
Сборка и запуск:
```bash
cp .env.example .env
docker compose up -d --build
```
По умолчанию сервис публикуется только в loopback на `127.0.0.1:18080`.
Docker хранит session-файл в `./data/magnit_session.json`, а не в корне проекта.
Проверка:
```bash
curl "http://127.0.0.1:18080/health"
curl "http://127.0.0.1:18080/price?store_code=618224&query=Red%20Bull"
```
Если нужен другой внешний порт:
```bash
MAGNIT_API_PORT=18081 docker compose up -d --build
```
Проверка:
```bash
curl "http://127.0.0.1:18081/price?store_code=618224&query=Red%20Bull"
```
CLI без HTTP-сервера:
```bash
python3 magnit_api.py price --store-code 618224 --query "Red Bull"
python3 magnit_api.py search --store-code 618224 --query "Red Bull"
```
## Endpoint'ы
`GET /health`
`GET /session`
`POST /session/refresh`
`POST /session/bootstrap`
```json
{
"mg_at": "%7B%22access%22%3A%22...%22%2C%22refresh%22%3A%22...%22%7D",
"device_id": "761fa244-97f7-4b6e-b93a-8c258f357580",
"device_tag": "8894ea27-7a01-42f0-8500-20eb63bbc7c9_1"
}
```
`GET /search?store_code=618224&query=Red%20Bull`
`GET /price?store_code=618224&query=Red%20Bull`
## Nginx proxy_pass
Готовый пример лежит в `nginx/magnit-api.location.conf.example`.
Если `nginx` стоит на хосте и `docker compose` публикует API на `127.0.0.1:18080`, используйте:
```nginx
location /magnit-api/ {
proxy_pass http://127.0.0.1:18080/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}
```
Тогда внешний запрос будет таким:
```bash
curl "https://your-domain.example/magnit-api/price?store_code=618224&query=Red%20Bull"
```
Если `nginx` контейнерный и находится в одной сети с `magnit-api`, замените upstream на `http://magnit-api:8080/`.
## Что хранится в сессии
`magnit_session.json` содержит:
- `refresh_token`
- `access_token`
- `device_id` (`mg_udi`)
- `device_tag` (`mg_ksid`)
- служебные заголовки браузера
Скрипт сам обновляет `access_token`, когда JWT подходит к истечению.
## Как перебутстрапить сессию
Если `refresh_token` станет невалидным, откройте `magnit.ru`, где вы уже авторизованы, и в DevTools Console выполните:
```js
copy(JSON.stringify({
mg_at: decodeURIComponent(document.cookie.split('; ').find(v => v.startsWith('mg_at=')).split('=').slice(1).join('=')),
device_id: document.cookie.split('; ').find(v => v.startsWith('mg_udi=')).split('=').slice(1).join('='),
device_tag: document.cookie.split('; ').find(v => v.startsWith('mg_ksid=')).split('=').slice(1).join('=')
}, null, 2));
```
Потом отправьте это в локальный API:
```bash
curl -X POST "http://127.0.0.1:8080/session/bootstrap" \
-H "Content-Type: application/json" \
-d @payload.json
```
Если API запущен через `docker compose`, используйте опубликованный порт, по умолчанию `18080`:
```bash
curl -X POST "http://127.0.0.1:18080/session/bootstrap" \
-H "Content-Type: application/json" \
-d @payload.json
```
При Docker session сохранится в `./data/magnit_session.json`.