HLR (Home Location Register) — это центральная база данных в сетях мобильных операторов, которая содержит подробную информацию о каждом зарегистрированном пользователе. HLR-запросы используются для получения данных о статусе и местоположении абонента, а также для проверки активности мобильного номера. Важность HLR-запросов особенно велика в бизнесе, телекоммуникациях и сервисах, работающих с мобильными пользователями.
Основные причины, почему HLR-запросы важны:
- Проверка активности номера – позволяет узнать, активен ли номер, чтобы не тратить ресурсы на неактивные контакты.
- Актуализация базы данных – поддерживает базу контактов в актуальном состоянии.
- Снижение затрат на SMS и звонки – экономит на отправке сообщений и звонков на недействительные номера.
- Определение местоположения и роуминга – помогает узнать, находится ли клиент в роуминге, и понять его регион.
- Защита от мошенничества – помогает выявить потенциальные подозрительные номера и предотвратить мошеннические действия.
В этой статье мы рассмотрим процесс создания и настройки простого веб-приложения для проверки активности мобильных номеров с использованием Flask и Exolve HLR API. Наше приложение предоставляет пользователю интерфейс для ввода номера телефона и получения информации о статусе абонента, владельце и коде региона через HLR-запрос. Мы также настроим Docker для автоматического запуска приложения, что позволит легко развернуть его на сервере.
Использованные ресурсы:
Перед использованием HLR, нужно переключить соответствующий тумблер в настройках уже созданного приложения:
Первый шаг — организация структуры проекта для нашего Flask-приложения. Мы создаем корневую папку, в которой будем хранить основной файл приложения, файл конфигурации и другие ресурсы.
Код |
---|
hlr_test_7007/ ├── app.py # Основной файл приложения Flask ├── config.json # Файл конфигурации для хранения Bearer токена и порта ├── Dockerfile # Файл для Docker сборки ├── requirements.txt # Зависимости проекта ├── templates/ # Папка для HTML-шаблонов │ └── index.html └── static/ # Папка для CSS-файлов └── styles.css
|
Чтобы облегчить настройку и обеспечить безопасность конфиденциальных данных, мы создаем файл
config.json. Этот файл будет хранить
Bearer токен, URL API и порт, на котором будет запущено приложение.
Код |
---|
{ "bearer_token": "ваш_bearer_token", "api_url": "https://api.exolve.ru/hlr/v1/GetActivityScore", "port": 7007 }
|
Основной файл приложения
app.py написан на Python с использованием Flask. Приложение загружает конфигурацию из
config.json, создает маршруты и отправляет запросы к Exolve HLR API для получения данных.
Код |
---|
from flask import Flask, request, jsonify, render_template import requests import json
app = Flask(__name__)
# Загрузка конфигурации try: with open("config.json") as config_file: config = json.load(config_file) BEARER_TOKEN = config.get("bearer_token") EXOLVE_HLR_URL = config.get("api_url") PORT = config.get("port", 7007) if not BEARER_TOKEN: raise ValueError("Bearer токен не найден в config.json") except (FileNotFoundError, ValueError) as e: print(f"Ошибка при загрузке конфигурации: {e}") BEARER_TOKEN = None EXOLVE_HLR_URL = None PORT = 7007
@app.route('/') def index(): return render_template('index.html')
@app.route('/check_number', methods=['POST']) def check_number(): if not BEARER_TOKEN: return jsonify({"error": "Токен доступа отсутствует"}), 500
number = request.json.get('number') if not number: return jsonify({"error": "Номер не указан"}), 400
headers = { "Authorization": f"Bearer {BEARER_TOKEN}", "Content-Type": "application/json" }
data = { "number": number }
try: response = requests.post(EXOLVE_HLR_URL, headers=headers, json=data) response.raise_for_status() result = response.json()
status_message = "Номер активен" if result.get("result") else "Номер неактивен"
return jsonify({ "number": result.get("number"), "owner_id": result.get("owner_id"), "region_code": result.get("region_code"), "status_message": status_message }) except requests.exceptions.RequestException as e: return jsonify({"error": f"Ошибка запроса к API: {str(e)}"}), 500
if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=PORT)
|
Мы создаем HTML-шаблон для страницы, где пользователи смогут ввести номер телефона и просмотреть результаты HLR-запроса
templates/index.html
Код |
---|
<!DO CTYPE html> <ht ml lang="ru"> <head> <met a charset="UTF-8"> <met a name="viewport" content="width=device-width, initial-scale=1.0"> <title>HLR проверка активности номера</title> <li nk rel="stylesheet" href="static/styles.css"> </head> <body> <div class="container"> <h1>HLR проверка активности номера</h1> <p class="description"> Вы можете проверить любой мобильный номер, узнать оператора, статус абонента и другую информацию HLR-запросом только в целях тестирования. </p> <fo rm id="checkForm"> <label for="number">Номер телефона:</label> <div class="phone-input"> <span class="country-code">+7</span> <input type="text" id="number" name="number" maxlength="10" required placeholder="1234567890"> </div> <button type="submit">Проверить</button> </form>
<div id="result" style="display: none;" class="card"> <div class="card-title" id="result-number"></div> <div class="card-description"> Владелец: <span id="result-owner"></span><br> Код региона: <span id="result-region"></span> </div> <div class="status" id="result-status"></div> </div> </div> </body> </html>
|
CSS-стили
styles.cssКод |
---|
/* Общие стили */ body { display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; font-family: Arial, sans-serif; background-color: #f9f9f9; flex-direction: column; }
.container { width: 100%; max-width: 600px; padding: 20px; background-color: #ffffff; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); text-align: center; box-sizing: border-box; }
/* Заголовок */ h1 { font-size: 1.8em; margin-bottom: 10px; color: #333333; }
/* Описание */ .description { font-size: 0.95em; color: #666666; margin-bottom: 20px; line-height: 1.5; }
/* Форма */ form { display: flex; flex-direction: column; align-items: center; gap: 15px; }
/* Поле для ввода номера */ .phone-input { display: flex; align-items: center; margin-bottom: 15px; }
.country-code { font-size: 1em; padding: 8px; background-color: #f1f1f1; border: 1px solid #cccccc; border-radius: 5px 0 0 5px; color: #333333; }
input[type="text"] { width: 100%; max-width: 260px; padding: 10px; font-size: 1em; border: 1px solid #cccccc; border-radius: 0 5px 5px 0; box-sizing: border-box; outline: none; }
/* Кнопка */ button { padding: 10px 20px; font-size: 1em; color: #ffffff; background-color: #007bff; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s ease; }
button:hover { background-color: #0056b3; }
/* Карточка с результатом */ .card { width: 100%; max-width: 400px; margin: 20px auto 0; padding: 16px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-sizing: border-box; text-align: left; }
.card-title { font-size: 1.1em; font-weight: bold; color: #333333; margin-bottom: 8px; }
.card-description { font-size: 0.9em; color: #555555; margin-bottom: 12px; }
/* Статус проверки */ .status { font-size: 0.9em; font-weight: bold; margin-top: 10px; }
.status.active { color: green; }
.status.inactive { color: red; }
/* Ссылка на страницу приложений */ .app-page-button { display: inline-block; margin-top: 15px; padding: 10px 20px; font-size: 1em; color: #ffffff; background-color: #007bff; border-radius: 5px; text-decoration: none; transition: background-color 0.3s ease; }
.app-page-button:hover { background-color: #0056b3; }
/* Адаптивные стили для мобильных устройств */ @media (max-width: 768px) { .container { padding: 15px; } input[type="text"] { max-width: 100%; } .card { max-width: 100%; } h1 { font-size: 1.5em; } }
|
Мы используем Docker для удобного развертывания приложения и настройки автоматического перезапуска.
Dockerfile:
Код |
---|
# Базовый образ Python FROM python:3.10-slim
# Установка рабочей директории WORKDIR /app
# Копируем файлы проекта в контейнер COPY . /app
# Установка зависимостей RUN pip install --no-cache-dir -r requirements.txt
# Открываем порт 7007 EXPOSE 7007
# Запуск приложения CMD ["python", "app.py"]
|
Добавьте актуальные версии Flask и requests в requirements.txt:
Код |
---|
Flask==3.0.3 requests==2.31.0
|
Сборка Docker-образа:
Код |
---|
docker build -t hlr_check_app .
|
Запуск Docker-контейнера с политикой автоматического перезапуска:
Код |
---|
docker run -d -p 7007:7007 --name hlr_check_container --restart always hlr_check_app
|
После запуска контейнера приложение будет доступно на порту
7007. Откройте браузер и перейдите по адресу:
Мы успешно создали и развернули Flask-приложение для проверки активности мобильных номеров с использованием Exolve HLR API. Это приложение имеет интуитивный веб-интерфейс, поддерживает Docker для легкого разворачивания и настройки перезапуска контейнера.
Для того, чтобы оставлять комментарии, необходимо пройти авторизацию
Авторизоваться