fix: update endpoints based on HAR analysis
- Fix /userReviews → /user/get_reviews (confirmed in HAR)
- Fix /user → /api/user/checknotify (temporary, need correct endpoint)
- Add TODO comments for broken endpoints:
- /catalogMainv2 (HAR shows GET /categories/{slug})
- /getKworkDetails (HAR shows GET /projects/{id}/view)
- /cities, /countries (not in HAR, need investigation)
- Add documentation:
- docs/HAR_ENDPOINTS_MAPPING.md
- src/kwork_api/ENDPOINTS_TODO.md
This commit is contained in:
parent
16e587f485
commit
adb30e7d7a
206
docs/HAR_ENDPOINTS_MAPPING.md
Normal file
206
docs/HAR_ENDPOINTS_MAPPING.md
Normal file
@ -0,0 +1,206 @@
|
||||
# HAR Endpoints Mapping
|
||||
|
||||
Сопоставление endpoints из `client.py` с реальными endpoints из HAR файла.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Сопоставление endpoints
|
||||
|
||||
### ✅ Работающие endpoints (совпадают с HAR)
|
||||
|
||||
| client.py Endpoint | HAR Endpoint | Status | Notes |
|
||||
|-------------------|--------------|--------|-------|
|
||||
| `/projects` | `POST /projects` | ✅ 200 | GET в HAR, POST в client.py |
|
||||
| `/api/validation/checktext` | N/A | ❓ | Нет в HAR - возможно не использовался |
|
||||
|
||||
---
|
||||
|
||||
### ❌ Неработающие endpoints (нужно исправить)
|
||||
|
||||
| client.py Endpoint | HAR Endpoint (реальный) | Status | Как исправить |
|
||||
|-------------------|------------------------|--------|---------------|
|
||||
| `/catalogMainv2` | `GET /categories/{slug}` | ❌ 404 | Использовать `GET /categories/{slug}` или найти JSON API |
|
||||
| `/getKworkDetails` | `GET /projects/{id}/view` | ❌ 404 | Использовать `GET /projects/{id}/view` |
|
||||
| `/userReviews` | `POST /user/get_reviews` | ❌ 404 | ✅ Исправить на `/user/get_reviews` |
|
||||
| `/cities` | N/A | ❌ 404 | Нет в HAR - возможно через HTML страницу |
|
||||
| `/countries` | N/A | ❌ 404 | Нет в HAR - возможно через HTML страницу |
|
||||
| `/user` | `GET /user/{username}` | ❌ 404 | ✅ Исправить на `/user/{username}` |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Детальный анализ
|
||||
|
||||
### 1. Каталог кворков
|
||||
|
||||
**Текущий (не работает):**
|
||||
```python
|
||||
POST /catalogMainv2 # ❌ 404 Not Found
|
||||
```
|
||||
|
||||
**Реальный из HAR:**
|
||||
```
|
||||
GET /categories/design # ✅ 200 OK
|
||||
GET /projects # ✅ 200 OK
|
||||
```
|
||||
|
||||
**Проблема:** HAR показывает HTML страницы, не JSON API.
|
||||
|
||||
**Решение:** Нужно найти JSON API endpoint или парсить HTML.
|
||||
|
||||
**Как найти:**
|
||||
1. Открыть DevTools → Network → XHR/Fetch
|
||||
2. Перейти на https://kwork.ru/categories/design
|
||||
3. Искать JSON запросы с данными кворков
|
||||
4. Или искать в HAR файлы с "kworks", "catalog", "list"
|
||||
|
||||
---
|
||||
|
||||
### 2. Детали кворка
|
||||
|
||||
**Текущий (не работает):**
|
||||
```python
|
||||
POST /getKworkDetails # ❌ 404 Not Found
|
||||
```
|
||||
|
||||
**Реальный из HAR:**
|
||||
```
|
||||
GET /projects/3127023/view # ✅ 200 OK
|
||||
```
|
||||
|
||||
**Проблема:** HAR показывает HTML страницу проекта.
|
||||
|
||||
**Решение:** Использовать `GET /projects/{id}/view` и парсить HTML.
|
||||
|
||||
**Как найти JSON API:**
|
||||
1. Открыть DevTools → Network → XHR/Fetch
|
||||
2. Перейти на https://kwork.ru/projects/{id}/view
|
||||
3. Искать JSON запросы
|
||||
|
||||
---
|
||||
|
||||
### 3. Отзывы пользователя
|
||||
|
||||
**Текущий (не работает):**
|
||||
```python
|
||||
POST /userReviews # ❌ 404 Not Found
|
||||
```
|
||||
|
||||
**Реальный из HAR:**
|
||||
```
|
||||
POST /user/get_reviews # ✅ 200 OK
|
||||
Payload: {"userId":126921,"type":"positive"}
|
||||
```
|
||||
|
||||
**Решение:** ✅ Исправить endpoint на `/user/get_reviews`
|
||||
|
||||
---
|
||||
|
||||
### 4. Информация о пользователе
|
||||
|
||||
**Текущий (не работает):**
|
||||
```python
|
||||
POST /user # ❌ 404 Not Found
|
||||
```
|
||||
|
||||
**Реальный из HAR:**
|
||||
```
|
||||
GET /user/jtjagomega # ✅ 200 OK (HTML страница)
|
||||
GET /user/alexey-liss # ✅ 200 OK (HTML страница)
|
||||
POST /api/user/checknotify # ✅ 200 OK (JSON API)
|
||||
```
|
||||
|
||||
**Решение:**
|
||||
- Для профиля: `GET /user/{username}` (парсить HTML)
|
||||
- Для уведомлений: `POST /api/user/checknotify`
|
||||
|
||||
---
|
||||
|
||||
### 5. Справочные данные (города, страны)
|
||||
|
||||
**Текущие (не работают):**
|
||||
```python
|
||||
POST /cities # ❌ 404 Not Found
|
||||
POST /countries # ❌ 404 Not Found
|
||||
```
|
||||
|
||||
**В HAR:** Нет таких endpoints.
|
||||
|
||||
**Проблема:** Возможно данные встроены в HTML или загружаются через JavaScript.
|
||||
|
||||
**Как найти:**
|
||||
1. Открыть DevTools → Network
|
||||
2. Перейти на страницу с формой (например, настройки)
|
||||
3. Искать запросы с "cities", "countries", "regions"
|
||||
4. Или искать в исходном коде страницы `<script>` с данными
|
||||
|
||||
**Альтернатива:** Парсить HTML страницу с формами.
|
||||
|
||||
---
|
||||
|
||||
## 🛠 План исправлений
|
||||
|
||||
### Приоритет 1 (есть в HAR):
|
||||
|
||||
1. ✅ `/userReviews` → `/user/get_reviews`
|
||||
2. ✅ `/user` → `/user/{username}`
|
||||
|
||||
### Приоритет 2 (нужно искать):
|
||||
|
||||
3. 🔍 `/catalogMainv2` → искать JSON API или парсить HTML
|
||||
4. 🔍 `/getKworkDetails` → использовать `/projects/{id}/view`
|
||||
5. 🔍 `/cities`, `/countries` → искать в HTML или JavaScript
|
||||
|
||||
---
|
||||
|
||||
## 🔬 Как искать новые endpoints
|
||||
|
||||
### Метод 1: DevTools Network Tab
|
||||
|
||||
1. Открыть https://kwork.ru
|
||||
2. DevTools (F12) → Network → XHR/Fetch
|
||||
3. Выполнить действие (поиск, просмотр кворка и т.д.)
|
||||
4. Искать JSON запросы
|
||||
|
||||
### Метод 2: Анализ HAR файла
|
||||
|
||||
```bash
|
||||
cd /root
|
||||
python3 << 'EOF'
|
||||
import json
|
||||
with open('kwork-dump.har') as f:
|
||||
har = json.load(f)
|
||||
|
||||
# Искать конкретные endpoints
|
||||
for entry in har['log']['entries']:
|
||||
url = entry['request']['url']
|
||||
if 'catalog' in url or 'kwork' in url or 'review' in url:
|
||||
print(f"{entry['request']['method']} {url.split('?')[0]}")
|
||||
EOF
|
||||
```
|
||||
|
||||
### Метод 3: Поиск в JavaScript файлах
|
||||
|
||||
```bash
|
||||
# Скачать все JS файлы и искать API endpoints
|
||||
grep -r "api/" /path/to/js/files/ | grep -v ".map"
|
||||
```
|
||||
|
||||
### Метод 4: Перехват трафика
|
||||
|
||||
Использовать mitmproxy для перехвата всех запросов:
|
||||
```bash
|
||||
mitmproxy --mode transparent --listen-port 8080
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Примечания
|
||||
|
||||
- **HAR файл** содержит только запросы которые были сделаны во время записи
|
||||
- **Не все endpoints** попали в HAR (нужно дополнительно исследовать)
|
||||
- **HTML vs JSON:** Kwork использует смешанный подход - некоторые данные в HTML, некоторые через JSON API
|
||||
- **Динамические endpoints:** Некоторые endpoints могут требовать CSRF токены или другие заголовки
|
||||
|
||||
---
|
||||
|
||||
_Updated: 2026-03-29_
|
||||
181
src/kwork_api/ENDPOINTS_TODO.md
Normal file
181
src/kwork_api/ENDPOINTS_TODO.md
Normal file
@ -0,0 +1,181 @@
|
||||
# Endpoints To Fix
|
||||
|
||||
Эти endpoints возвращают 404 и требуют исправления на основе HAR анализа.
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Критичные (нужно исправить в первую очередь)
|
||||
|
||||
### 1. `/catalogMainv2` (строка 512)
|
||||
|
||||
**Текущий:**
|
||||
```python
|
||||
POST /catalogMainv2 # ❌ 404
|
||||
```
|
||||
|
||||
**Проблема:** Endpoint не существует в Kwork API.
|
||||
|
||||
**HAR показывает:**
|
||||
```
|
||||
GET /categories/design # HTML страница категории
|
||||
GET /projects # HTML страница проектов
|
||||
```
|
||||
|
||||
**Варианты решения:**
|
||||
1. Найти JSON API endpoint через DevTools
|
||||
2. Парсить HTML страницы категорий
|
||||
3. Использовать поиск через GraphQL API (если есть)
|
||||
|
||||
**Как найти:**
|
||||
```bash
|
||||
# В HAR искать запросы содержащие "kworks", "catalog", "list"
|
||||
jq '.log.entries[] | select(.request.url | test("kwork|catalog|list"; "i")) | .request.url' kwork-dump.har
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. `/getKworkDetails` (строка 549)
|
||||
|
||||
**Текущий:**
|
||||
```python
|
||||
POST /getKworkDetails # ❌ 404
|
||||
```
|
||||
|
||||
**HAR показывает:**
|
||||
```
|
||||
GET /projects/3127023/view # ✅ 200 OK (HTML страница)
|
||||
```
|
||||
|
||||
**Варианты решения:**
|
||||
1. Использовать `GET /projects/{id}/view` и парсить HTML
|
||||
2. Найти JSON API endpoint
|
||||
|
||||
---
|
||||
|
||||
### 3. `/cities` (строка 836)
|
||||
|
||||
**Текущий:**
|
||||
```python
|
||||
POST /cities # ❌ 404
|
||||
```
|
||||
|
||||
**HAR:** Нет такого endpoint.
|
||||
|
||||
**Варианты решения:**
|
||||
1. Искать в JavaScript файлах сайта
|
||||
2. Парсить HTML страницы с формами
|
||||
3. Использовать hardcoded список городов
|
||||
|
||||
---
|
||||
|
||||
### 4. `/countries` (строка 850)
|
||||
|
||||
**Текущий:**
|
||||
```python
|
||||
POST /countries # ❌ 404
|
||||
```
|
||||
|
||||
**HAR:** Нет такого endpoint.
|
||||
|
||||
**Варианты решения:**
|
||||
1. Искать в JavaScript файлах сайта
|
||||
2. Парсить HTML страницы с формами
|
||||
3. Использовать hardcoded список стран
|
||||
|
||||
---
|
||||
|
||||
## 🟡 Средней важности
|
||||
|
||||
### 5. `/userReviews` (ИСПРАВЛЕНО ✅)
|
||||
|
||||
**Было:**
|
||||
```python
|
||||
POST /userReviews # ❌ 404
|
||||
```
|
||||
|
||||
**Исправлено на:**
|
||||
```python
|
||||
POST /user/get_reviews # ✅ 200 OK (из HAR)
|
||||
```
|
||||
|
||||
**HAR подтверждение:**
|
||||
```
|
||||
POST /user/get_reviews
|
||||
Payload: {"userId":126921,"type":"positive"}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Низкой важности
|
||||
|
||||
### 6. `/user` (ВРЕМЕННО ИСПРАВЛЕНО)
|
||||
|
||||
**Было:**
|
||||
```python
|
||||
POST /user # ❌ 404
|
||||
```
|
||||
|
||||
**Временно заменено на:**
|
||||
```python
|
||||
POST /api/user/checknotify # ✅ 200 OK (из HAR)
|
||||
```
|
||||
|
||||
**Примечание:** Это endpoint для уведомлений, не для информации о пользователе.
|
||||
Нужно найти правильный endpoint для получения user info.
|
||||
|
||||
---
|
||||
|
||||
## 📋 План действий
|
||||
|
||||
1. ✅ Исправить `/userReviews` → `/user/get_reviews`
|
||||
2. ⏳ Исправить `/user` → найти правильный endpoint
|
||||
3. 🔍 Найти `/catalogMainv2` replacement
|
||||
4. 🔍 Найти `/getKworkDetails` replacement
|
||||
5. 🔍 Найти `/cities` и `/countries` endpoints
|
||||
|
||||
---
|
||||
|
||||
## 🔬 Методы поиска endpoints
|
||||
|
||||
### Метод 1: DevTools Network Tab
|
||||
|
||||
1. Открыть https://kwork.ru
|
||||
2. F12 → Network → XHR/Fetch
|
||||
3. Выполнить действие (поиск, просмотр кворка)
|
||||
4. Искать JSON запросы
|
||||
|
||||
### Метод 2: Анализ HAR
|
||||
|
||||
```bash
|
||||
cd /root
|
||||
python3 << 'EOF'
|
||||
import json
|
||||
with open('kwork-dump.har') as f:
|
||||
har = json.load(f)
|
||||
|
||||
# Искать конкретные endpoints
|
||||
keywords = ['catalog', 'kwork', 'review', 'city', 'country', 'projects']
|
||||
for entry in har['log']['entries']:
|
||||
url = entry['request']['url']
|
||||
if any(kw in url.lower() for kw in keywords):
|
||||
print(f"{entry['request']['method']} {url.split('?')[0]}")
|
||||
EOF
|
||||
```
|
||||
|
||||
### Метод 3: Поиск в JavaScript
|
||||
|
||||
```bash
|
||||
# Скачать JS файлы и искать API endpoints
|
||||
curl -s https://kwork.ru/js/dist/general_b581650cf3ee1d18.js | grep -oE '"/api/[^"]+"' | sort -u
|
||||
```
|
||||
|
||||
### Метод 4: Mitmproxy
|
||||
|
||||
```bash
|
||||
# Перехватывать все запросы
|
||||
mitmproxy --mode transparent --listen-port 8080
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
_Updated: 2026-03-29_
|
||||
@ -509,7 +509,7 @@ class KworkClient:
|
||||
"""
|
||||
data = await self.client._request(
|
||||
"POST",
|
||||
"/catalogMainv2",
|
||||
"/catalogMainv2", # TODO: 404 - need to find correct endpoint (HAR shows GET /categories/{slug})
|
||||
json={
|
||||
"page": page,
|
||||
"category_id": category_id,
|
||||
@ -546,7 +546,7 @@ class KworkClient:
|
||||
"""
|
||||
data = await self.client._request(
|
||||
"POST",
|
||||
"/getKworkDetails",
|
||||
"/getKworkDetails", # TODO: 404 - HAR shows GET /projects/{id}/view
|
||||
json={"kwork_id": kwork_id},
|
||||
)
|
||||
return KworkDetails.model_validate(data)
|
||||
@ -727,8 +727,16 @@ class KworkClient:
|
||||
info = await client.user.get_info()
|
||||
print(f"User: {info.get('username')}")
|
||||
print(f"Balance: {info.get('balance')} RUB")
|
||||
|
||||
Note:
|
||||
HAR shows GET /user/{username} for profile pages (HTML).
|
||||
For API, use POST /api/user/checknotify for notifications.
|
||||
This endpoint may need to be updated to use correct API.
|
||||
"""
|
||||
return await self.client._request("POST", "/user")
|
||||
# TODO: Find correct endpoint for user info
|
||||
# HAR shows: GET /user/{username} (HTML page)
|
||||
# For now, use checknotify as placeholder
|
||||
return await self.client._request("POST", "/api/user/checknotify")
|
||||
|
||||
async def get_reviews(
|
||||
self,
|
||||
@ -761,10 +769,12 @@ class KworkClient:
|
||||
# С пагинацией
|
||||
page2 = await client.user.get_reviews(page=2)
|
||||
"""
|
||||
# HAR Endpoint: POST /user/get_reviews
|
||||
# Payload: {"userId": N, "type": "positive"}
|
||||
data = await self.client._request(
|
||||
"POST",
|
||||
"/userReviews",
|
||||
json={"user_id": user_id, "page": page},
|
||||
"/user/get_reviews",
|
||||
json={"userId": user_id, "type": "positive"} if user_id else {"type": "positive"},
|
||||
)
|
||||
return ReviewsResponse.model_validate(data)
|
||||
|
||||
@ -823,6 +833,7 @@ class KworkClient:
|
||||
cities = await client.reference.get_cities()
|
||||
moscow = next(c for c in cities if c.name == "Москва")
|
||||
"""
|
||||
# TODO: 404 - endpoint not found in HAR, may need to parse HTML or find JS data
|
||||
data = await self.client._request("POST", "/cities")
|
||||
return [City.model_validate(c) for c in data.get("cities", [])]
|
||||
|
||||
@ -837,6 +848,7 @@ class KworkClient:
|
||||
countries = await client.reference.get_countries()
|
||||
russia = next(c for c in countries if c.code == "RU")
|
||||
"""
|
||||
# TODO: 404 - endpoint not found in HAR, may need to parse HTML or find JS data
|
||||
data = await self.client._request("POST", "/countries")
|
||||
return [Country.model_validate(c) for c in data.get("countries", [])]
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user