Python client for FIAS Public API - Russian address database
Project description
🏠 FIAS Public API Python Client
🚀 Простой и удобный Python клиент для работы с публичным API ФИАС (Федеральная информационная адресная система)
✨ Возможности
| Возможность | Описание | Статус |
|---|---|---|
| 🔍 Поиск адресов | Текстовый поиск адресов с поддержкой русского языка | ✅ |
| 📋 Детали объектов | Получение полной информации об адресных объектах | ✅ |
| 🔐 Управление токенами | Автоматическое получение токена аутентификации | ✅ |
| ⚡ Поддержка async | Синхронные и асинхронные операции | ✅ |
| 🔄 Опциональный retry | Декоратор для повторных попыток при ошибках (по желанию) | ✅ |
📚 Реализованные разделы API
Библиотека реализует методы из следующих разделов FIAS Public API:
- AddressInfo - Работа с адресными объектами (получение регионов, поиск по различным критериям, проверка иерархии)
- Search - Поиск адресов по текстовым строкам и получение подсказок
- Location - Определение населенного пункта по IP адресу
Источник API спецификации: Swagger UI FIAS Public Service
⚠️ Важно: Первый запрос к API ФИАС часто возвращает 500 ошибку или ConnectionResetError. Для обработки таких ситуаций библиотека предоставляет опциональный декоратор
retry_on_error, который можно использовать для автоматических повторных попыток.
📊 Статистика проекта
🚀 Быстрый старт
Минимальный пример
from fias_public_api import get_token_sync, SyncFPA
# Получаем токен автоматически
token = get_token_sync()
# Создаем клиент
api = SyncFPA(token)
# Ищем адрес
results = api.search("Москва, Красная площадь")
print(f"Найдено: {len(results)} результатов")
# Получаем детали первого результата
if results:
details = api.details_by_id(results[0]['id'])
print(f"Адрес: {details.get('address', 'N/A')}")
Асинхронный пример
import asyncio
from fias_public_api import get_token_async, AsyncFPA
async def main():
# Получаем токен автоматически
token = await get_token_async()
# Создаем асинхронный клиент
async with AsyncFPA(token) as api:
# Ищем адрес
results = await api.search("Москва, Красная площадь")
print(f"Найдено: {len(results)} результатов")
# Получаем детали первого результата
if results:
details = await api.details_by_id(results[0]['id'])
print(f"Адрес: {details.get('address', 'N/A')}")
asyncio.run(main())
📦 Установка
Установка из PyPI (рекомендуется)
Установите пакет из PyPI:
pip install fias-public-api
Установка из GitHub
pip install git+https://github.com/quonaro/fias-public-api
Зависимости
| Пакет | Версия | Описание |
|---|---|---|
requests |
>=2.32.5 |
HTTP библиотека для API запросов |
httpx |
>=0.28.1 |
Асинхронная HTTP библиотека |
🔧 Использование
Базовые сценарии
1. Поиск адресов
# Простой поиск
results = api.search("Москва")
# Поиск с кастомным URL
results = api.search("Санкт-Петербург", url="https://custom-fias.ru/api")
# Обработка результатов
for result in results:
print(f"ID: {result['id']}")
print(f"Адрес: {result['address']}")
print(f"Тип: {result['type']}")
print("---")
2. Получение деталей объекта
from fias_public_api import AddressType
# Получаем детали по ID
object_id = 12345
details = api.details_by_id(object_id, address_type=AddressType.MUNICIPALITY)
# Получаем детали по GUID
object_guid = "some-guid-string"
details = api.details_by_guid(object_guid, address_type=AddressType.ADMINISTRATIVE)
# Анализируем структуру ответа
print("Доступные поля:")
for key, value in details.items():
if isinstance(value, (str, int, float, bool)) and value:
print(f" {key}: {value}")
3. Обработка ошибок
from requests.exceptions import HTTPError, RequestException
try:
results = api.search("Несуществующий адрес")
except HTTPError as e:
if e.response.status_code == 404:
print("Адрес не найден")
elif e.response.status_code == 401:
print("Неверный токен")
else:
print(f"HTTP ошибка: {e}")
except RequestException as e:
print(f"Ошибка сети: {e}")
except Exception as e:
print(f"Неизвестная ошибка: {e}")
📚 Справочник API
Синхронные классы
SyncFPA
Основной класс клиента для синхронных операций с FIAS Public API.
Конструктор
SyncFPA(token: str, address_type: int | AddressType = 2)
Параметры:
token(str) - Токен аутентификации для доступа к APIaddress_type(int | AddressType, optional) - Тип адреса по умолчанию (по умолчанию 2 - MUNICIPALITY)
Методы
search(search_string: str, url: str = "https://fias-public-service.nalog.ru/api/spas/v2.0/GetAddressHint") -> List[Dict]
Поиск адресов по текстовой строке.
Параметры:
search_string(str) - Текст для поиска (адрес, улица, город и т.д.)url(str, optional) - URL конечной точки API для поиска (по умолчанию используется стандартный endpoint)
Возвращает: Список найденных адресов в виде словарей
Пример ответа:
[
{
"id": 12345,
"address": "г Москва, Красная площадь",
"type": "город",
"level": 1
}
]
details_by_id(object_id: int, address_type: int | AddressType = 2) -> Dict
Получить детальную информацию об адресном объекте по его ID.
Параметры:
object_id(int) - ID объекта ФИАСaddress_type(int | AddressType) - Тип адреса (по умолчанию 2 - MUNICIPALITY)
Возвращает: Словарь с детальной информацией об объекте
details_by_guid(object_guid: str, address_type: int | AddressType = 2) -> Dict
Получить детальную информацию об адресном объекте по его GUID.
Параметры:
object_guid(str) - GUID объекта ФИАСaddress_type(int | AddressType) - Тип адреса (по умолчанию 2 - MUNICIPALITY)
Возвращает: Словарь с детальной информацией об объекте
get_regions() -> Dict
Получить список регионов.
Возвращает: Словарь со списком регионов
get_address_items(path: str | None = None, address_level: int | None = None, address_levels: list[int] | None = None, name_part: str | None = None, address_type: int | AddressType | None = None, include_descendants: bool | None = None) -> Dict
Получить список дочерних элементов, соответствующих заданным фильтрам.
Параметры:
path(str, optional) - Путь к родительскому элементуaddress_level(int, optional) - Уровень адресаaddress_levels(list[int], optional) - Список уровней адресовname_part(str, optional) - Часть названия для поискаaddress_type(int | AddressType, optional) - Тип адресаinclude_descendants(bool, optional) - Включать ли дочерние элементы
Возвращает: Словарь со списком адресных элементов
get_details(object_id: int) -> Dict
Получить дополнительную информацию для заданного адресного элемента.
Параметры:
object_id(int) - Идентификатор адресного элемента
Возвращает: Словарь с дополнительной информацией
is_descendant(ancestor: int, descendant: int, address_type: int | AddressType | None = None) -> Dict
Проверка, является ли элемент ancestor родительским элементом в иерархии для элемента descendant.
Параметры:
ancestor(int) - Идентификатор родительского элементаdescendant(int) - Идентификатор дочернего элементаaddress_type(int | AddressType, optional) - Вид представления адреса
Возвращает: Словарь с результатом проверки
has_descendants(parent: int, up_to_level: int, address_type: int | AddressType | None = None) -> Dict
Проверка, имеет ли элемент parent дочерние элементы до уровня up_to_level.
Параметры:
parent(int) - Идентификатор родительского элементаup_to_level(int) - Максимальный уровень дочерних элементовaddress_type(int | AddressType, optional) - Вид представления адреса
Возвращает: Словарь с результатом проверки
get_address_item_by_cadastral_number(cadastral_number: str, address_type: int | AddressType | None = None) -> Dict
Получение адресного элемента по кадастровому номеру.
Параметры:
cadastral_number(str) - Кадастровый номерaddress_type(int | AddressType, optional) - Тип адреса
Возвращает: Словарь с адресным элементом
get_fias_object_types() -> Dict
Получение типов объектов ФИАС.
Возвращает: Словарь со списком типов объектов ФИАС
search_address_items(search_string: str, address_type: int | AddressType | None = None) -> Dict
Получение адресных элементов, соответствующих заданной произвольной строке адреса.
Параметры:
search_string(str) - Адрес строкойaddress_type(int | AddressType, optional) - Вид представления адреса
Возвращает: Словарь со списком адресных элементов
get_address_hint(search_string: str | None = None, address_type: int | AddressType | None = None, up_to_level: int | None = None, locations_boost: int | None = None, search_non_active: bool = False) -> Dict
Сервис для организации стандартизированного ввода и поиска адреса (унифицированная адресная строка).
Параметры:
search_string(str, optional) - Адрес строкой (для GET запроса)address_type(int | AddressType, optional) - Вид представления адресаup_to_level(int, optional) - Максимальный уровень поискаlocations_boost(int, optional) - Приоритет локацийsearch_non_active(bool) - Искать неактивные адреса
Возвращает: Словарь со списком подсказок адресов
search_address_item(search_string: str, address_type: int | AddressType | None = None) -> Dict
Получение адресного элемента, соответствующего заданной произвольной строке адреса.
Параметры:
search_string(str) - Адрес строкойaddress_type(int | AddressType, optional) - Вид представления адреса
Возвращает: Словарь с адресным элементом
get_location_by_ip(ip: str, address_type: int | AddressType | None = None) -> Dict
Получение населённого пункта по IP адресу.
Параметры:
ip(str) - IP адресaddress_type(int | AddressType, optional) - Тип представления возвращаемых адресных объектов
Возвращает: Словарь с адресными объектами
Асинхронные классы
AsyncFPA
Основной класс клиента для асинхронных операций с FIAS Public API.
Конструктор
AsyncFPA(token: str, address_type: int | AddressType = 2)
Параметры:
token(str) - Токен аутентификации для доступа к APIaddress_type(int | AddressType, optional) - Тип адреса по умолчанию (по умолчанию 2 - MUNICIPALITY)
Контекстный менеджер
async with AsyncFPA(token) as api:
results = await api.search("Москва")
Методы
Все методы из SyncFPA доступны в асинхронной версии с поддержкой async/await:
async get_regions() -> Dictasync get_address_items(...) -> Dictasync get_details(object_id: int) -> Dictasync is_descendant(ancestor: int, descendant: int, ...) -> Dictasync has_descendants(parent: int, up_to_level: int, ...) -> Dictasync details_by_id(object_id: int, ...) -> Dictasync details_by_guid(object_guid: str, ...) -> Dictasync get_address_item_by_cadastral_number(cadastral_number: str, ...) -> Dictasync get_fias_object_types() -> Dictasync search_address_items(search_string: str, ...) -> Dictasync get_address_hint(...) -> Dictasync search_address_item(search_string: str, ...) -> Dictasync get_location_by_ip(ip: str, ...) -> Dictasync search(search_string: str, ...) -> List[Dict]
Функции
get_token_sync(url: str = "https://fias.nalog.ru/") -> str
Получить токен аутентификации из сервиса ФИАС (синхронно).
Параметры:
url(str) - Базовый URL сервиса ФИАС
Возвращает: Строка с токеном аутентификации
Исключения:
ValueError- Если не удалось получить токенrequests.HTTPError- Если HTTP запрос завершился ошибкой
get_token_async(url: str = "https://fias.nalog.ru/") -> str
Получить токен аутентификации из сервиса ФИАС (асинхронно).
Параметры:
url(str) - Базовый URL сервиса ФИАС
Возвращает: Строка с токеном аутентификации
Исключения:
ValueError- Если не удалось получить токенhttpx.HTTPError- Если HTTP запрос завершился ошибкой
STANDART_HEADERS(token: str) -> Dict[str, str]
Создать стандартные заголовки для HTTP запросов.
Параметры:
token(str) - Токен аутентификации
Возвращает: Словарь с заголовками для HTTP запросов
AddressType (Enum)
Перечисление типов адресов в системе ФИАС.
Значения:
AddressType.ADMINISTRATIVE = 1- Административный типAddressType.MUNICIPALITY = 2- Муниципальный тип (по умолчанию)
retry_on_error(max_retries: int = 3, delay: float = 0.5, backoff: float = 2.0, exceptions: tuple | None = None)
Декоратор для автоматических повторных попыток при ошибках.
Параметры:
max_retries(int) - Максимальное количество попыток (по умолчанию 3)delay(float) - Начальная задержка между попытками в секундах (по умолчанию 0.5)backoff(float) - Множитель для увеличения задержки (по умолчанию 2.0)exceptions(tuple | None) - Кортеж исключений, при которых нужно повторять попытку (по умолчанию все исключения)
Пример использования:
from fias_public_api import SyncFPA, get_token_sync, retry_on_error
from requests.exceptions import ConnectionError, HTTPError
token = get_token_sync()
api = SyncFPA(token)
# Применяем декоратор к функции
@retry_on_error(
max_retries=5,
delay=1.0,
backoff=2.0,
exceptions=(ConnectionError, HTTPError)
)
def search_with_retry(search_string):
return api.search_address_items(search_string)
# Использование
results = search_with_retry("Москва")
📖 Примеры использования
Все примеры доступны в папке examples/. Вот краткий обзор:
- 01_basic_usage.py - Базовое использование API
- 02_address_types.py - Работа с типами адресов
- 03_async_usage.py - Асинхронное использование
- 04_retry_decorator.py - Использование retry декоратора
- 05_address_info_methods.py - Методы AddressInfo
- 06_search_methods.py - Методы поиска
- 07_location_methods.py - Определение локации по IP
- 08_error_handling.py - Обработка ошибок
Подробнее см. examples/README.md
💡 Дополнительные примеры
Пример 1: Поиск улиц в городе
def find_streets_in_city(city_name: str, street_pattern: str = ""):
"""Найти улицы в указанном городе"""
api = SyncFPA(get_token_sync())
# Ищем город
cities = api.search(city_name)
if not cities:
print(f"Город '{city_name}' не найден")
return
city = cities[0]
print(f"Найден город: {city['address']}")
# Ищем улицы
search_query = f"{city_name}, {street_pattern}" if street_pattern else city_name
streets = api.search(search_query)
print(f"\nНайдено улиц: {len(streets)}")
for street in streets[:10]: # Показываем первые 10
print(f" - {street.get('address', 'N/A')}")
# Использование
find_streets_in_city("Москва", "Тверская")
Пример 2: Получение иерархии адреса
def get_address_hierarchy(address_id: int):
"""Получить полную иерархию адреса"""
api = SyncFPA(get_token_sync())
try:
details = api.details_by_id(address_id)
print("🏠 Иерархия адреса:")
print(f" Уровень: {details.get('level', 'N/A')}")
print(f" Тип: {details.get('type', 'N/A')}")
print(f" Название: {details.get('name', 'N/A')}")
print(f" Полный адрес: {details.get('address', 'N/A')}")
# Дополнительная информация
if 'coordinates' in details:
coords = details['coordinates']
print(f" Координаты: {coords.get('lat', 'N/A')}, {coords.get('lon', 'N/A')}")
except Exception as e:
print(f"❌ Ошибка при получении деталей: {e}")
# Использование
get_address_hierarchy(12345)
Пример 3: Пакетный поиск адресов (Async)
import asyncio
from typing import List, Dict
async def batch_address_search_async(queries: List[str], delay: float = 0.1) -> Dict[str, List]:
"""Пакетный поиск адресов с задержкой между запросами"""
token = await get_token_async()
async with AsyncFPA(token) as api:
results = {}
print(f"🔍 Начинаем поиск для {len(queries)} адресов...")
for i, query in enumerate(queries, 1):
try:
print(f" [{i}/{len(queries)}] Ищем: {query}")
search_results = await api.search(query)
results[query] = search_results
print(f" Найдено: {len(search_results)} результатов")
# Задержка между запросами
if i < len(queries):
await asyncio.sleep(delay)
except Exception as e:
print(f" ❌ Ошибка: {e}")
results[query] = []
return results
# Использование
addresses_to_search = [
"Москва, Красная площадь",
"Санкт-Петербург, Дворцовая площадь",
"Казань, Кремль",
"Новосибирск, Красный проспект"
]
results = asyncio.run(batch_address_search_async(addresses_to_search, delay=0.2))
Пример 4: Параллельные асинхронные операции
import asyncio
from typing import List
async def concurrent_address_search(addresses: List[str]) -> List[Dict]:
"""Поиск нескольких адресов параллельно"""
token = await get_token_async()
async with AsyncFPA(token) as api:
# Создаем задачи для параллельного выполнения
tasks = [api.search(address) for address in addresses]
# Выполняем все поиски параллельно
results = await asyncio.gather(*tasks, return_exceptions=True)
# Обрабатываем результаты
processed_results = []
for i, result in enumerate(results):
if isinstance(result, Exception):
print(f"Ошибка при поиске '{addresses[i]}': {result}")
processed_results.append([])
else:
processed_results.append(result)
return processed_results
# Использование
addresses = ["Москва", "Санкт-Петербург", "Казань", "Новосибирск"]
results = asyncio.run(concurrent_address_search(addresses))
🧪 Тестирование
Для запуска тестов используйте pytest:
# Установите зависимости для разработки
pip install -e ".[dev]"
# Запустите все тесты (с подробным выводом)
pytest
# Запустите тесты с максимально подробным выводом
pytest -vv
# Запустите тесты с полным traceback (как в Python интерпретаторе)
pytest --tb=long
# Запустите тесты с показом локальных переменных при ошибках
pytest --showlocals
# Запустите конкретный тестовый файл
pytest tests/test_sync.py
# Запустите конкретный тест
pytest tests/test_sync.py::TestSyncFPA::test_get_regions
# Запустите тесты с выводом print statements
pytest -s
# Запустите тесты и покажите 10 самых медленных
pytest --durations=10
Настройка вывода pytest
Pytest настроен для вывода, похожего на Python интерпретатор:
-vv- подробный вывод (включен по умолчанию)--tb=short- короткий traceback (включен по умолчанию)--showlocals- показ локальных переменных при ошибках (включен по умолчанию)--color=yes- цветной вывод (включен по умолчанию)
Все эти настройки находятся в pyproject.toml в секции [tool.pytest.ini_options].
📄 Лицензия
Этот проект распространяется под лицензией MIT. Подробности см. в файле LICENSE.
🔗 Полезные ссылки
- 📦 PyPI Package - Установка через PyPI
- 🌐 Официальный сайт ФИАС
- 📖 Swagger UI FIAS Public Service - API документация
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fias_public_api-1.0.3.tar.gz.
File metadata
- Download URL: fias_public_api-1.0.3.tar.gz
- Upload date:
- Size: 31.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40681271808428d78c1205e3d7c2ebbc4bfcf3155a7b87a32966028f60d711d3
|
|
| MD5 |
701931e6c23c0f356ca648d947770c51
|
|
| BLAKE2b-256 |
67fe5326f251191e1a8a9f69d7bcb74b201e30b27fa5198ceaf6096d615316f5
|
Provenance
The following attestation bundles were made for fias_public_api-1.0.3.tar.gz:
Publisher:
publish.yml on quonaro/fias-public-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fias_public_api-1.0.3.tar.gz -
Subject digest:
40681271808428d78c1205e3d7c2ebbc4bfcf3155a7b87a32966028f60d711d3 - Sigstore transparency entry: 761894850
- Sigstore integration time:
-
Permalink:
quonaro/fias-public-api@5c83a6dbe5d9fa628f21bffa195cb5229941068e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/quonaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5c83a6dbe5d9fa628f21bffa195cb5229941068e -
Trigger Event:
push
-
Statement type:
File details
Details for the file fias_public_api-1.0.3-py3-none-any.whl.
File metadata
- Download URL: fias_public_api-1.0.3-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a5615494b01ad535cb75268a541049a1c6ebff60b94dd02b4084597c44e7319
|
|
| MD5 |
3f17ab378e6ff95ddf16ad0fcf61f196
|
|
| BLAKE2b-256 |
9f761b9a94c2c141797b95061cc92916c2df56a5ab7c71304cbde491f579bbdf
|
Provenance
The following attestation bundles were made for fias_public_api-1.0.3-py3-none-any.whl:
Publisher:
publish.yml on quonaro/fias-public-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fias_public_api-1.0.3-py3-none-any.whl -
Subject digest:
8a5615494b01ad535cb75268a541049a1c6ebff60b94dd02b4084597c44e7319 - Sigstore transparency entry: 761894852
- Sigstore integration time:
-
Permalink:
quonaro/fias-public-api@5c83a6dbe5d9fa628f21bffa195cb5229941068e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/quonaro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5c83a6dbe5d9fa628f21bffa195cb5229941068e -
Trigger Event:
push
-
Statement type: