Этот пост был изначально написан Джеймсом Джелинеком в 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 с пустым тегом `
Однако это не будет работать без предварительной настройки общедоступного вебхука от 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, ознакомьтесь с: