Kolejnym tematem, który chciałbym przybliżyć jest wysyłanie SMS-ów z Azure Functions. Po raz kolejny chciałbym Was przekonać do koncepcji komponowania aplikacji z gotowych elementów. Tym razem są to SMS-y, które będziemy wysyłać za pomocą platformy Twilio.

Konfiguracja Twilio

Poprzednim razem, kiedy omawialiśmy wysyłanie maili musieliśmy utworzyć element odpowiedzialny za wysyłanie maili w Azure Portal-u. Twilio na taką możliwość nie pozwala. Musimy utworzyć konto bezpośrednio na ich stronie.

Tam, zostaniemy poproszeni o podanie loginu, hasła oraz potwierdzenie naszej tożsamości poprzez przepisanie kodu otrzymanego SMS-em. Po wykonaniu tych kroków zostaniemy przekierowani do strony, na której zostaniemy poproszeni o podanie tytułu naszego projektu:

Zaraz po jego podaniu zostaniemy przeniesieni na główny ekran usługi. Znajdują się tam dwa z trzech elementów, które będziemy musieli podać podczas konfiguracji naszej funkcji – Account SID and Auth Token. Proponuję zapisać sobie gdzieś, te wartości, tak aby nie musieć do nich ponownie wracać.

Teraz należy tylko uzyskać numer, z którego będą wysyłane SMS-y. Na głównym ekranie usługi można zauważyć sekcję Programmable SMS, tam też znajduje się przycisk Get Started. Po jego kliknięciu zostaniemy przeniesieni na stronę, gdzie po kliknięciu przycisku Get a number otrzymamy numer, który wykorzystamy w naszej funkcji. Jest to trzeci element, który powinniśmy sobie gdzieś zanotować, ponieważ będzie on nam potrzebny do poprawnego skonfigurowania funkcji.

Mając zapisane wspomniane trzy elementy – Account SID, Auth Token oraz numer telefonu, z którego zostaną wysłane SMS-y – możemy wrócić do Azure Portal-u.

Wysyłanie SMS-ów przy użyciu Azure Functions

Funkcja jako skrypt

Podobnie jak w poprzednim wpisie – wysyłanie maili – wykorzystamy szablon funkcji Http Trigger do rozpoczęcia naszej pracy. Oczywiście musimy otworzyć stronę Integrate, a tam dodać nowy parametr wyjściowy o typie Twilio SMS:

Po jego wybraniu zostaniemy przeniesieni na stronę, na której zostaniemy poproszeni o podanie parametrów potrzebnych do skonfigurowania usługi:

Szczególną uwagę należy zwrócić na dwa z nich – Auth Token setting oraz Account SID setting. W ich przypadku nie są to bezpośrednie wartości kluczy, które zapisaliśmy ze strony Twilio, ale nazwy kluczy do ustawień naszej funkcji z sekcji App Setting, które dopiero przechowują zapisane wartości. Pozostałe parametry nie powinny budzić wątpliwości.

Po zapisaniu konfiguracji możemy otworzyć plik function.json, w którym przechowywana jest konfiguracja w formacie json.

W celu dodania do konfiguracji wspomnianych wcześniej parametrów – Auth Token setting oraz Account SID setting – należy przejść do sekcji App Setting. Aby tam przejść musimy otworzyć Platform features, a następnie Application settings. Pamiętajcie tylko, że dodane parametry muszą mieć takie same nazwy, jak podane wcześniej w sekcji Integrate.

Pozostało nam już tylko napisanie kodu. Tym razem będzie ciężej, ponieważ sekcja Documentation jest pusta. Na szczęście mechanizm integracji działa podobnie jak w przypadku wysyłania maili. Musimy dodać argument wyjściowy typu SMSMessage, który będzie zawierał wiadomość, którą chcemy wysłać:

#r "Twilio.Api"

using System;
using System.Net;
using Twilio;

public static HttpResponseMessage Run(HttpRequestMessage req, out SMSMessage message)
{
  // parse query parameter
  string messageText = req.GetQueryNameValuePairs()
    .FirstOrDefault(q => string.Compare(q.Key, "message", true) == 0)
    .Value;

  message = new SMSMessage();
  message.Body = messageText;

  return req.CreateResponse(HttpStatusCode.Accepted);
}

Jak widzicie kod jest bardzo prosty. Oczywiście istnieje możliwość skonfigurowania pozostałych parametrów wiadomości SMS w kodzie aplikacji.

Funkcja utworzona jako kod

Istnieje możliwość zastosowania drugiego podejścia – wykorzystania atrybutu do skonfigurowania integracji z Twilio. Większość kroków jest taka sama. Różnica występuje tylko w samym kodzie funkcji:

[FunctionName("SendNotificationSMS")]
public static void Run(
  [QueueTrigger("tosendnotification", Connection = "registration2storage_STORAGE")] Customer customer,
  [TwilioSms(
    To = "+48123456789",
    From = "+4812345678",
    Body = "New customer {Name} {Surname}!")]
    out SMSMessage message)
{
  message = new SMSMessage();
}

Proszę zwrócicie uwagę, że w atrybucie dotyczącym Twilio możemy skonsumować bezpośrednio właściwości obiektu pobranego z kolejki.