FIAS_RU 🇷🇺
Максимально простой и удобный Python SDK для работы с ФИАС (Федеральная информационная адресная система)
✨ Особенности
- 🚀 Максимально простой 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_TOKENenvtimeout(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}")
🤝 Вклад в проект
Мы приветствуем вклад в проект!
- Fork репозиторий
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Откройте Pull Request
📄 Лицензия
MIT License - см. файл LICENSE
🔗 Полезные ссылки
⭐ Поддержка
Если вам понравилась библиотека, поставьте звезду на GitHub!
Нашли баг? Создайте issue
Сделано с ❤️ командой Eclips
Metadata
Release files for FIAS-RU 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fias_ru-0.1.2.tar.gz | 17.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fias_ru-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.5 kB
Release files / fias_ru-0.1.2.tar.gz
| Download URL | fias_ru-0.1.2.tar.gz |
|---|---|
| Size | 17.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ce5f60ac78b9b6c4b516feb4790f96a69dde70d548698e7081ec323b16f11475
|
|
BLAKE2b-256 checksum How to use checksums |
1adaf77d14ebd5e4f390aabcf54d1a6d761ee8dac6705c237d6de4c898d26b5a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|
Release files / fias_ru-0.1.2-py3-none-any.whl
| Download URL | fias_ru-0.1.2-py3-none-any.whl |
|---|---|
| Size | 18.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f1e59feb70b501651f4f3cb4edbf504f8a0a9c91d0478e769c4a7bd188ab0de7
|
|
BLAKE2b-256 checksum How to use checksums |
8a63255fbd98948eb32f57e9fac9a01f53f52ae663064d0d40b9e69b006e7d38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|