Форум

Интеграция Flask и SMPP для обработки входящих SMS сообщений

В этой статье я расскажу, как создать приложение на Flask, которое будет обрабатывать входящие SMS-сообщения через протокол SMPP, сохранять их в базе данных и отображать через веб-интерфейс.

Задача

Часто возникает необходимость в интеграции веб-приложения с SMS-сервисами для получения и обработки входящих сообщений. В данном примере мы будем использовать протокол SMPP для работы с SMSC (Short Message Service Center), а Flask и SQLAlchemy для создания веб-интерфейса и управления базой данных.

Основные шаги:
  1. Создание модели базы данных для хранения SMS-сообщений.

  2. Настройка подключения к SMPP серверу и обработка входящих сообщений.

  3. Создание веб-интерфейса для отображения сообщений.

Установка и настройка Flask и SQLAlchemy

Начнем с создания приложения Flask и настройки базы данных SQLite для хранения SMS-сообщений. Мы будем использовать SQLAlchemy, чтобы легко управлять записями в базе данных.

Код
from flask import Flask, render_templatefrom flask_sqlalchemy import SQLAlchemy
# Настройки Flask и базы данныхapp = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sms.db'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)
# Модель для хранения SMS сообщенийclass SMSMessage(db.Model):    id = db.Column(db.Integer, primary_key=True)    source = db.Column(db.String(20))    destination = db.Column(db.String(20))    message = db.Column(db.String(160))    timestamp = db.Column(db.DateTime, default=db.func.current_timestamp())
# Создаем таблицы в базе данныхwith app.app_context():    db.create_all()

Здесь мы определяем модель SMSMessage, которая содержит поля для хранения номера отправителя, получателя, текста сообщения и времени получения.

Подключение к SMPP серверу и обработка входящих сообщений

Для обработки SMS-сообщений через SMPP мы будем использовать библиотеку smpplib. Она позволяет легко подключаться к SMPP серверу и работать с сообщениями.

Код
import smpplib.clientimport smpplib.constsimport threadingimport atexit
# Данные для подключения к SMPP серверуSMPP_SERVER = "smpp.exolve.ru"SMPP_PORT = 2775SYSTEM_ID = "ваш логин"PASSWORD = "ваш пароль"
# Функция для обработки входящих сообщенийdef handle_message(pdu):    message = pdu.short_message.decode('utf-8')    source = pdu.source_addr    destination = pdu.destination_addr
    # Создаем контекст приложения Flask    with app.app_context():        # Сохраняем сообщение в базе данных        sms = SMSMessage(source=source, destination=destination, message=message)        db.session.add(sms)        db.session.commit()
    print(f"Received message: {message}")    print(f"From: {source}")    print(f"To: {destination}")
# Создаем клиента SMPPclient = smpplib.client.Client(SMPP_SERVER, SMPP_PORT)
# Включаем логирование (опционально)client.set_message_received_handler(handle_message)
# Функция для корректного закрытия SMPP клиентаdef close_smpp_client():    if client:        try:            client.unbind()        finally:            client.disconnect()
# Регистрация функции закрытия соединения при завершении работы приложенияatexit.register(close_smpp_client)
# Подключаемся и регистрируемся как приемник (только для получения сообщений)client.connect()client.bind_receiver(system_id=SYSTEM_ID, password=PASSWORD)
# Запуск прослушивания SMPP сообщений в отдельном потокеlistener_thread = threading.Thread(target=client.listen, daemon=True)listener_thread.start()

Что здесь происходит:

  • Мы создаем клиента SMPP и регистрируем функцию handle_message, которая будет вызываться при получении нового сообщения.

  • Внутри handle_message создается контекст Flask, чтобы корректно сохранять сообщение в базе данных.

  • Мы также добавляем функцию close_smpp_client, чтобы корректно закрыть соединение с сервером SMPP при завершении работы приложения.

Создание веб-интерфейса для отображения сообщений

Теперь создадим простой веб-интерфейс на Flask, который будет отображать все полученные SMS-сообщения.

Код
# Веб-интерфейс для отображения полученных SMS@app.route('/')def index():    messages = SMSMessage.query.all()    return render_template('index.html', messages=messages)
# Запуск веб-приложения на порту 5001if __name__ == '__main__':    try:        app.run(debug=True, port=5001)    finally:        close_smpp_client()

В этом коде мы создаем маршрут /, который будет отображать все сообщения, сохраненные в базе данных. Для отображения используем HTML-шаблон index.html.

Запуск приложения

Теперь, когда все настроено, можно запустить приложение. Для этого выполните команду:

Код
python app.py
Приложение запустится на порту 5001, и вы сможете просматривать полученные SMS-сообщения через веб-интерфейс.
2
151
Открытая тема
0 баллов

Для того, чтобы оставлять комментарии, необходимо пройти авторизацию

Авторизоваться
flask для быстрых проектов хорошее решение!  
oleg
oleg
0 баллов
14 дней назад в 04:36
Отличное решение для деплоя, будем пробовать.
moderator
moderator
0 баллов
10 дней назад в 12:17