Добавить поддержку Яндекс Маркета (goods-feedback API)
- app/services/ym.py: клиент Partner API — getGoodsFeedbacks с пагинацией и фильтром по дате, updateGoodsFeedbackComment (ответ), deleteGoodsFeedbackComment (удаление), обработка новых отзывов по аналогии с WB/Ozon - воркер ym_worker, включается при заданных YM_API_KEY и YM_BUSINESS_ID - кнопки отправки/удаления ответа, платформа в сообщении и в таблице, статистика /stat и /allstat - переменные YM_API_KEY, YM_BUSINESS_ID, YM_CHECK_INTERVAL, PRODUCTS_YM_SHEET_LINK - README и .env.example Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
# Бот для отзывов Ozon и Wildberries
|
||||
# Бот для отзывов Ozon, Wildberries и Яндекс Маркета
|
||||
|
||||
Telegram-бот, который собирает новые отзывы с Ozon и Wildberries, публикует их в группу с топиками, анализирует через GPT и помогает на них отвечать: автоматически или по кнопке.
|
||||
Telegram-бот, который собирает новые отзывы с Ozon, Wildberries и Яндекс Маркета, публикует их в группу с топиками, анализирует через GPT и помогает на них отвечать: автоматически или по кнопке.
|
||||
|
||||
## Что умеет
|
||||
|
||||
- **Опрос маркетплейсов.** Фоновые воркеры по таймеру запрашивают новые отзывы через Ozon Seller API и WB Feedbacks API. Каждый отзыв сохраняется в SQLite, повторно не обрабатывается.
|
||||
- **Опрос маркетплейсов.** Фоновые воркеры по таймеру запрашивают новые отзывы через Ozon Seller API, WB Feedbacks API и Яндекс Маркет Partner API (goods-feedback). Каждый отзыв сохраняется в SQLite, повторно не обрабатывается.
|
||||
- **Раскладка по топикам.** Отзывы с оценкой выше порога (`NEGATIVE_RATING`, по умолчанию 3) уходят в топик хороших, остальные в топик плохих. Отзывы без текста (только оценка) можно направлять в отдельные топики.
|
||||
- **Анализ через GPT.** Определяет тональность, причину и критичность отзыва по промпту. Критичные отзывы помечаются `#требует_обработки`.
|
||||
- **Ответы.** Три варианта: автоответ через GPT, автоответ по шаблону для отзывов без текста, либо ручной режим с кнопками «Сгенерировать ответ» / «Написать свой ответ» / «Отправить» / «Удалить ответ».
|
||||
- **Google Sheets.** Каждый отзыв дописывается строкой в таблицу отзывов. Названия и категории товаров подтягиваются из справочников товаров WB и Ozon.
|
||||
- **Google Sheets.** Каждый отзыв дописывается строкой в таблицу отзывов. Названия и категории товаров подтягиваются из справочников товаров WB, Ozon и Яндекс Маркета.
|
||||
- **Статистика.** Команды `/stat` (за сегодня) и `/allstat` (за всё время): количество, доля плохих, средний рейтинг, критичные, тональность.
|
||||
|
||||
Настройки (промпты, автоответы, модель, шаблоны) хранятся в базе отдельно для хороших и плохих отзывов и меняются прямо из бота. Они сохраняются между перезапусками и редеплоями, поэтому база должна лежать на постоянном томе.
|
||||
@@ -17,12 +17,12 @@ Telegram-бот, который собирает новые отзывы с Ozon
|
||||
|
||||
```
|
||||
Ozon API ─┐ ┌─> Telegram (топики хороших / плохих / без текста)
|
||||
├─> воркер ─> SQLite ─> очереди ─┤
|
||||
WB API ──┘ │ └─> Google Sheets (таблица отзывов)
|
||||
WB API ──┼─> воркер ─> SQLite ─> очереди ─┤
|
||||
YM API ──┘ │ └─> Google Sheets (таблица отзывов)
|
||||
└─> GPT: анализ + генерация ответа
|
||||
```
|
||||
|
||||
Точка входа `app/__main__.py` поднимает четыре бесконечные задачи: опрос Ozon, опрос WB, отправка сообщений в Telegram, запись в Google Sheets. Затем запускает polling Telegram. Бот реагирует только на сообщения из чата `TG_CHAT_ID` в разрешённых топиках.
|
||||
Точка входа `app/__main__.py` поднимает бесконечные задачи: опрос Ozon, опрос WB, опрос Яндекс Маркета (если заданы `YM_API_KEY` и `YM_BUSINESS_ID`), отправка сообщений в Telegram, запись в Google Sheets. Затем запускает polling Telegram. Бот реагирует только на сообщения из чата `TG_CHAT_ID` в разрешённых топиках.
|
||||
|
||||
Структура кода:
|
||||
|
||||
@@ -33,7 +33,7 @@ WB API ──┘ │ └─> Google Sheets (таб
|
||||
| `app/handlers/callbacks.py` | Кнопки: генерация, отправка, удаление ответа, переключатели настроек |
|
||||
| `app/handlers/commands.py` | Команды `/stat`, `/allstat`, `/settings`, шаблоны, `/max_tokens` |
|
||||
| `app/handlers/prompt.py` | Просмотр, изменение и сброс промптов |
|
||||
| `app/services/ozon.py`, `wb.py` | Клиенты API маркетплейсов и обработка новых отзывов |
|
||||
| `app/services/ozon.py`, `wb.py`, `ym.py` | Клиенты API маркетплейсов и обработка новых отзывов |
|
||||
| `app/services/gpt.py` | Запросы к GPT, разбор JSON анализа |
|
||||
| `app/services/sheets.py` | Работа с Google Sheets через gspread |
|
||||
| `app/services/stats.py` | Подсчёт статистики |
|
||||
@@ -45,7 +45,7 @@ WB API ──┘ │ └─> Google Sheets (таб
|
||||
- [uv](https://docs.astral.sh/uv/) (рекомендуется) или pip
|
||||
- Telegram-бот, добавленный в супергруппу с включёнными топиками
|
||||
- Сервисный аккаунт Google с доступом к Google Sheets API
|
||||
- Ключи API Ozon Seller, Wildberries (категория «Отзывы и вопросы») и gptunnel.ru
|
||||
- Ключи API Ozon Seller, Wildberries (категория «Отзывы и вопросы»), Яндекс Маркета (Api-Key с доступом «Общение с покупателями», необязательно) и gptunnel.ru
|
||||
|
||||
## Установка и запуск
|
||||
|
||||
@@ -94,8 +94,8 @@ WB API ──┘ │ └─> Google Sheets (таб
|
||||
| `BOT_TOKEN` | Токен бота от @BotFather |
|
||||
| `TG_CHAT_ID`, `GOOD_REVIEWS_THREAD_ID`, `BAD_REVIEWS_THREAD_ID` | Группа и топики |
|
||||
| `GOOGLE_SERVICE_ACCOUNT_JSON` | Содержимое `key.json` одной строкой или в base64 |
|
||||
| `REVIEWS_SHEET_LINK`, `PRODUCTS_WB_SHEET_LINK`, `PRODUCTS_OZON_SHEET_LINK` | Ссылки на таблицы |
|
||||
| `OZON_API_KEY`, `OZON_CLIENT_ID`, `WB_API_KEY`, `GPTUNNEL_API_KEY` | Ключи API |
|
||||
| `REVIEWS_SHEET_LINK`, `PRODUCTS_WB_SHEET_LINK`, `PRODUCTS_OZON_SHEET_LINK`, `PRODUCTS_YM_SHEET_LINK` | Ссылки на таблицы |
|
||||
| `OZON_API_KEY`, `OZON_CLIENT_ID`, `WB_API_KEY`, `YM_API_KEY`, `YM_BUSINESS_ID`, `GPTUNNEL_API_KEY` | Ключи API |
|
||||
| `BRAND_NAME` | Название бренда для промптов |
|
||||
|
||||
Ключ Google удобнее передавать в base64, тогда в значении нет кавычек и переносов строк:
|
||||
@@ -136,6 +136,12 @@ Compose читает `.env` из корня, если файл есть, и хр
|
||||
|
||||
**Справочник товаров Ozon** (`PRODUCTS_OZON_SHEET_LINK`). Ключевой столбец `Ozon ID` или `ozon id акутальный`. Используются `Товары`, `Тип товара`, `Категория 2-го уровня`.
|
||||
|
||||
**Справочник товаров Яндекс Маркета** (`PRODUCTS_YM_SHEET_LINK`, необязательно). Ключевой столбец `SKU`, `Ваш SKU`, `offerId` или `Артикул` — это SKU продавца (`offerId` в API). Используются столбцы `Название`/`Наименование`/`Название товара` и `Категория`/`Категория продавца`. Если таблица не задана или товар не найден, название и категория записываются как «неизвестно».
|
||||
|
||||
## Яндекс Маркет
|
||||
|
||||
Используются методы Partner API `getGoodsFeedbacks` (список отзывов, с пагинацией и фильтром по дате), `updateGoodsFeedbackComment` (создание комментария к отзыву) и `deleteGoodsFeedbackComment` (удаление ответа по кнопке). Текст отзыва собирается из комментария, достоинств и недостатков. Фото из отзыва отправляются в Telegram вместе с сообщением. API отдаёт отзывы не старше 6 месяцев, поэтому при первом запуске бот заберёт отзывы за этот период.
|
||||
|
||||
Если в ссылке на таблицу есть `gid=`, берётся этот лист, иначе первый. Справочники кэшируются на 5 минут.
|
||||
|
||||
## Команды бота
|
||||
|
||||
Reference in New Issue
Block a user