2017. február 15., szerda

HTTP POST küldés OpenWrt-n

Szükségem volt arra, hogy bizonyos események bekövetkezésekor kapjak egy SMS-t az otthoni OpenWrt-t futtató router-emtől. Kis keresgélés után rá is bukkantam egy szolgáltatásra, amit pont ilyesmire találtak ki, és amit naponta egyszer ingyen igénybe is tudok venni erre a célra. A honlapon különféle programozási nyelvekhez részletesen le van írva, milyen kóddal kell az SMS küldését triggerelni.
OpenWrt-nél parancssorból lehet ilyenekkel próbálkozni. Az ehhez adott kód curl-t tartalmaz, ami nincs OpenWrt-n gyárilag. Bár wget van, de annak meg a HTTP POST opciója hiányzik, szintén gyárilag.
Amikor ez a két eszköz kilőve, akkor jön jól az nc (netcat). Az nc HTTP POST-ra való használatához magára a raw HTTP kérésre lesz szükségünk; ezt én Wireshark segítségével szedtem ki egy elküldött jó csomagból, de a lenti példa kis ügyeskedéssel átszerkeszthető saját használatra.
Az nc OpenWrt-n szintén nem egy nagytudású eszköz, nem támogatja azt az üzemmódot, hogy az adatok elküldése után várjon a válaszra, így ezzel is trükközni kellett.

A végső, működő kód tehát így néz ki:
(printf "POST /text HTTP/1.1\r\nUser-Agent: Wget/1.15 (linux-gnu)\r\nAccept: */*\r\nHost: textbelt.com\r\nConnection: Keep-Alive\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 48\r\n\r\nnumber=%%2B36<telefonszám>&message=Hello&key=textbelt" ; sleep 3)| nc textbelt.com 80
ahol a <telefonszám> a kilenc (20/30/70 + hét) jegyű hívószám.

Ha más szerverre akarunk küldeni, akkor a textbelt.com helyett azt a szervernevet kell beírni mindkét helyen a sorba, valamint a \r\n\r\n utáni részt a megfelelő változónevekkel és értékekkel (közöttük = jellel) URL enkódolva lecserélni, & jelekkel elválasztva a párokat. A Content-Length: utáni számot úgy kell módosítani, hogy pontosan kiadja a \r\n\r\n és az utolsó idézőjel közötti karakterek számát.