Pirátská SMS brána
Kdo by to byl tušil, že si Piráti budou navzájem účtovat SMSky.
Instalace
Ne všechny závislosti jsou na Hackage, takže prozatím je potřeba vytvořit cabal.project
:
packages: .
source-repository-package
type: git
location: https://github.com/mordae/hs-praha
tag: master
subdir: praha
source-repository-package
type: git
location: https://github.com/mordae/hs-praha
tag: master
subdir: praha-logger
source-repository-package
type: git
location: https://github.com/mordae/hs-praha
tag: master
subdir: praha-config
source-repository-package
type: git
location: https://github.com/mordae/hs-praha
tag: master
subdir: praha-migrate
source-repository-package
type: git
location: https://github.com/mordae/hs-aweg
tag: master
source-repository-package
type: git
location: https://github.com/mordae/hikaru
tag: master
Následně je možné projekt standardně sestavit:
cabal build
Pro sestavení a spuštění z lokálního adresáře:
cabal run pelican -- --help
V souboru pelican.env
jsou přednastavené některé povinné proměnné prostředí. Je však zapotřebí dodefinovat ještě SMS_LOGIN
a SMS_PASSWORD
. Například skrze další konfigurační soubor:
cabal run pelican -- -C pelican.env -C prod.env
Případně přímo v prostředí:
export SMS_LOGIN='john'
export SMS_PASSWORD='wayne'
cabal run pelican -- -C pelican.env
Při lokálním testování s ostrým účtem od brány doporučuji zakázat potvrzování zpráv nastavením proměnné NOACK=1
, jinak vaše lokální instance potvrdí příjem doručenek z produkce, což je nežádoucí.
Balíček je také možné nainstalovat:
cabal install
Technické detaily
SMS brána v tuto chvíli vystavuje následující služby:
API
Odeslání SMS zprávy na číslo
POST /v1/send/to-number HTTP/1.1
Content-Type: application/json
{
"application": "přidělené <appid>",
"token": "přidělený přístupový <token>",
"number": "+420123456789",
"payload": "Váš PIN je $$. Piráti",
"interpolate": ["1234"],
"receipt": "volitelné <uuid> pro kontrolu doručení",
"centre": "volitelný <název> nákladového střediska"
}
HTTP/1.1 202 Accepted
Content-Type: text/plain; charset=utf8
V případě zaslání pole interpolate
dojde k nahrazení skupin $$
v poli payload
odpovídajícími prvky z pole interpolate
. Hodnoty z pole interpolate
se po odeslání zprávy neuchovávají. Tato funkce slouží k předávání citlivých údajů.
V historii zpráv tak v příkladu výše zůstane pouze text "Váš PIN je $$. Piráti".
- V případě úspěchu je kód odpovědi 202 a tělo je prázdné.
- V případě chyby je kód odpovědi z řad 400 nebo 500 a tělo obsahuje vysvětlení. U chyb na straně klienta (400) je tělo zpravidla typu
text/plain
a obsahuje krátký popis problému.
Odeslání SMS zprávy kontaktu
POST /v1/send/to-contact HTTP/1.1
Content-Type: application/json
{
"application": "přidělené <appid>",
"token": "přidělený přístupový <token>",
"contact": "<název> kontaktu",
"payload": "Váš PIN je $$. Piráti",
"interpolate": ["1234"],
"receipt": "volitelné <uuid> pro kontrolu doručení",
"centre": "volitelný <název> nákladového střediska",
"billing": "bill-sender|bill-recipient"
}
HTTP/1.1 202 Accepted
Content-Type: text/plain; charset=utf8
Funguje obdobně jako /v1/send/to-number
s následujícími rozdíly:
- Namísto číslo příjemce se použije název kontaktu. Například
uid:jan.hamal.dvorak
,forum:410
nebosso:b503b712-9f7c-4479-a1dd-e7b6447dc2cb
. Záleží jaké kontakty jsou v DB definovány. - Je nutné uvést pole
billing
; hodnotabill-sender
účtuje zprávu na vrub nákladového střediska uvedeného v policentre
(které je možné vynechat pro výchozí účtování na vrub aplikace); naopakbill-recipient
účtuje zprávu na vrub nákladového střediska příjemce.
Kontrola doručenky
GET /v1/receipt/<uuid> HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json
{
"status": "pending|accepted|rejected|delivered|failed",
"reason": "zdůvodnění nebo null",
"ts": "2021-05-17T00:03:48.799695Z",
"updated": "2021-05-17T00:03:00Z"
}
Pole ts
obsahuje čas zanesení zprávy do systému na naší straně. Pole updated
pak obsahuje čas poslední informace o zprávě od SMS brány.
Význam stavů:
- pending -- zatím nebyla předána SMS bráně
- accepted -- přijata bránou
- rejected -- odmítnuta bránou
- delivered -- úspěšně doručena
- failed -- nepodařilo se doručit nebo problém na straně brány
Stav vždy začíná jako pending
a končí jako rejected
, delivered
nebo failed
. Vy výjimečných případech může dojít k tomu, že se stav z accepted
změní na rejected
a nelze vyloučit ani změnu ze stavu delivered
na jiný.
Hromadná kontrola doručenek
GET /v1/receipts?since=2021-05-17T00:00:00Z HTTP/1.1
Authorization: Basic <base64(<appid>:<token>)>
HTTP/1.1 200 OK
Content-Type: application/json
[
{...},
{...},
{...}
]
Pro hromadnou kontrolu doručenek je potřeba zadat přihlašovací údaje formou Basic Authentication. Výsledkem je pole doručenek. Jejich výpis je možné omezit pomocí parametru since
v URL, který musí být platným ISO 8601 časem (včetně časového pásma nebo koncovky Z
pro UTC).
Doporučený způsob využití je ptát se pravidelně s parametrem since
nastaveným na čas poslední odeslané zprávy, která je na vaší straně ještě ve stavu pending
nebo accepted
.