**Джонатан Крессати**, победитель нашего конкурса разработчиков SMS в феврале. Betwext — это простой сервис группового обмена текстовыми сообщениями. При использовании Betwext вам достаточно отправить сообщение один раз, и его получат все участники вашего активного списка, включая любые ответы от других участников. Это почти как добавление кнопки «Ответить всем» в ваши SMS, и это оказалось чрезвычайно полезным на фестивале South by Southwest в этом году.
С помощью REST API Twilio легко отправлять текстовые сообщения любому количеству получателей. Мы подготовили пример, демонстрирующий, как создать простое приложение для групповой рассылки сообщений. В примере используется ASP.NET MVC и C#, но эти концепции легко применимы к любому другому фреймворку. Ниже мы обсудим, как обрабатывать входящие сообщения, управлять запросами на подписку и отписку, а также, что самое важное, пересылать сообщения от участников группы остальным её членам.
В нашем приложении для групповой SMS участники могут присоединиться к группе, отправив сообщение **START** на номер телефона группы. После присоединения любые сообщения, отправленные на номер группы, будут пересылаться всем остальным участникам. Чтобы оставить место для номера отправителя в пересылаемом сообщении, длина сообщений ограничена 140 символами. Чтобы покинуть группу, отправьте **STOP**.
Этот пример демонстрирует получение входящего SMS через POST-запрос на ваш SMS URL, отправку SMS-сообщений участникам группы через REST API и ответ отправителю с помощью текстового ответа на входящий HTTP-запрос.
— SMS-сообщение отправляется на ваш Twilio номер телефона.
— Twilio отправляет POST-запрос на SMS URL вашего номера телефона (в этом примере это будет http://example.com/IncomingMessage).
— Обработчик сообщений проверяет тело сообщения на наличие команд, таких как **START** или **STOP**, и соответственно изменяет членство участника в группе (список участников хранится в базе данных).
— Если сообщение содержит любой другой текст и отправитель является участником группы, пересылается включённое сообщение всем остальным участникам через Twilio REST API.
— Отправляется подтверждающее сообщение исходному отправителю о выполненном действии.
Этот пример был создан с использованием Visual Studio 2010, .NET 4, ASP.NET MVC 2, LINQ to SQL и SQL Server Express 2008. Код также будет работать с Visual Studio 2008, .NET 3.5 SP1 и проектом ASP.NET MVC 1. В этом примере также используется TwilioRest C# SDK, который можно найти по адресу http://github.com/twilio/twilio-csharp.
В этом примере мы используем простой класс LINQ to SQL. Вам не обязательно использовать LINQ to SQL; подойдёт любая стратегия доступа к данным в .NET. Просто замените обращения к базе данных на эквивалентные в вашей любимой ORM. Пример базы данных и файл .dbml включены в загрузку.
«`sql
CREATE TABLE [Member] (
[MemberId] [int] IDENTITY(1,1) NOT NULL,
[PhoneNumber] [nvarchar](50) NULL
)
«`
В одном из ваших контроллеров создайте метод действия для получения SMS-сообщений. Вот пример структуры контроллера, который также включает DataContext LINQ-to-SQL для удобства. Мы заполним содержимое метода *IncomingMessage* логикой обработки сообщений ниже.
«`csharp
public class HomeController : Controller
{
GroupSmsDataContext DB = new GroupSmsDataContext();
[HttpPost] // или [AcceptVerbs(HttpVerbs.Post)] в MVC1
public ActionResult IncomingMessage(string From, string To, string Body)
{
return View();
}
}
«`
Обновите маршруты, чтобы этот метод был доступен по адресу */IncomingMessage*:
«`csharp
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(«Default», «{action}», new { controller = «Home», action = «Index» } );
}
«`
Вся обработка сообщений будет выполняться внутри метода действия IncomingMessage.
Когда Twilio отправляет POST-запрос на ваш SMS URL, он включает три значения (To, From, Body), которые ASP.NET MVC связывает с соответствующими параметрами метода. Как только мы узнаем, от кого сообщение, куда оно направлено и что содержит, мы можем его обработать.
Сначала мы проверяем команду на присоединение или выход. Если содержимое сообщения соответствует одной из четырёх поддерживаемых команд, мы добавляем или удаляем номер из группы.
«`csharp
public ActionResult IncomingMessage(string From, string To, string Body) {
string response;
switch (Body.ToLowerInvariant().Trim()) {
case «start»:
case «join»:
// подписка участника
AddMemberToGroup(From);
response = «СИСТЕМА: Добро пожаловать в клуб 🙂 Держите сообщения до 140 символов! Отправьте STOP, чтобы выйти.»;
break;
case «stop»:
case «leave»:
// отписка участника
RemoveMemberFromGroup(From);
response = «СИСТЕМА: До скорого, аллигатор.»;
break;
«`
Если сообщение содержит любой другой текст, мы хотим: 1) проверить, является ли отправитель участником группы, и 2) если да, переслать сообщение всем остальным участникам группы.
«`csharp
default:
// предотвращение отправки сообщений не участниками группы
var member = DB.Members.FirstOrDefault(m => m.PhoneNumber == From);
if (member == null) {
response = «СИСТЕМА: Отправьте START, чтобы отправлять/получать сообщения от этой группы»;
break;
}
// настройка клиента Twilio
var accountSid = «xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx»; // TODO: замените на ваш ID аккаунта
var secretKey = «xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx»; // TODO: замените на ваш ключ
var account = new TwilioRest.Account(accountSid, secretKey);
// получение всех участников группы, кроме отправителя
var members = DB.Members.Where(m => m.MemberId != member.MemberId).ToList();
foreach (var recipient in members) {
// отправка сообщения каждому участнику
var url = string.Format(«/2008-08-01/Accounts/{0}/SMS/Messages», accountSid);
var values = new Hashtable();
values.Add(«To», recipient.PhoneNumber);
values.Add(«From», To);
values.Add(«Body», From + «: » + Body.Trim());
account.request(url, «POST», values);
}
response = string.Format(«СИСТЕМА: Сообщение отправлено {0} участникам», members.Count);
break;
}
«`
Наконец, мы отвечаем отправителю, выводя простой текст, который Twilio считывает и отправляет через SMS исходному отправителю.
«`csharp
// ответ с подтверждающим сообщением
return Content(response, «text/plain»);
}
«`
Методы управления членством реализованы следующим образом. Вы можете заменить эту реализацию на метод доступа к данным по вашему выбору.
«`csharp
private void RemoveMemberFromGroup(string phoneNumber) {
// получение участника по номеру телефона
var member = DB.Members.FirstOrDefault(m => m.PhoneNumber == phoneNumber);
// если участник существует, удаляем его из базы данных
if (member != null) {
DB.Members.DeleteOnSubmit(member);
DB.SubmitChanges();
}
}
private void AddMemberToGroup(string phoneNumber) {
// получение участника по номеру телефона
var member = DB.Members.FirstOrDefault(m => m.PhoneNumber == phoneNumber);
// если участник уже есть, просто игнорируем
if (member != null) return;
// добавление нового участника в базу данных
member = new Member();
member.PhoneNumber = phoneNumber;
DB.Members.InsertOnSubmit(member);
DB.SubmitChanges();
}
«`
Существует множество способов расширить это приложение. Вот несколько идей, чтобы начать:
— Требовать PIN-код для присоединения к группе
— Позволять участникам устанавливать отображаемое имя
— Обрабатывать сообщения длиннее 140 символов
— Добавить возможность отключения уведомлений на X часов
— Позволять участникам указывать часы тишины
Создать приложение для групповой рассылки сообщений с помощью Twilio и ASP.NET MVC очень просто. Если вы хотите настроить это для себя, скачайте исходный код, создайте бесплатный аккаунт Twilio (мы дадим вам $30 при регистрации) и начните общаться!