Skip to main content

Простой и надёжный SDK для работы с ФИАС API

Project description

FIAS_RU 🇷🇺

Максимально простой и удобный Python SDK для работы с ФИАС (Федеральная информационная адресная система)

Python 3.8+ License: MIT


✨ Особенности

  • 🚀 Максимально простой API - начните работать за 2 строки кода
  • 🧠 Умный поиск - автоматически определяет тип запроса (строка, ID, GUID, кадастровый номер)
  • Быстрый - connection pooling и rate limiting из коробки
  • 💡 Автокомплит - как в Яндекс/Google картах
  • 🔒 Надёжный - автоматические retry при сетевых ошибках
  • 📦 Нулевые зависимости - только Python stdlib + httpx + pydantic
  • 🎯 Типизированный - полная поддержка type hints для IDE
  • 🔄 Sync + Async - работает в любом контексте

📦 Установка

pip install FIAS-RU

🚀 Быстрый старт

1. Получите токен

Зарегистрируйтесь и получите токен на fias.nalog.ru

2. Настройте переменную окружения

export FIAS_TOKEN="your_token_here"

Или создайте .env файл:

FIAS_TOKEN=your_token_here

3. Используйте!

from FIAS_RU import SPAS

# Инициализация (автоматически читает токен из env)
spas = SPAS()

# Поиск адреса
address = spas.search("Москва, Тверская 1")
print(address.full_name)  # "г Москва, ул Тверская, д 1"
print(address.postal_code)  # "125009"
print(address.oktmo)  # "45000000"

📚 Примеры использования

Умный поиск (автоопределение типа запроса)

from FIAS_RU import SPAS

spas = SPAS()

# Поиск по строке
addr = spas.search("Москва, Тверская 1")

# Поиск по GUID
addr = spas.search("77000000-0000-0000-0000-000000000000")

# Поиск по кадастровому номеру
addr = spas.search("77:01:0001001:1")

# Поиск по ID
addr = spas.search(123456)
addr = spas.search("123456")  # Тоже работает!

Автокомплит для форм ввода

# Получить подсказки
hints = spas.autocomplete("Москва, Тв")

for hint in hints[:5]:
    print(hint.full_name)
    # г Москва, ул Тверская
    # г Москва, ул Тверская-Ямская 1-я
    # г Москва, ул Тверская-Ямская 2-я
    # ...

# С ограничением по уровню (только улицы)
hints = spas.autocomplete("Москва", up_to_level=7, limit=10)

Быстрый доступ к деталям адреса

address = spas.search("Москва, Красная площадь 1")

# Все детали доступны как свойства
print(address.postal_code)      # "109012"
print(address.oktmo)            # "45000000"
print(address.okato)            # "45000000000"
print(address.ifns_ul)          # "7701"
print(address.ifns_fl)          # "7701"
print(address.kladr_code)       # "7700000000000"
print(address.cadastral_number) # "77:01:0001001:1"

# Красивое представление
print(address.level_name)   # "Здание"
print(address.short_name)   # "Красная площадь 1" (без "г Москва")

Работа с регионами

# Получить все регионы РФ
regions = spas.get_regions()

for region in regions[:5]:
    print(f"{region.region_code}: {region.full_name}")
    # 01: Республика Адыгея
    # 02: Республика Башкортостан
    # 03: Республика Бурятия
    # ...

Экспорт данных

address = spas.search("Москва, Тверская 1")

# В словарь
data = address.to_dict()

# В JSON
json_str = address.to_json(indent=2)

# Только основные поля (без деталей)
data = address.to_dict(include_details=False)

Обработка ошибок

from FIAS_RU import SPAS, FIASError, FIASValidationError

spas = SPAS()

try:
    address = spas.search("Москва")
except FIASValidationError as e:
    print(f"Ошибка валидации: {e}")
except FIASError as e:
    print(f"Ошибка ФИАС: {e}")

Context manager (автоматическое закрытие соединений)

from FIAS_RU import SPAS

with SPAS() as spas:
    address = spas.search("Москва, Тверская 1")
    print(address.full_name)
# Соединения автоматически закрыты

Настройка клиента

from FIAS_RU import SPAS, AddressType

spas = SPAS(
    base_url="https://fias-public-service.nalog.ru",  # По умолчанию
    token="your_token",                                # Или из FIAS_TOKEN env
    timeout=60.0,                                      # Таймаут запросов (сек)
    max_retries=5,                                     # Количество повторов
    default_address_type=AddressType.ADMINISTRATIVE,   # Тип адреса по умолчанию
    max_connections=100,                               # Connection pool
    rate_limit_requests=100,                           # Лимит запросов
    rate_limit_window=60.0                             # За 60 секунд
)

🎯 Продвинутые примеры

Batch поиск нескольких адресов

from FIAS_RU import SPAS
from concurrent.futures import ThreadPoolExecutor

spas = SPAS()

addresses_to_search = [
    "Москва, Тверская 1",
    "Санкт-Петербург, Невский проспект 1",
    "Казань, Кремлевская 1"
]

# Параллельный поиск
with ThreadPoolExecutor(max_workers=10) as executor:
    results = list(executor.map(spas.search, addresses_to_search))

for addr in results:
    if addr:
        print(f"{addr.full_name} - {addr.postal_code}")

Создание формы автокомплита (Django/Flask)

from flask import Flask, request, jsonify
from FIAS_RU import SPAS

app = Flask(__name__)
spas = SPAS()

@app.route('/api/address/autocomplete')
def autocomplete():
    query = request.args.get('q', '')
    if len(query) < 2:
        return jsonify([])
    
    hints = spas.autocomplete(query, limit=10)
    return jsonify([
        {
            'id': hint.id,
            'text': hint.full_name,
            'html': hint.html  # С подсветкой совпадений
        }
        for hint in hints
    ])

@app.route('/api/address/details/<int:address_id>')
def address_details(address_id):
    address = spas.search(address_id)
    if not address:
        return jsonify({'error': 'Not found'}), 404
    
    return jsonify(address.to_dict())

Валидация адресов из файла

from FIAS_RU import SPAS
import csv

spas = SPAS()

with open('addresses.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    
    for row in reader:
        address_str = row['address']
        
        try:
            address = spas.search(address_str)
            if address:
                print(f"✅ {address_str}")
                print(f"   → {address.full_name}")
                print(f"   → ОКТМО: {address.oktmo}")
            else:
                print(f"❌ {address_str} - не найден")
        except Exception as e:
            print(f"⚠️ {address_str} - ошибка: {e}")

🔧 Конфигурация

Переменные окружения

# Обязательные
export FIAS_TOKEN="your_token_here"

# Опциональные
export FIAS_BASE_URL="https://fias-public-service.nalog.ru"  # По умолчанию
export FIAS_TIMEOUT=30                                         # Таймаут (сек)
export FIAS_MAX_RETRIES=3                                      # Количество повторов

Файл .env

FIAS_TOKEN=your_token_here
FIAS_BASE_URL=https://fias-public-service.nalog.ru
FIAS_TIMEOUT=30
FIAS_MAX_RETRIES=3

📖 API Reference

SPAS Client

__init__(base_url=None, token=None, **kwargs)

Инициализация клиента.

Параметры:

  • base_url (str, optional): URL API. По умолчанию: публичный API ФНС
  • token (str, optional): Токен авторизации. По умолчанию: из FIAS_TOKEN env
  • timeout (float): Таймаут запросов в секундах (по умолчанию: 30)
  • max_retries (int): Количество повторных попыток (по умолчанию: 3)
  • default_address_type (AddressType): Тип адреса по умолчанию

search(query, address_type=None) -> AddressItem | None

Умный поиск адреса. Автоматически определяет тип запроса.

Параметры:

  • query (str | int): Поисковый запрос (строка, ID, GUID, кадастровый номер)
  • address_type (AddressType, optional): Тип адреса

Возвращает: AddressItem или None

autocomplete(partial_address, limit=10, **kwargs) -> List[SearchHint]

Автокомплит адреса.

Параметры:

  • partial_address (str): Неполный адрес (минимум 1 символ)
  • limit (int): Максимум подсказок (по умолчанию: 10)
  • address_type (AddressType, optional): Тип адреса
  • up_to_level (int, optional): До какого уровня искать

Возвращает: List[SearchHint]

get_regions() -> List[AddressItem]

Получить все регионы РФ.

Возвращает: List[AddressItem]

get_details(address) -> AddressDetails | None

Получить детали адреса (ОКТМО, ИФНС, почтовый индекс и т.д.).

Параметры:

  • address (AddressItem | int): AddressItem или object_id

Возвращает: AddressDetails или None

AddressItem

Адресный элемент с удобными свойствами.

Основные поля:

  • object_id / id (int): ID объекта
  • object_guid / guid (str): GUID объекта
  • full_name (str): Полное название
  • short_name (str): Короткое название (без типа)
  • level_name (str): Название уровня ("Регион", "Город" и т.д.)
  • is_active (bool): Активен ли адрес

Быстрый доступ к деталям:

  • postal_code (str): Почтовый индекс
  • oktmo (str): Код ОКТМО
  • okato (str): Код ОКАТО
  • kladr_code (str): Код КЛАДР
  • cadastral_number (str): Кадастровый номер
  • ifns_ul (str): ИФНС для юридических лиц
  • ifns_fl (str): ИФНС для физических лиц

Методы:

  • to_dict(include_details=True): Преобразовать в словарь
  • to_json(indent=2): Преобразовать в JSON

🐛 Обработка ошибок

Типы исключений

  • FIASError - базовое исключение
  • FIASValidationError - ошибка валидации входных данных
  • FIASAPIError - ошибка API (5xx, проблемы с токеном)
  • FIASNetworkError - сетевая ошибка
  • FIASTimeoutError - таймаут запроса
  • FIASNotFoundError - объект не найден

Примеры

from FIAS_RU import SPAS, FIASError, FIASValidationError, FIASAPIError

spas = SPAS()

try:
    address = spas.search("М")  # Слишком короткий запрос
except FIASValidationError as e:
    print(f"Ошибка валидации: {e}")

try:
    address = spas.search("Несуществующий адрес 12345")
except FIASAPIError as e:
    print(f"Ошибка API: {e}")

try:
    address = spas.search("Москва, Тверская 1")
except FIASError as e:
    print(f"Общая ошибка ФИАС: {e}")

🤝 Вклад в проект

Мы приветствуем вклад в проект!

  1. Fork репозиторий
  2. Создайте feature branch (git checkout -b feature/amazing-feature)
  3. Commit изменения (git commit -m 'Add amazing feature')
  4. Push в branch (git push origin feature/amazing-feature)
  5. Откройте Pull Request

📄 Лицензия

MIT License - см. файл LICENSE


🔗 Полезные ссылки


⭐ Поддержка

Если вам понравилась библиотека, поставьте звезду на GitHub!

Нашли баг? Создайте issue


Сделано с ❤️ командой Eclips

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fias_ru-0.1.2.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fias_ru-0.1.2-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

File details

Details for the file fias_ru-0.1.2.tar.gz.

File metadata

  • Download URL: fias_ru-0.1.2.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for fias_ru-0.1.2.tar.gz
Algorithm Hash digest
SHA256 ce5f60ac78b9b6c4b516feb4790f96a69dde70d548698e7081ec323b16f11475
MD5 d84bd44715b9915764be2c71a71fa831
BLAKE2b-256 1adaf77d14ebd5e4f390aabcf54d1a6d761ee8dac6705c237d6de4c898d26b5a

See more details on using hashes here.

File details

Details for the file fias_ru-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: fias_ru-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 18.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for fias_ru-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f1e59feb70b501651f4f3cb4edbf504f8a0a9c91d0478e769c4a7bd188ab0de7
MD5 27a5e9a94a497fbfecf7d6721f63abdd
BLAKE2b-256 8a63255fbd98948eb32f57e9fac9a01f53f52ae663064d0d40b9e69b006e7d38

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page