Для отправки SMS через Python понадобится API‑провайдер, библиотека requests и настройка авторизации. Ниже приведён практический пример, который можно быстро внедрить в проект.
Как выбрать подходящего SMS‑провайдера?
Выбор начинается с критериев: наличие REST‑API, поддержка JSON, тарифы, покрытие стран. В 2026 г. популярными являются Twilio, Plivo, и локальные провайдеры с открытым API, например полное руководство. Проверь лимиты на количество сообщений и наличие библиотек для Python.
Ключевые параметры сравнения
| Параметр | Twilio | Plivo | Локальный провайдер |
|---|---|---|---|
| Код авторизации | Basic Auth | Basic Auth | OAuth 2.0 |
| Формат payload | JSON | JSON | SOAP/JSON |
| Тарифы | 0,07 $ / сообщение | 0,05 $ / сообщение | 0,02 $ / сообщение |
Установка и базовая конфигурация
Установите библиотеку requests:
pip install requests
Сохраните учётные данные в переменных окружения для безопасности.
Отправка SMS через REST‑API
Ниже пример использования Twilio API. Аналогично работает и любой другой провайдер, заменив URL и параметры.
import os
import requests
api_url = "https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Messages.json"
account_sid = os.getenv("TWILIO_SID")
auth_token = os.getenv("TWILIO_TOKEN")
payload = {
"From": "+1234567890",
"To": "+998123456789",
"Body": "Привет! Это тестовое сообщение"
}
response = requests.post(api_url.format(account_sid=account_sid), data=payload, auth=(account_sid, auth_token))
print(response.status_code)
print(response.json())
Ответ сервера содержит поля sid, status и error_message при ошибке.
Обработка ошибок и статусных кодов
Смотрите справочник для полного списка кодов.
Батч‑рассылка и очереди
Для больших объёмов используйте очередь (Redis, RabbitMQ) и worker‑процессы. Чтение списка номеров из CSV:
import csv
def load_numbers(file_path):
with open(file_path, newline='') as f:
reader = csv.DictReader(f)
return [row["phone"] for row in reader]
Worker может отправлять сообщение, проверять статус и обновлять базу.
Локализация и ограничения по символам
SMS ограничена 160 символами для GSM и 70 для UTF‑8. Автоматически разбивайте длинные сообщения:
def split_message(text, max_len=160):
return [text[i:i+max_len] for i in range(0, len(text), max_len)]
Факторы стоимости и оптимизации
Стоимость зависит от страны, типа номера и объёма. Планируйте рассылку по плану “batch” – разбейте на группы, чтобы избежать лимитов и снизить нагрузку.
Безопасность и GDPR
Никогда не храните номера в открытом виде. Храните их в зашифрованном виде и используйте OAuth для доступа к API, как описано в статье.
FAQ
- Как быстро тестировать SMS‑API без реальных номеров? Используйте тестовые номера, предоставляемые провайдером, либо сервисы типа смс‑шлюз.
- Можно ли использовать Python‑библиотеку
smsapi? Да, но она не поддерживает OAuth. Для современных требований лучше REST‑API. - Сколько ошибок чаще всего встречается? Чаще всего 400‑показывают неверный формат номера, 401 – неверные токены, 429 – превышение лимита.
- Как интегрировать SMS в маркетинговую кампанию? Создайте таблицу с сегментами, отправьте тест, измерьте коэффициент отклика и масштабируйте.