Как получать и отвечать на SMS в Rails с помощью Twilio

Автор: | 05.08.2026

Этот пост был изначально написан Джеймсом Джелинеком в 2016 году и обновлён Беном Уайтом (bwhite@twilio.com) в апреле 2021 года.

Я работаю с Rails (и Twilio) уже несколько лет и обожаю эту связку. Twilio делает работу с SMS, MMS и голосовыми вызовами невероятно простой. Однако, несмотря на простоту использования, интеграция Twilio в приложение на Ruby on Rails всё ещё требует определённого времени на обучение. Сегодня мы рассмотрим простую интеграцию Twilio в новое приложение на Ruby on Rails, которое обрабатывает входящие и исходящие сообщения. Первым делом нужно создать новое Rails-приложение.

Это создаст приложение с названием «SMS». Теперь нам нужно сгенерировать базовый контроллер, который будет выступать в роли конечной точки для входящих запросов от Twilio.

При создании контроллера мы добавляем метод/действие по умолчанию reply, который будет служить нашей конечной точкой. Следующий шаг — добавить гем twilio-ruby в наш Gemfile.

Теперь нужно установить его в приложение, выполнив следующую команду:

Продолжаем? Мы уже близко! Теперь нужно настроить конечную точку в config/routes.rb.

Стоит отметить, что мы можем убрать блок ресурсов и просто использовать строку post или match в файле config/routes.rb, однако я предусмотрел возможную потребность в будущем функционале контроллера сообщений, поэтому оставил как есть. Это создаст маршрут вида http://localhost:3000/messages/reply, который будет выступать в роли конечной точки для взаимодействия Twilio с нашим Rails-приложением. Теперь нужно настроить учётные данные Twilio и номер телефона в файле credentials.yml.enc.

Выполните команду `rails credentials:edit` для редактирования `credentials.yml.enc`. Вам нужно добавить следующие значения:

Это позволит нам использовать SID, токен аутентификации и номер телефона позже в контроллере. В целях безопасности убедитесь, что этот файл не попадает в систему контроля версий / git. Теперь пришло время перейти к messages_controller и заставить это работать.

Чтобы избежать ошибок CSRF и исключений, нужно отключить проверку подлинности токена. Если вы используете Devise для аутентификации, также стоит отключить authenticate_user!. Это позволит наследовать аутентификацию Devise, но при этом разрешит вызовы метода reply без передачи учётных данных в URL.

В методе reply, который выступает в роли конечной точки, нам нужно каким-то образом получить параметры, которые приходят с запросом от Twilio. Поэтому мы создаём переменные `message_body` и `from_number` для дальнейшей обработки. Мы создали приватный метод `boot_twilio`, который инициализирует клиент Twilio для подготовки отправки SMS-сообщения обратно пользователю. В методе/действии `reply` вы заметите, что после вызова `boot_twilio` мы создаём сообщение, которое просто отвечает на входящий запрос от пользователя. Для развлечения мы используем интерполяцию строк с `from_number`, чтобы отправить простое сообщение с номером телефона пользователя.

Twilio ожидает HTTP-ответ на свой запрос, поэтому мы возвращаем фрагмент XML с пустым тегом ``. (*Примечание от Грега: Если всё, что вам нужно, — это отвечать на текстовые сообщения, вы можете просто включить тег TwiML в этот XML-ответ. Но мне нравится решение Джеймса, потому что его код можно повторно использовать для инициации текстовых сообщений. Нет единственно правильного способа сделать это.*)

Однако это не будет работать без предварительной настройки общедоступного вебхука от Twilio к приложению. Нам нужен способ в нашей среде разработки перенаправить трафик из большого страшного Интернета на наш локальный IP, ведь никто из нас не живёт в дата-центре. 🙂

Для этого скачайте ngrok, установите и сохраните бинарный файл на своём компьютере, а затем переместите ngrok в домашнюю директорию. Чтобы запустить ngrok, откройте терминал, перейдите в директорию с бинарным файлом ngrok и выполните команду:

Это откроет экран статуса и предоставит URL, например: `http://08121ed87.ngrok.io`. Здесь происходит магия. Войдите в Twilio и перейдите в раздел *Phone Numbers*. Нажмите на свой номер телефона, затем прокрутите вниз до раздела Messaging и настройте *Request URL* следующим образом:

Убедитесь, что тип запроса установлен на HTTP POST, и нажмите «Сохранить». Теперь Twilio настроен правильно.

В Rails 6 добавлен новый промежуточный слой для защиты от атак DNS rebinding. Вам нужно очистить список разрешённых хостов в Rails, добавив `config.hosts.clear` в файл `/config/environments/development.rb`.

Теперь, когда у нас есть контроллер/конечная точка и настроен Twilio, пора тестировать. Запустите ваш Rails-сервер:

Отправьте текстовое сообщение на ваш номер телефона Twilio. Через секунду или около того вы должны получить ответ: «Привет, спасибо, что написали мне. Ваш номер: +18323334444».

Если вы получили это сообщение, похлопайте себя по плечу. Теперь у вас официально интегрирован Twilio в Rails, и вы обрабатываете и отвечаете на входящие сообщения. Стоит отметить, что это очень простая реализация, предназначенная для того, чтобы дать вам представление о том, как выполнить базовую интеграцию. Не стесняйтесь вынести большую часть кода из контроллера в отдельный класс, чтобы следовать лучшим практикам Rails.

Удачного кодинга! Теперь вы знаете, как получать и отвечать на SMS в Rails!

— Джеймс Джелинек (shakycode)

Спасибо, Джеймс! Если вы хотите узнать больше о SMS и Rails, ознакомьтесь с: