Так оно и есть: отправка SMS с помощью Golang

Автор: | 10.08.2026

Будь то цитаты, хранящиеся в телефоне, на стикерах или в книге, у каждого найдётся несколько фраз, к которым обращаются за вдохновением. Лично я слежу за аккаунтом @KurtVonnegut. Нет, не за настоящим (покойным) Воннегутом: просто за человеком или ботом, который публикует его знаменитые высказывания.

Вспоминая Воннегута, мне пришла в голову идея: какой лучший способ начать работу с Twilio, чем отправлять цитаты Воннегута всем своим друзьям? Именно этому посвящена эта статья: как отправлять SMS-сообщения с цитатами Воннегута на языке Golang.

Прежде чем приступить к кодированию, установите Golang на свой компьютер. Следуйте инструкциям для вашей операционной системы и протестируйте установку локально.

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

Если вы тестировали установку Golang локально, вероятно, создали программу (main.go), которая выглядит примерно так:

Программа на Golang, с которой мы будем работать сегодня, будет иметь такой базовый скелет кода. Каждая программа на Golang начинает выполнение в пакете под названием `main`.

Запись `package main` в начале программы указывает компилятору, что программа должна компилироваться и успешно выполняться.

Находясь в `main`, программа может импортировать другие пакеты, расширяющие функциональность пакета `main`. Эти пакеты указываются в операторе `import`.

Как и в C++, существует функция `main`, код которой выполняется. Другие функции можно создавать внутри этой программы на Golang, но они не будут выполнены, если не будут вызваны в `main`.

Любую программу на Golang можно выполнить, открыв командную строку, перейдя в директорию с программой и введя команду `go run main.go`.

Если хотите лучше освоить синтаксис, изучите экскурсию по Golang. Теперь перейдём к написанию кода на Golang, который позволит нашей программе случайным образом выбирать цитаты Воннегута из массива для будущего SMS-сообщения.

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

Начните с программы под названием *main.go*, если ещё не создали её в предыдущем разделе. Она должна содержать упомянутый ранее скелет кода на Golang.

Импортируйте пакет math/rand, который позволит реализовать генератор случайных чисел. Пакет math/rand детерминирован, то есть любой генератор случайных чисел, созданный с его помощью, будет выдавать одинаковый результат при одинаковом начальном состоянии. Иными словами, если несколько раз запустить следующий код, вы увидите одно и то же число — целое число от 0 до 10 — из-за `rand.Intn`.

Но что, если нам нужно, чтобы каждый раз генерировалось *разное* случайное число? Как обойти детерминированную природу math/rand? Исходя из приведённого определения детерминированности, достаточно изменить начальное состояние при каждом запуске программы.

Самый распространённый способ сделать это — использовать `rand.Seed` для установки начального состояния на текущее время Unix. Почему? Поскольку между запусками *main.go* пройдёт хотя бы секунда, начальное состояние будет разным при каждом запуске, а значит, случайное целое число, сгенерированное `rand.Intn`, будет по-настоящему случайным.

Теперь, когда мы создали генератор случайных чисел, давайте используем его для выбора случайной цитаты из массива цитат Курта Воннегута. В приведённом ниже фрагменте кода в `main()` добавлен массив из семи цитат Воннегута, а также оператор печати `fmt.Println`, который выводит цитату по индексу, заданному случайным числом.

Запустите эту программу несколько раз, и вы увидите разные цитаты Курта Воннегута из этого массива.

Если вы уже пользовались Twilio, можете пропустить этот раздел. 🙂

Перейдите на страницу регистрации в Twilio, чтобы бесплатно зарегистрироваться. Укажите, что хотите разработать приложение с возможностью отправки SMS.

После заполнения данных аккаунта вы попадёте на страницу пробного аккаунта, где увидите, что у вас есть $15.50 для совершения звонков, отправки SMS и других действий с помощью Twilio. Благодаря щедрой ценовой политике Twilio на SMS вам не придётся беспокоиться о том, что вы потратите все пробные деньги в этом руководстве.

После нажатия кнопки *Начать* получите модный номер телефона Twilio.

Попробуйте отправить первое сообщение на свой телефон с помощью инструмента Twilio *Отправить сообщение*, который появится на экране. Если всё работает, возвращаемся к Golang.

Теперь переходим к самой интересной части — использованию Golang для отправки SMS через Twilio!

Начнём с этого стартового кода, который является небольшим расширением того, что мы создали в предыдущих разделах.

Заполните переменные `accountSid` и `authToken` вашими уникальными Account SID и Auth Token, которые можно найти в консоли Twilio.

После настройки генератора случайных чисел для устранения детерминированности в программу нужно добавить ещё три функции:

— Указать данные SMS (отправитель, получатель, текст сообщения)

— Создать HTTP-клиент

— Выполнить HTTP POST-запрос с помощью HTTP-клиента

Создайте и подготовьте SMS-сообщение для отправки. Замените `NUMBER_FROM` на номер телефона отправителя (ваш номер Twilio) и `NUMBER_TO` на номер телефона получателя. Убедитесь, что номера телефонов отформатированы как ‘+1234567890’. Пакеты `net/url` и `strings` также должны быть добавлены в оператор `import` для успешной компиляции этого фрагмента кода.

В этом блоке кода создаётся `url.Values{}`, который хранит и кодирует параметры URL — отправителя («From»), получателя («To») и текст сообщения («Body»), а созданный Reader позволяет парсить этот объект как строку.

Далее мы настроим HTTP-клиент и HTTP POST-запрос. Переменная `req` хранит этот запрос, и мы передаём в неё учётные данные Twilio с помощью `req.SetBasicAuth()` и добавляем заголовки запроса с помощью `req.Header.Add`. Пакет `net/http` должен быть добавлен в оператор `import` для успешной компиляции этого фрагмента кода.

Хотя HTTP-клиент `client` и HTTP POST-запрос `req` созданы, они пока не используются в этом фрагменте кода.

Наконец, мы используем HTTP-клиент для выполнения POST-запроса. Мы отправим HTTP POST-запрос `req` с помощью HTTP-клиента `client` и сохраним результат в переменной `resp`. Пакет `encoding/json` должен быть добавлен в оператор `import` для успешной компиляции этого фрагмента кода.

Возможно, вы задаётесь вопросом, почему внешний оператор *if* проверяет, находится ли `resp.StatusCode` в диапазоне от 200 до 300. Это связано с тем, что HTTP-код состояния вида 2XX означает успешный HTTP POST-запрос. Затем мы можем использовать `json.NewDecoder` для чтения тела ответа и проверки наличия ошибок.

Если HTTP POST-запрос успешен и внутренний оператор *if* показывает, что ошибок нет, SID SMS-сообщения будет выведен в командную строку. Это означает, что вы успешно отправили SMS через Twilio. Ура!

Но что, если вы не видите SID SMS-сообщения? Если HTTP-код состояния не попадает в диапазон 200-х, оператор *else* выведет информацию о причине неудачи HTTP POST-запроса в командную строку. Вы можете узнать, что означают *другие HTTP-коды состояния*, и устранить проблему.

Прежде чем я покажу окончательный код, взгляните на свой оператор `import`. Выглядит ли он примерно так?

Если да, то вы отлично справились с последним разделом! Поздравляю. Если вам кажется, что какого-то пакета не хватает, вернитесь к разделу «Отправка SMS программно с помощью Golang» в этом руководстве и посмотрите, что вы упустили.

Барабанная дробь… взгляните на окончательный код, чтобы оценить свои результаты. Если уверены в себе, введите `go run main.go` в командной строке, и SMS будет отправлено!

Вы можете подтвердить отправку сообщения, перейдя в панель управления Programmable SMS от Twilio и посмотрев раздел *Недавние сообщения*.

Надеюсь, вам понравилось это сочетание Twilio и Golang с ноткой Воннегута. Почувствуйте себя свободно, чтобы проявить творческий подход и настроить эти цитаты или даже поработать над более сложными проектами с Twilio на Golang.

Благодарю разработчиков-евангелистов Мэтта Макая и Лиззи Сигл за рецензирование и помощь в публикации моей работы через Twilio Voices. Если у вас есть вопросы или комментарии, не стесняйтесь обращаться ко мне в Twitter, GitHub или по электронной почте!