Repository navigation
Release v2.1.0
Changelog
Все значимые изменения в проекте XMLRiver Pro будут документированы в этом файле.
Формат основан на Keep a Changelog,
и этот проект придерживается Semantic Versioning.
[Unreleased]
[2.1.0] - 2025-10-21
Added
- 📊 Поддержка Yandex Wordstat API - полнофункциональный асинхронный клиент
AsyncWordstatClient- асинхронный клиент для работы с Wordstatget_words()- получение топов запросов (associations и popular)get_history()- получение динамики частотности запросаget_frequency()- получение общей частотности запроса- Фильтрация по регионам Яндекса
- Фильтрация по устройствам (desktop, phone, tablet)
- Группировка по периодам (month, week, day)
- 🎯 Новые типы данных для Wordstat
WordstatKeyword- ключевое слово с частотностьюWordstatResponse- ответ с топами запросовWordstatHistoryPoint- точка в динамикеWordstatHistoryResponse- ответ с динамикой
- 📚 Документация Wordstat
docs/WORDSTAT_GUIDE.md- полное руководство по работе с Wordstat API- Примеры использования всех методов
- Руководство по фильтрам и параметрам
- Примеры анализа семантического ядра
- 🧪 Тесты для Wordstat
- 14 тестов для AsyncWordstatClient
- Тесты парсинга ответов words и history
- Тесты валидации параметров
- Тесты для типов данных Wordstat
Technical Details
- Endpoint:
http://xmlriver.com/wordstat/new/json - Формат: JSON (не XML как в Google/Yandex)
- Retry механизм: наследуется от AsyncBaseClient
- Ограничение потоков: максимум 10 одновременных запросов
- Автоматическая замена: амперсанды (&) заменяются на %26
Examples
# Получение топов запросов
async with AsyncWordstatClient(user_id=123, api_key="key") as client:
result = await client.get_words("python")
print(f"Associations: {len(result.associations)}")
print(f"Popular: {len(result.popular)}")
# Получение динамики
async with AsyncWordstatClient(user_id=123, api_key="key") as client:
history = await client.get_history(
"python",
period="month",
start="01.01.2024",
end="31.03.2024"
)
print(f"Total frequency: {history.total_value}")
# Получение частотности
async with AsyncWordstatClient(user_id=123, api_key="key") as client:
frequency = await client.get_frequency("python")
print(f"Frequency: {frequency}")[2.0.0] - 2025-01-19
💥 BREAKING CHANGES
- Удалены ВСЕ синхронные клиенты - библиотека теперь полностью асинхронная
- ❌ Удалены:
GoogleClient,YandexClientи все специализированные синхронные классы - ❌ Удалены:
GoogleSearch,GoogleNews,GoogleImages,GoogleMaps,GoogleAds,GoogleSpecialBlocks - ❌ Удалены:
YandexSearch,YandexNews,YandexAds,YandexSpecialBlocks - ❌ Удален:
BaseClient(синхронный базовый клиент) - ✅ Используйте:
AsyncGoogleClientиAsyncYandexClientдля всех операций
- ❌ Удалены:
Changed
- Библиотека теперь требует использования
async/awaitдля всех операций - Обновлены все примеры в документации на асинхронные
- Удалены тесты синхронных клиентов (6 файлов)
- Обновлены экспорты модулей - только асинхронные клиенты
Documentation
- ✅ README.md полностью переработан - только асинхронные примеры
- ✅ docs/examples.md - все примеры обновлены на async/await
- ✅ docs/API_REFERENCE.md - документация асинхронных клиентов
- ✅ docs/ADVANCED_USAGE.md - полностью переработан с асинхронными примерами
- ✅ docs/TROUBLESHOOTING.md - обновлены все примеры на async/await
- ✅ docs/GEO_DATA_GUIDE.md - исправлены импорты и примеры
- ✅ docs/versioning.md - обновлены версии до 2.0.0
- ✅ Удалены устаревшие синхронные примеры из всей документации
Migration Guide
Для обновления на версию 2.0.0:
Было (синхронный код):
from xmlriver_pro import GoogleClient
google = GoogleClient(user_id=123, api_key="key")
results = google.search("python")Стало (асинхронный код):
import asyncio
from xmlriver_pro import AsyncGoogleClient
async def main():
async with AsyncGoogleClient(user_id=123, api_key="key") as google:
results = await google.search("python")
asyncio.run(main())[1.2.9] - 2025-01-18
🔒 Security
- Критически важно: Защита от случайных трат на Real API тесты
- Real API тесты теперь по умолчанию ИСКЛЮЧЕНЫ из запуска (74 теста)
- Добавлен pytest marker
real_apiдля пометки платных тестов - Конфигурация pytest обновлена:
-m not real_apiпо умолчанию - Безопасно запускать
pytestбез риска потратить деньги - Явный запуск платных тестов:
pytest -m real_api(~$5-10) - Добавлен
TESTING.md- полная документация по тестированию:- Инструкции по безопасному тестированию
- Предупреждения о стоимости real_api тестов
- Защитные механизмы и best practices
- Обновлен
README.mdс предупреждениями о платных тестах
Fixed
- Экспортированы функции работы с географическими данными в публичный API
- 18 функций теперь доступны через
from xmlriver_pro.utils import ... - Yandex регионы (4 функции):
get_yandex_region,find_yandex_regions,get_yandex_regions_by_parent,get_yandex_region_hierarchy - Google языки (3 функции):
get_google_language,find_google_languages,get_all_google_languages - Google домены (3 функции):
get_google_domain,find_google_domains,get_all_google_domains - Города (3 функции):
get_city,find_cities,get_cities_by_country - Универсальные (3 функции):
search_place,get_region_for_yandex_search,get_country_code_for_google_search - Статистика (1 функция):
get_geo_stats
- 18 функций теперь доступны через
Added
- Добавлен
test_geo_public_api.py- тест проверяющий экспорт всех geo_data функций в публичный API- 8 тестов покрывают все категории функций и проверяют доступность через импорт
- Предотвращает повторение проблемы с неэкспортированными функциями
[1.2.8] - 2025-01-18
Added
- ✅ Добавлен комплексный тест реальных API запросов (
test_full_api_real.py)- 70 тестов покрывают все endpoints библиотеки
- Базовые методы: get_balance(), get_cost()
- Google API: Search (11 тестов), Ads (7 тестов), News (7 тестов), Images (6 тестов), Maps (5 тестов)
- Yandex API: Search (14 тестов), Ads (10 тестов), News (8 тестов)
- Все тесты успешно проходят с реальными API ключами
Fixed
- Исправлена ошибка с дублированным языковым кодом в geo_data_builtin.py
- Улучшена обработка исключений в методе
search_in_url()для Yandex
[1.2.7] - 2025-01-16
Documentation (Major)
- 📚 Расширена документация: Добавлен раздел "Типы данных" с примерами всех dataclass
SearchResult,NewsResult,ImageResult,MapResult,AdResult- Перечисления:
SearchType,TimeFilter,DeviceType,OSType
- 🔍 Расширенные методы: Добавлена документация для всех недокументированных методов
- Google:
search_with_time_filter(),search_without_correction(),search_with_highlights() - Yandex:
search_exact_phrase(),search_exclude_words(),search_in_title(),search_in_url() - Maps:
search_restaurants(),search_hotels(),search_gas_stations(),search_pharmacies() - Images:
get_suggested_searches() - News:
search_news_by_region(),search_news_by_language(),search_news_by_domain()
- Google:
- 🧩 Специальные блоки: Расширена документация всех методов
- Google:
get_answer_box(),get_currency_converter(),get_time() - Yandex:
get_currency_converter(),get_time(),get_ip_address(),get_maps(),get_music(),get_lyrics(),get_quotes(),get_facts()
- Google:
Technical Details
- Покрытие документации: увеличено с 80% до 95%
- Готовность к продакшену: 100% - проект полностью документирован
Impact
- Документация: Пользователи получают полную информацию о всех возможностях библиотеки
- Примеры: Добавлены детальные примеры использования всех методов API
- Типы данных: Полная документация всех dataclass и перечислений
- Обратная совместимость: 100% - API не изменился
[1.2.6] - 2025-01-16
Fixed
- 🏗️ Архитектура: Добавлен базовый метод
search()вBaseClientиAsyncBaseClient- Исправлена проблема с
GoogleSpecialBlocksиYandexSpecialBlocks - Методы
get_onebox_documents(),get_searchsters()и другие теперь работают корректно - Сохранена обратная совместимость - все существующие клиенты продолжают работать
- Исправлена проблема с
- 🧹 Код: Убраны
# pylint: disable=no-memberкомментарии из Special Blocks клиентов - 🔧 Метод check_indexing(): Теперь использует базовый
search()без предупреждений линтера
Technical Details
BaseClient.search()- базовая реализация для простых поисковых запросовAsyncBaseClient.search()- асинхронная версия- Special Blocks клиенты теперь могут использовать
self.search()без проблем - GoogleClient и YandexClient продолжают использовать свои переопределенные реализации
[1.2.5] - 2025-01-15
Fixed
- 🔧 Исправлена логика семафора - правильное ограничение активных запросов на уровне клиента
- ⚡ Улучшена производительность - семафор теперь ждет завершения одного из первых 10 запросов перед отправкой 11-го
- 📊 Добавлен мониторинг - метод
get_concurrent_status()для отслеживания состояния семафора - 🛡️ Гарантированное ограничение - максимум 10 активных запросов одновременно, остальные ждут в очереди
Technical Details
- AsyncBaseClient: исправлена логика семафора в
_make_request - Семафор: теперь ограничивает активные запросы, а не отдельные вызовы
- Мониторинг: добавлен
_active_requestsсчетчик иget_concurrent_status() - Тестирование: подтверждена работа ограничений 1, 3, 10 потоков
Impact
- Правильность: семафор работает как ожидается - ждет освобождения слотов
- Производительность: оптимальное использование API без превышения лимитов
- Мониторинг: возможность отслеживать состояние семафора в реальном времени
- Обратная совместимость: 100% - API не изменился
[1.2.4] - 2025-01-15
Added
- 🔒 Жесткое ограничение потоков - максимум 10 одновременных запросов по умолчанию
- ⚙️ Настраиваемый лимит - параметр
max_concurrentдля изменения ограничения - 🧪 Тест ограничений -
test_concurrent_limit.pyдля проверки работы семафора - 📚 Обновленная документация - примеры использования
max_concurrent
Technical Details
- AsyncBaseClient: добавлен
asyncio.Semaphore(max_concurrent)для ограничения потоков - AsyncGoogleClient: добавлен параметр
max_concurrent=10по умолчанию - AsyncYandexClient: добавлен параметр
max_concurrent=10по умолчанию - README.md: обновлена таблица параметров с
max_concurrent - Тестирование: подтверждена работа ограничений 1, 3, 10 потоков
Impact
- Безопасность: предотвращение случайного превышения лимитов API
- Производительность: оптимальная нагрузка на API (10 потоков)
- Гибкость: возможность настройки для разных сценариев
- Обратная совместимость: 100% - старый код работает без изменений
[1.2.3] - 2025-01-15
Fixed
- 🚨 КРИТИЧЕСКИЙ БАГ ИСПРАВЛЕН - Google AsyncClient теперь возвращает реальные результаты
- 🔧 Исправлен парсинг Google API - используется правильная структура
response.results.grouping.group - 📝 Унифицирован парсинг - Google и Yandex API используют одинаковую структуру XML
- 🎯 Исправлено извлечение snippet - из
passages.passageдля всех клиентов - 🧹 Улучшено качество кода - применено Black форматирование, Pylint 9.38/10
Technical Details
- Google AsyncClient: исправлен
_extract_resultsдля парсингаresponse.results.grouping.group - Google AsyncClient: исправлен
_create_search_resultдля извлечения snippet из passages - AsyncBaseClient: улучшен универсальный парсинг для Google/Yandex API
- AsyncBaseClient: добавлена поддержка
showing_results_for,correct,fixtype - Структура API: подтверждено, что Google и Yandex используют одинаковую XML структуру
Impact
- До исправления: Google AsyncClient возвращал пустые результаты (0 results)
- После исправления: Google AsyncClient возвращает реальные результаты (6+ results)
- Обратная совместимость: 100% - API не изменился
- Производительность: улучшена унификация парсинга
[1.2.2] - 2025-01-15
Fixed
- 🚨 КРИТИЧЕСКИЙ БАГ ИСПРАВЛЕН - Query в ответах больше не пустая строка
- 🔧 Исправлена передача query - во всех клиентах query корректно передается из параметров
- 📝 Исправлены методы парсинга - _parse_response и _parse_results получают query из параметров
- 🎯 Исправлены все типы поиска - web, news, images, maps, ads
- 🧹 Улучшено качество кода - исправлены Pylint предупреждения (9.91/10)
Technical Details
- AsyncBaseClient: передача query в _parse_response(text, search_type, query)
- BaseClient: передача query в _parse_results(response, query)
- Google клиенты: все методы поиска исправлены
- Yandex клиенты: все методы поиска исправлены
- Специализированные методы: news, images, maps исправлены
- Pylint: исправлены no-else-return, no-member, arguments-renamed
Impact
- До исправления:
response.queryвсегда была пустой строкой - После исправления:
response.queryсодержит исходный поисковый запрос - Обратная совместимость: 100% - API не изменился
[1.2.1] - 2025-01-15
Fixed
- 🚨 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ - Асинхронные клиенты теперь используют правильные эндпойнты
- 🔧 Исправлены эндпойнты - AsyncGoogleClient и AsyncYandexClient используют корректные URL
- 📝 Исправлен python_version - в pyproject.toml изменен с "1.2.0" на "3.10"
- 🎨 Улучшено форматирование - применен Black к 3 файлам для соответствия стандартам
- 🧹 Синхронизация версий - все файлы проекта теперь используют версию 1.2.1
Technical Details
- AsyncGoogleClient: теперь использует
"http://xmlriver.com/search/xml" - AsyncYandexClient: теперь использует
"https://xmlriver.com/search_yandex/xml" - AsyncBaseClient: убран неправильный
BASE_URL = "https://xmlriver.com/api" - Форматирование: применен Black к
async_base_client.py,images.py,base_client.py - MyPy: исправлена критическая ошибка с
python_version
[1.2.0] - 2025-01-15
Added
- 🚀 Улучшенный Retry механизм - настраиваемые повторы с экспоненциальным backoff
- ⚙️ Гибкая конфигурация - настройка таймаутов, retry параметров и контроля повторов
- 📊 Умная стратегия задержек - экспоненциальная задержка: 1с → 2с → 4с → 8с
- 🔧 Контроль retry - возможность отключить повторы для продвинутых пользователей
- 📚 Подробная документация - детальные примеры конфигурации и лучшие практики
Enhanced
- 🎯 Поддержка всех клиентов - GoogleClient, AsyncGoogleClient, YandexClient, AsyncYandexClient
- 🧪 Расширенное тестирование - 102 теста включая валидацию retry механизма
- 📈 Качество кода - Pylint 9.68/10, улучшенная обработка ошибок
- 🔄 Обратная совместимость - существующий код работает без изменений
Technical Details
- Retry параметры:
timeout,max_retries,retry_delay,enable_retry - Значения по умолчанию: 60с таймаут, 3 повтора, 1.0с базовая задержка, retry включен
- Экспоненциальный backoff:
delay = retry_delay * (2 ** attempt) - Обработка ошибок: Повторы при
RequestExceptionиNetworkError - Async поддержка: Полная поддержка retry в async клиентах с
asyncio.sleep()
Examples
# Стандартное использование (без изменений)
client = GoogleClient(user_id=123, api_key="key")
# Кастомная конфигурация retry
client = GoogleClient(
user_id=123,
api_key="key",
timeout=120, # 2 минуты
max_retries=5, # 5 попыток
retry_delay=2.0 # 2с базовая задержка
)
# Отключить retry для продвинутых пользователей
client = GoogleClient(user_id=123, api_key="key", enable_retry=False)[1.1.1] - 2025-01-15
Fixed
- 🔧 Исправления линтинга - улучшено качество кода
- 🧹 Удалены неиспользуемые импорты - очищен код от W0611 ошибок
- 📝 Исправлен порядок импортов - C0411, C0413 ошибки устранены
- 🎯 Добавлены hasattr() проверки - исправлены Union типы в formatters.py
- 📦 Установлены types-requests - улучшена типизация MyPy
- 🔨 Исправлены конструкторы - OneBoxDocument и KnowledgeGraph
- ✂️ Разбиты длинные строки - C0301 ошибки устранены
Technical Details
- Pylint: 9.63/10 (было 8.70/10, +0.94)
- MyPy: 197 ошибок (было 232, -35 ошибок)
- Black: ✅ Все файлы отформатированы
- Тесты: 92/92 проходят успешно
- Покрытие: 62% стабильно
[1.1.0] - 2025-01-15
Added
- ⚡ Асинхронная поддержка с aiohttp
- 🔄 AsyncGoogleClient - асинхронный клиент для Google
- 🔄 AsyncYandexClient - асинхронный клиент для Yandex
- 📚 Примеры асинхронного использования в docs/examples_async.py
- 🧪 Тесты для асинхронных клиентов (test_async_google.py, test_async_yandex.py)
- 📖 Обновленная документация с примерами асинхронности
Technical Details
- Новая зависимость: aiohttp>=3.8.0
- Поддержка: async/await, asyncio.gather(), контекстные менеджеры
- Производительность: Параллельные запросы до 10 одновременных
- Совместимость: Полная обратная совместимость с синхронными клиентами
[1.0.2] - 2025-01-15
Fixed
- Исправлена ошибка в pyproject.toml (python_version)
- Улучшена стабильность работы с API
- Исправлены мелкие баги в валидации параметров
[1.0.1] - 2025-01-15
Fixed
- Исправлена ошибка с кодировкой UTF-8 в ответах API
- Улучшена обработка ошибок сети
- Исправлена проблема с таймаутами
[1.0.0] - 2025-01-15
Added
- 🚀 Первый релиз XMLRiver Pro
- ✅ Полная поддержка Google Search API через xmlriver.com
- ✅ Полная поддержка Yandex Search API через xmlriver.com
- ✅ Органический поиск с полной типизацией
- ✅ Поиск по новостям с фильтрами времени
- ✅ Поиск по изображениям (размер, цвет, тип)
- ✅ Поиск по картам с координатами
- ✅ Рекламные блоки (верхние и нижние)
- ✅ Специальные блоки (OneBox, Knowledge Graph, колдунщики)
- ✅ Полная типизация для Python 3.10+
- ✅ Модульная архитектура
- ✅ 66 тестов с покрытием 57%
- ✅ Специализированные исключения
- ✅ Валидация параметров
- ✅ Обработка всех официальных кодов ошибок XMLRiver
- ✅ Поддержка официальных ограничений API:
- Максимум 10 потоков для каждой системы
- Дневные лимиты: Google 200k, Yandex 150k запросов
- Рекомендуемый таймаут 60 секунд
- ✅ Примеры многопоточного использования
- ✅ Адаптивное управление скоростью запросов
- ✅ Контроль дневных лимитов
- ✅ Полная документация с примерами
Technical Details
- Python: 3.10+
- Dependencies: requests, xmltodict
- Testing: pytest, pytest-cov
- Linting: black, pylint, mypy
- Coverage: 57%
- Pylint Score: 9.38/10
- MyPy: 0 errors
API Coverage
- Google API: 100% покрытие всех типов поиска
- Yandex API: 100% покрытие всех типов поиска
- Error Handling: Все 25 официальных кодов ошибок
- Rate Limiting: Поддержка официальных ограничений
[0.14.0] - 2025-01-15
Added
- 🎯 Fork оригинальной библиотеки xmlriver
- 📚 Скачивание официальной документации xmlriver.com
- 🔧 Анализ покрытия API и выявление недостающих функций
Changed
- 🔄 Полная переработка архитектуры
- 🔄 Переписан весь код с нуля
- 🔄 Добавлена полная типизация
Removed
- ❌ Удален устаревший код оригинальной библиотеки
- ❌ Удалены неиспользуемые зависимости
Как читать этот Changelog
Типы изменений:
- Added - новые функции
- Changed - изменения в существующей функциональности
- Deprecated - функции, которые будут удалены в будущих версиях
- Removed - удаленные функции
- Fixed - исправления ошибок
- Security - исправления уязвимостей
Версионирование:
- MAJOR (1.0.0 → 2.0.0) - кардинальные изменения, нарушающие обратную совместимость
- MINOR (1.0.0 → 1.1.0) - новые функции с сохранением обратной совместимости
- PATCH (1.0.0 → 1.0.1) - исправления ошибок
Как обновляться:
# Обновление до последней версии
pip install --upgrade xmlriver-pro
# Обновление до конкретной версии
pip install xmlriver-pro==1.0.0
# Проверка текущей версии
python -c "import xmlriver_pro; print(xmlriver_pro.__version__)"Уведомления об обновлениях:
- 📧 Email: seo@controlseo.ru
- 🐛 Issues: GitHub Issues
- 💬 Discussions: GitHub Discussions
- ⭐ Watch репозиторий на GitHub для уведомлений