SMS gateway automatisering

Vi har et problem med at vores medlemmer i Airsoft Bornholm ikke altid er lige gode til at få skrevet sig op til kommende begivenheder.
Vi har medlemmer som desværre ikke er på en fælles platform alle sammen.
Den bedste fællesnævner vi har, er at alle har en mobiltelefon.
Jeg ville opsætte et system der automatisk kunne sende en påmindelse ud til folk, så de husker at tilmelde sig. Og da alle har en mobil, var det oplagt SMS.

Jeg undersøgte mulighederne for det, og der findes næsten færdige løsninger som CPSMS og SureSMS, men da vi blot er en mindre lokal klub, ville jeg gerne finde så billig en løsning som muligt.
Både CPSMS og SureSMS betales der for hver afsendt SMS, som hurtigt vil kunne løbe op.

Jeg fandt denne App til Android, Traccar SMS Gateway.  Som giver mulighed for at sende SMS’er igennem Android lokalt, via deres App. Jeg fandt en tråd omkring at hvordan dette kunne gøres direkte via et Postman call.
Jeg lavede et simpelt PowerShell script til at teste det lokalt.

$uri = "192.168.24.78"
$headers = @{
"authorization" = "b6043991-??????????????????a15bc"
"accept" = "application/json, text/html"
"user-agent" = "Mozilla/5.0 {{ useragent }}"
}

# Define an array of phone numbers
$phoneNumbers = @("12345678", "23456789")

# Message to be sent
$message = "Test af sms gateway, får I den her?"

# Loop through the phone numbers and send a request for each
foreach ($phoneNumber in $phoneNumbers) {
$body = @{
"to" = "+45$phoneNumber"
"message" = $message
} | ConvertTo-Json

Invoke-RestMethod -Uri $uri -Method POST -Headers $headers -Body $body
}

Følsomme data er blevet udskiftet med dummydata

Det virkede fint, eneste “begrænsning” jeg fandt var at danske tegn, og specialtegn ikke blev modtaget korrekt, ÆÅØ blev lavet til andre tegn, og é vil blokere SMS’en helt i at blive sendt, uden fejlbesked.

Næste skridt, var at gøre det muligt at bruge den, uden at være på samme lokale netværk.
Jeg oprettede en CNAME record hos min udbyder, sms-gw.DOMAIN.dk og satte det op i min reverse proxy server, Caddy. Læs mere om hvordan jeg satte Caddy op her.

Nu skulle jeg have et sikkert sted at jeg kunne gemme en liste over telefonnumre på de folk der vil være med på denne SMS påmindelse.
Jeg lavede en skjult side på WordPress siden og sikrede det med kode. Så det er ikke umiddelbart synligt for folk, og kun os der administrerer siden kan tilgå og læse denne data, efter login.

Den næste udfordring var, at lave et automatisk system som holdt øje med begivenheder og udfra dette, sender SMS når det opfylder de korrekte parametre.

Mit valg gik på Node-RED.
Jeg bruger det allerede til en hel del automationer i mit smarthome, og jeg er meget glad for dets funktioner og UI.
Jeg kunne sagtens have lavet det som et rent script, men jeg kan godt lide den måde at man nemt kan se rækkefølgen i hvad der udføres i Node-RED.

Mit Flow kan ses her.

Det trigger hver dag kl. 20:00.
Det henter begivenheder fra https://airsoftbornholm.dk/begivenheder/ via GET og trækker data ud herfra.
Det tager kun data ud fra den første begivenhed.
Der gemmes data i variabler.

  • flow.tilmeldinger gemmer antal tilmeldte.
  • flow.date gemmer dato.
  • flow.event gemmer navnet på begivenheden.
  • flow.where gemmer adressen.
  • flow.link gemmer link til den specifikke begivenhed.

Der bliver efterfølgende fjernet danske og specialtegn i de forskellige flow. variabler, for at sikre at det ikke stopper SMS i at blive sendt. Ø bliver til Oe etc.

Herefter bliver der tjekket om der er mindre end 24 timer til næste begivenhed, hvis der er dette forsættes flow.

Nu hentes telefonnumre der skal skrives til.
Dette er også en GET kommando, her skal der dog godkendes med username og password da data er sikret med dette.
Der hentes først de numre til dem som skal have beskeden på dansk.
Data bliver lagret i et array, og det antal elementer der er i array sætter hvor mange gange at kommandoen gentages. Der er sat delay ind for at give SMS gateway tid til at sende hver SMS.
Der bliver sat det aktuelle nummer der skal sendes sms til i flow.number og derefter bliver beskeden genereret i en template.

{"to":"{{flow.number}}","message":"{{flow.event}} den {{flow.date}}har {{flow.tilmeldinger}} tilmeldinger. {{{flow.link}}}"}

Til sidst bliver SMS sendt via POST kommando til SMS gateway, med den generede besked.

Det bliver efterfølgende gentaget med de numre til som skal have beskeden på engelsk, med en template der passer til her.

Andre projekter

Teknologier
Node-RED, reverse proxy, Android, Postman API, Wordpress, SMS