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(
|
data = await self.client._request(
|
||||||
"POST",
|
"POST",
|
||||||
"/catalogMainv2",
|
"/catalogMainv2", # TODO: 404 - need to find correct endpoint (HAR shows GET /categories/{slug})
|
||||||
json={
|
json={
|
||||||
"page": page,
|
"page": page,
|
||||||
"category_id": category_id,
|
"category_id": category_id,
|
||||||
@ -546,7 +546,7 @@ class KworkClient:
|
|||||||
"""
|
"""
|
||||||
data = await self.client._request(
|
data = await self.client._request(
|
||||||
"POST",
|
"POST",
|
||||||
"/getKworkDetails",
|
"/getKworkDetails", # TODO: 404 - HAR shows GET /projects/{id}/view
|
||||||
json={"kwork_id": kwork_id},
|
json={"kwork_id": kwork_id},
|
||||||
)
|
)
|
||||||
return KworkDetails.model_validate(data)
|
return KworkDetails.model_validate(data)
|
||||||
@ -727,8 +727,16 @@ class KworkClient:
|
|||||||
info = await client.user.get_info()
|
info = await client.user.get_info()
|
||||||
print(f"User: {info.get('username')}")
|
print(f"User: {info.get('username')}")
|
||||||
print(f"Balance: {info.get('balance')} RUB")
|
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(
|
async def get_reviews(
|
||||||
self,
|
self,
|
||||||
@ -761,10 +769,12 @@ class KworkClient:
|
|||||||
# С пагинацией
|
# С пагинацией
|
||||||
page2 = await client.user.get_reviews(page=2)
|
page2 = await client.user.get_reviews(page=2)
|
||||||
"""
|
"""
|
||||||
|
# HAR Endpoint: POST /user/get_reviews
|
||||||
|
# Payload: {"userId": N, "type": "positive"}
|
||||||
data = await self.client._request(
|
data = await self.client._request(
|
||||||
"POST",
|
"POST",
|
||||||
"/userReviews",
|
"/user/get_reviews",
|
||||||
json={"user_id": user_id, "page": page},
|
json={"userId": user_id, "type": "positive"} if user_id else {"type": "positive"},
|
||||||
)
|
)
|
||||||
return ReviewsResponse.model_validate(data)
|
return ReviewsResponse.model_validate(data)
|
||||||
|
|
||||||
@ -823,6 +833,7 @@ class KworkClient:
|
|||||||
cities = await client.reference.get_cities()
|
cities = await client.reference.get_cities()
|
||||||
moscow = next(c for c in cities if c.name == "Москва")
|
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")
|
data = await self.client._request("POST", "/cities")
|
||||||
return [City.model_validate(c) for c in data.get("cities", [])]
|
return [City.model_validate(c) for c in data.get("cities", [])]
|
||||||
|
|
||||||
@ -837,6 +848,7 @@ class KworkClient:
|
|||||||
countries = await client.reference.get_countries()
|
countries = await client.reference.get_countries()
|
||||||
russia = next(c for c in countries if c.code == "RU")
|
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")
|
data = await self.client._request("POST", "/countries")
|
||||||
return [Country.model_validate(c) for c in data.get("countries", [])]
|
return [Country.model_validate(c) for c in data.get("countries", [])]
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user