{"id":48834183,"url":"https://github.com/edwards359/pem08","last_synced_at":"2026-04-14T22:05:14.147Z","repository":{"id":333376714,"uuid":"1115400167","full_name":"Edwards359/PEm08","owner":"Edwards359","description":null,"archived":false,"fork":false,"pushed_at":"2025-12-12T20:11:27.000Z","size":139,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-19T07:41:19.679Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Edwards359.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-12T20:00:33.000Z","updated_at":"2026-01-10T19:57:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Edwards359/PEm08","commit_stats":null,"previous_names":["edwards359/pem08"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Edwards359/PEm08","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edwards359%2FPEm08","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edwards359%2FPEm08/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edwards359%2FPEm08/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edwards359%2FPEm08/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Edwards359","download_url":"https://codeload.github.com/Edwards359/PEm08/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Edwards359%2FPEm08/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31817138,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"ssl_error","status_checked_at":"2026-04-14T18:05:01.765Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-14T22:04:36.029Z","updated_at":"2026-04-14T22:05:14.108Z","avatar_url":"https://github.com/Edwards359.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔍 Мониторинг конкурентов - AI Ассистент\n\n[![Python](https://img.shields.io/badge/Python-3.9+-blue.svg)](https://www.python.org/)\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.115+-green.svg)](https://fastapi.tiangolo.com/)\n[![Proxy API](https://img.shields.io/badge/Proxy%20API-OpenAI--compatible-purple.svg)](https://proxyapi.ru/)\n[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nMVP приложение для анализа конкурентной среды с поддержкой мультимодальности (текст и изображения). Использует Proxy API для доступа к OpenAI моделям без VPN.\n\n## 📋 Описание\n\n**Мониторинг конкурентов** — это мультимодальный AI-ассистент, который помогает анализировать конкурентную среду. Приложение может анализировать текстовый контент, изображения (баннеры, сайты, упаковку) и автоматически парсить веб-страницы конкурентов.\n\n### Основные возможности\n\n- ✅ **Анализ текста конкурентов** — получайте структурированную аналитику с сильными/слабыми сторонами, уникальными предложениями и рекомендациями\n- ✅ **Анализ изображений** — анализируйте баннеры, скриншоты сайтов, упаковки товаров с оценкой визуального стиля и маркетинговыми инсайтами\n- ✅ **Парсинг веб-сайтов** — автоматически извлекайте и анализируйте контент по URL через Selenium\n- ✅ **История запросов** — последние 10 запросов сохраняются для быстрого доступа\n- ✅ **Отслеживание прогресса** — Server-Sent Events для отслеживания статуса длительных операций\n- ✅ **Интерактивный веб-интерфейс** — удобный UI для всех функций\n\n## 🚀 Быстрый старт\n\n### Системные требования\n\n- **Python 3.9+** (рекомендуется 3.10 или выше)\n- **Chromium-браузер** (Google Chrome, Vivaldi, Microsoft Edge) для парсинга через Selenium\n- **Proxy API ключ** (получить на [https://proxyapi.ru/](https://proxyapi.ru/))\n- **Интернет-соединение** для работы AI и парсинга сайтов\n\n### 1. Клонирование репозитория\n\n```bash\ngit clone \u003crepository-url\u003e\ncd PEm08\n```\n\n### 2. Установка зависимостей\n\n```bash\n# Создайте виртуальное окружение\npython -m venv venv\n\n# Активируйте окружение\n# Windows PowerShell:\n.\\venv\\Scripts\\Activate.ps1\n# Windows CMD:\nvenv\\Scripts\\activate.bat\n# Linux/macOS:\nsource venv/bin/activate\n\n# Установите зависимости\npip install --upgrade pip\npip install -r requirements.txt\n```\n\n### 3. Установка браузера\n\nПоддерживаются следующие браузеры (любой из них):\n\n- **Google Chrome** (рекомендуется) — [скачать](https://www.google.com/chrome/)\n- **Vivaldi** — [скачать](https://vivaldi.com/)\n- **Microsoft Edge** — обычно уже установлен в Windows\n\n**Примечание:** ChromeDriver будет установлен автоматически через Selenium Manager при первом запуске.\n\n### 4. Настройка переменных окружения\n\nСоздайте файл `.env` в корне проекта:\n\n```bash\n# Windows PowerShell\nCopy-Item env.example.txt .env\n\n# Linux/macOS\ncp env.example.txt .env\n```\n\nОткройте `.env` и заполните:\n\n```env\n# Обязательно: Ваш Proxy API ключ (получить на https://proxyapi.ru/)\nPROXY_API_KEY=your_proxy_api_key_here\n\n# Базовый URL Proxy API (можно не менять)\nPROXY_API_BASE_URL=https://openai.api.proxyapi.ru/v1\n\n# Модели OpenAI через Proxy API (формат: openai/название-модели)\nOPENAI_MODEL=openai/gpt-4o-mini\nOPENAI_VISION_MODEL=openai/gpt-4o-mini\nDALL_E_MODEL=openai/dall-e-3\n\n# Настройки API сервера\nAPI_HOST=0.0.0.0\nAPI_PORT=8000\n\n# Опционально: Путь к браузеру (если не найден автоматически)\n# BROWSER_BINARY_PATH=C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\n```\n\n### 5. Запуск приложения\n\n```bash\n# Убедитесь, что виртуальное окружение активировано\npython run.py\n```\n\nПриложение будет доступно по адресу: **http://localhost:8000**\n\n📖 **Подробная инструкция по установке:** см. [INSTALL.md](INSTALL.md)\n\n## 📁 Структура проекта\n\n```\nPEm08/\n├── backend/                    # Backend код\n│   ├── __init__.py\n│   ├── main.py                # FastAPI приложение с эндпоинтами\n│   ├── config.py              # Конфигурация и настройки\n│   ├── models/                # Pydantic модели\n│   │   ├── __init__.py\n│   │   └── schemas.py         # Схемы данных для API\n│   └── services/              # Бизнес-логика\n│       ├── __init__.py\n│       ├── openai_service.py  # Работа с Proxy API (OpenAI-совместимый)\n│       ├── parser_service.py  # Парсинг веб-страниц через Selenium\n│       ├── history_service.py # Управление историей запросов\n│       └── progress_service.py # Отслеживание прогресса задач\n├── frontend/                  # Frontend код\n│   ├── index.html            # HTML страница с интерфейсом\n│   ├── styles.css            # Стили CSS\n│   └── app.js                # JavaScript логика\n├── requirements.txt          # Python зависимости\n├── env.example.txt           # Пример .env файла\n├── .env                      # Файл конфигурации (создать самостоятельно)\n├── history.json              # Файл истории (создаётся автоматически)\n├── README.md                 # Этот файл\n├── INSTALL.md                # Подробная инструкция по установке\n├── run.py                    # Скрипт запуска сервера\n└── docs.md                   # Документация API\n```\n\n## 🔧 Функциональность\n\n### 1. Анализ текста (`POST /analyze_text`)\n\nАнализирует текстовый контент конкурентов и возвращает структурированную аналитику.\n\n**Входные данные:**\n- Текст для анализа (минимум 10 символов)\n\n**Выходные данные:**\n- **Сильные стороны** — список сильных сторон конкурента\n- **Слабые стороны** — список слабых мест\n- **Уникальные предложения** — что выделяет конкурента\n- **Рекомендации** — рекомендации по улучшению вашей стратегии\n- **Резюме** — краткое общее резюме анализа\n\n**Пример использования:**\n\n```bash\ncurl -X POST \"http://localhost:8000/analyze_text\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"text\": \"Наша компания предлагает уникальные решения в области автоматизации бизнес-процессов...\"\n  }'\n```\n\n### 2. Анализ изображений (`POST /analyze_image`)\n\nАнализирует изображения (баннеры, сайты, упаковку) и возвращает маркетинговые инсайты.\n\n**Входные данные:**\n- Изображение (JPEG, PNG, GIF, WebP)\n\n**Выходные данные:**\n- **Описание** — детальное описание изображения\n- **Маркетинговые инсайты** — список инсайтов о маркетинговой стратегии\n- **Оценка визуального стиля** — числовая оценка от 0 до 10\n- **Анализ визуального стиля** — детальный анализ цветов, типографики, композиции\n- **Рекомендации** — рекомендации по улучшению\n\n**Пример использования:**\n\n```bash\ncurl -X POST \"http://localhost:8000/analyze_image\" \\\n  -F \"file=@banner.jpg\"\n```\n\n### 3. Парсинг веб-сайтов (`POST /parse_demo`)\n\nИзвлекает контент с веб-страницы и автоматически анализирует его.\n\n**Входные данные:**\n- URL веб-страницы\n\n**Выходные данные:**\n- **ParsedContent** — структурированные данные:\n  - `title` — заголовок страницы\n  - `h1` — главный заголовок\n  - `first_paragraph` — первый абзац\n  - `full_text` — полный текст страницы\n  - `analysis` — анализ текстового контента\n  - `task_id` — ID задачи для отслеживания прогресса\n\n**Особенности:**\n- Использует Selenium для рендеринга JavaScript\n- Извлекает мета-теги, ссылки, заголовки, изображения\n- Отслеживание прогресса через Server-Sent Events (`/progress/{task_id}`)\n\n**Пример использования:**\n\n```bash\ncurl -X POST \"http://localhost:8000/parse_demo\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://example.com\"\n  }'\n```\n\n### 4. История запросов\n\n**Получить историю (`GET /history`)**\n\nВозвращает последние 10 запросов с метаданными.\n\n**Очистить историю (`DELETE /history`)**\n\nУдаляет всю историю запросов.\n\n### 5. Отслеживание прогресса\n\n**Получить статус (`GET /progress/{task_id}/status`)**\n\nВозвращает текущий статус задачи парсинга.\n\n**Поток событий (`GET /progress/{task_id}`)**\n\nServer-Sent Events поток для отслеживания прогресса в реальном времени.\n\n## 🛠️ Технологии\n\n### Backend\n\n- **FastAPI** 0.115+ — современный веб-фреймворк для Python\n- **Python 3.9+** — язык программирования\n- **Pydantic** 2.12+ — валидация данных и настройки\n- **Selenium** 4.38+ — автоматизация браузера для парсинга\n- **webdriver-manager** 4.0+ — автоматическое управление драйверами браузера\n- **httpx** 0.27+ — асинхронный HTTP-клиент\n- **python-multipart** — обработка файлов\n\n### AI \u0026 API\n\n- **Proxy API** — OpenAI-совместимый API для России (без VPN)\n  - Базовая модель: `openai/gpt-4o-mini`\n  - Vision модель: `openai/gpt-4o-mini` (поддержка изображений)\n  - DALL·E модель: `openai/dall-e-3` (готово к использованию)\n\n### Frontend\n\n- **Vanilla JavaScript** — без фреймворков\n- **CSS3** — современные стили\n- **HTML5** — семантическая разметка\n\n### Инструменты разработки\n\n- **uvicorn** — ASGI сервер\n- **python-dotenv** — управление переменными окружения\n- **aiofiles** — асинхронная работа с файлами\n- **Pillow** — обработка изображений (для будущих функций)\n\n## 📖 API Документация\n\nПосле запуска сервера доступна интерактивная документация:\n\n- **Swagger UI**: http://localhost:8000/docs\n- **ReDoc**: http://localhost:8000/redoc\n\n### Эндпоинты\n\n| Метод | Путь | Описание |\n|-------|------|----------|\n| `GET` | `/` | Главная страница (веб-интерфейс) |\n| `POST` | `/analyze_text` | Анализ текста конкурента |\n| `POST` | `/analyze_image` | Анализ изображения конкурента |\n| `POST` | `/parse_demo` | Парсинг и анализ веб-страницы |\n| `GET` | `/history` | Получить историю запросов |\n| `DELETE` | `/history` | Очистить историю |\n| `GET` | `/health` | Проверка работоспособности |\n| `GET` | `/progress/{task_id}` | Поток событий прогресса (SSE) |\n| `GET` | `/progress/{task_id}/status` | Статус задачи |\n\nПодробная документация API в файле [docs.md](docs.md)\n\n## 🔐 Конфигурация\n\n### Переменные окружения\n\nВсе настройки находятся в файле `.env`:\n\n| Переменная | Описание | По умолчанию | Обязательная |\n|-----------|----------|--------------|--------------|\n| `PROXY_API_KEY` | Ключ Proxy API | - | ✅ Да |\n| `PROXY_API_BASE_URL` | Базовый URL Proxy API | `https://openai.api.proxyapi.ru/v1` | Нет |\n| `OPENAI_MODEL` | Модель для текста | `openai/gpt-4o-mini` | Нет |\n| `OPENAI_VISION_MODEL` | Модель для изображений | `openai/gpt-4o-mini` | Нет |\n| `DALL_E_MODEL` | Модель для генерации изображений | `openai/dall-e-3` | Нет |\n| `API_HOST` | Хост API сервера | `0.0.0.0` | Нет |\n| `API_PORT` | Порт API сервера | `8000` | Нет |\n| `BROWSER_BINARY_PATH` | Путь к браузеру | Автоопределение | Нет |\n\n### Получение Proxy API ключа\n\n1. Зарегистрируйтесь на [https://proxyapi.ru/](https://proxyapi.ru/)\n2. Получите API ключ в личном кабинете\n3. Пополните баланс (оплата в рублях)\n4. Добавьте ключ в `.env` файл\n\n**Документация Proxy API:**\n- [OpenAI-совместимый API](https://proxyapi.ru/docs/openai-compatible-api)\n- [Генерация текста](https://proxyapi.ru/docs/openai-text-generation)\n- [Генерация изображений](https://proxyapi.ru/docs/openai-image-generation)\n\n## 📝 Примеры использования\n\n### Python\n\n```python\nimport requests\n\n# Анализ текста\nresponse = requests.post(\n    \"http://localhost:8000/analyze_text\",\n    json={\"text\": \"Текст конкурента для анализа...\"}\n)\nanalysis = response.json()\nprint(analysis[\"analysis\"][\"strengths\"])\n\n# Анализ изображения\nwith open(\"banner.jpg\", \"rb\") as f:\n    response = requests.post(\n        \"http://localhost:8000/analyze_image\",\n        files={\"file\": f}\n    )\nimage_analysis = response.json()\n\n# Парсинг сайта\nresponse = requests.post(\n    \"http://localhost:8000/parse_demo\",\n    json={\"url\": \"https://competitor.com\"}\n)\ntask_id = response.json()[\"task_id\"]\n\n# Отслеживание прогресса\nimport time\nwhile True:\n    status = requests.get(f\"http://localhost:8000/progress/{task_id}/status\").json()\n    print(f\"Статус: {status['status']}, Прогресс: {status['progress']}%\")\n    if status[\"status\"] in [\"completed\", \"error\"]:\n        break\n    time.sleep(1)\n```\n\n### JavaScript (Frontend)\n\n```javascript\n// Анализ текста\nasync function analyzeText(text) {\n  const response = await fetch('/analyze_text', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ text })\n  });\n  return await response.json();\n}\n\n// Анализ изображения\nasync function analyzeImage(file) {\n  const formData = new FormData();\n  formData.append('file', file);\n  const response = await fetch('/analyze_image', {\n    method: 'POST',\n    body: formData\n  });\n  return await response.json();\n}\n\n// Отслеживание прогресса через SSE\nfunction trackProgress(taskId) {\n  const eventSource = new EventSource(`/progress/${taskId}`);\n  eventSource.onmessage = (event) =\u003e {\n    const data = JSON.parse(event.data);\n    console.log(`Прогресс: ${data.progress}%`);\n    if (data.status === 'completed') {\n      eventSource.close();\n    }\n  };\n}\n```\n\n## 🐛 Устранение неполадок\n\n### Ошибка 402: Недостаточно баланса Proxy API\n\n**Решение:** Пополните баланс на [https://proxyapi.ru/](https://proxyapi.ru/) или используйте более дешевую модель.\n\nПодробнее: [PROXY_API_BALANCE_ERROR.md](PROXY_API_BALANCE_ERROR.md)\n\n### Браузер не найден\n\n**Решение:**\n1. Убедитесь, что Chrome/Vivaldi установлен\n2. Укажите путь в `.env`: `BROWSER_BINARY_PATH=путь/к/браузеру.exe`\n\n### Ошибка версии ChromeDriver\n\n**Решение:** Очистите кэш и перезапустите сервер:\n\n```powershell\nRemove-Item -Recurse -Force \"$env:USERPROFILE\\.wdm\"\nRemove-Item -Recurse -Force \"$env:USERPROFILE\\.cache\\selenium\"\n```\n\nПодробнее: [INSTALL.md](INSTALL.md#проблема-несовместимость-версии-драйвера)\n\n### Порт 8000 занят\n\n**Решение:** Измените порт в `.env`:\n\n```env\nAPI_PORT=8001\n```\n\nИли завершите процесс на порту 8000.\n\n### Импорт модулей не работает\n\n**Решение:**\n```bash\n# Убедитесь, что виртуальное окружение активировано\n# Переустановите зависимости\npip install -r requirements.txt --force-reinstall\n```\n\n## 🔄 Миграция с OpenAI на Proxy API\n\nПроект был мигрирован с OpenAI API на Proxy API для работы без VPN в России.\n\n**Что изменилось:**\n- `OPENAI_API_KEY` → `PROXY_API_KEY`\n- Модели теперь используют формат: `openai/gpt-4o-mini`\n- Базовый URL: `https://openai.api.proxyapi.ru/v1`\n\nПодробнее: [PROXY_API_MIGRATION.md](PROXY_API_MIGRATION.md)\n\n## 🚧 Известные ограничения\n\n- История хранит только последние 10 запросов\n- Парсинг работает только с публично доступными сайтами\n- Анализ изображений требует достаточного баланса на Proxy API\n- Скриншоты сайтов больше не создаются (парсинг только HTML контента)\n\n## 📚 Дополнительная документация\n\n- [INSTALL.md](INSTALL.md) — подробная инструкция по установке\n- [PROXY_API_MIGRATION.md](PROXY_API_MIGRATION.md) — миграция на Proxy API\n- [PROXY_API_BALANCE_ERROR.md](PROXY_API_BALANCE_ERROR.md) — решение проблем с балансом\n- [PARSING_IMPROVEMENTS.md](PARSING_IMPROVEMENTS.md) — улучшения парсинга\n- [CHROME_MIGRATION.md](CHROME_MIGRATION.md) — миграция на Chrome\n- [QUICK_START_PROXY_API.md](QUICK_START_PROXY_API.md) — быстрый старт с Proxy API\n\n## 🤝 Вклад в проект\n\nПриветствуются любые улучшения! Пожалуйста:\n\n1. Форкните репозиторий\n2. Создайте ветку для новой функции (`git checkout -b feature/AmazingFeature`)\n3. Зафиксируйте изменения (`git commit -m 'Add some AmazingFeature'`)\n4. Отправьте в ветку (`git push origin feature/AmazingFeature`)\n5. Откройте Pull Request\n\n## 📄 Лицензия\n\nЭтот проект распространяется под лицензией MIT. См. файл `LICENSE` для подробностей.\n\n## 👨‍💻 Авторы\n\n- Разработка и поддержка проекта\n\n## 🙏 Благодарности\n\n- [FastAPI](https://fastapi.tiangolo.com/) — за отличный фреймворк\n- [Proxy API](https://proxyapi.ru/) — за доступ к OpenAI без VPN\n- [Selenium](https://www.selenium.dev/) — за инструменты автоматизации браузера\n- [OpenAI](https://openai.com/) — за мощные AI модели\n\n## 📞 Поддержка\n\nЕсли у вас возникли вопросы или проблемы:\n\n1. Проверьте [INSTALL.md](INSTALL.md) для решения распространенных проблем\n2. Изучите раздел [Устранение неполадок](#-устранение-неполадок)\n3. Откройте Issue в репозитории\n\n---\n\n**Версия:** 1.0.0  \n**Последнее обновление:** 2025\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedwards359%2Fpem08","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedwards359%2Fpem08","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedwards359%2Fpem08/lists"}