luokka http://oma.saunalahti.fi verkkopalvelun sms - lähetykseen. Ei kommentointia, koodi suht suoraviivainen.
<?php /** * 2011 KEAN **/ class saunasms { private $ch; private $com; public $viesti = array(); public function __construct($username, $password) { if(!isset($username, $password)) { throw new Exception("Aseta käyttäjänimi ja salasana."); } $this->ch = curl_init(); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->ch, CURLOPT_COOKIESESSION, 1); curl_setopt($this->ch, CURLOPT_COOKIEJAR, "/dev/null"); curl_setopt($this->ch, CURLOPT_POST, 1); curl_setopt($this->ch, CURLOPT_POSTFIELDS, "login&username=" . $username . "&password=" . $password); curl_setopt($this->ch, CURLOPT_URL, "https://oma.saunalahti.fi/settings/smsSend"); $this->com = curl_exec($this->ch); $pos = strpos($this->com, "Kirjautuminen"); if($pos === true) { throw new Exception("Kirjautuminen oma.saunalahti.fi - verkkopalveluun epäonnistui."); } } public function asetaVastaanottajat($vastaanottajat) { $this->viesti["recipients"] = preg_replace("/[^0-9,]/", "", $vastaanottajat); } public function lahetaViesti($viesti) { if(empty($viesti)) { throw new Exception("Viestikenttä on tyhjä!? Viestiä ei lähetetty."); } if(!isset($this->viesti["recipients"]) OR empty($this->viesti["recipients"])) { throw new Exception("Aseta vastaanottaja(t), erota pilkulla."); } $this->viesti["text"] = $this->EUTF8(substr(trim($viesti), 0, 158)); $post = "recipients=" . $this->viesti["recipients"] . "&text=" . urlencode($this->viesti["text"]) . "&size=" . strlen($this->viesti["text"]); curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); curl_setopt($this->ch, CURLOPT_URL, "https://oma.saunalahti.fi/settings/smsSend?send"); $reply = curl_exec($this->ch); if(preg_match("/Numero (.*) on virheellinen/", $reply)) { throw new Exception("Numero on virheellinen."); } elseif(preg_match("/" . $this->EUTF8("Viesti lähetetty") . "/", $reply)) { return true; } else { throw new Exception("Tilapäinen virhe, viestiä ei lähetetty."); } } public function smsData() { preg_match("/" . $this->EUTF8("Kuukausittaisia viestejä jäljellä:") . "(.*)<br>/", $this->com, $match); $data["jaljella"] = trim($match[1]); preg_match("/" . $this->EUTF8("Lähetettyjä viestejä:") . "(.*)<br>/", $this->com, $match); $data["lahetetty"] = trim($match[1]); return $data; } public function kirjauduUlos() { curl_setopt($this->ch, CURLOPT_URL, "https://oma.saunalahti.fi/settings/Logout"); curl_exec($this->ch); curl_close($this->ch); } private function EUTF8($string) { if(mb_check_encoding($string, 'UTF-8')) { return utf8_decode($string); } return $string; } } ?>
Ja sen käyttö esim:
<?php require("saunasms.class.php"); try { $lahetys = new saunasms("tunnus","salasana"); $lahetys->asetaVastaanottajat("0401234XXX"); if($lahetys->lahetaViesti("Hej på dig, min vän.")) { print ("Viesti toimitettu."); } $lahetys->kirjauduUlos(); } catch(Exception $e) { print $e->getMessage(); } ?>
tai:
<?php require("saunasms.class.php"); try { $lahetys = new saunasms("tunnus","salasana"); // Infoa $data = $lahetys->smsData(); print $data["jaljella"] . " kpl<br />"; print $data["lahetetty"] . " kpl<br />"; $lahetys->asetaVastaanottajat("0405644XXX,0401234XXX,040123XXX"); if($lahetys->lahetaViesti("Hej på dig, min vän.")) { print ("Viesti toimitettu."); } $lahetys->kirjauduUlos(); } catch(Exception $e) { print $e->getMessage(); } ?>
Kiva vinkki, kehittelin taannoin itsekin tekstiviestien lähetystä PHP:llä (Soneran API:n kautta).
Muutama parannusehdotus:
Metabolix kirjoitti:
Käyttäjänimi ja salasana kannattaa myös enkoodata.
Tarpeetonta johtuen saunalahden knimi ja salasana käytännöstä. Mut pieni vaiva toki.
Metabolix kirjoitti:
Viestin katkaisu pitäisi tehdä vasta UTF-8-dekoodauksen jälkeen.
Hyvä huomio, se selittääkin aika paljon :)
Metabolix kirjoitti:
$this->viesti on aivan turha, olisi paljon kätevämpää (ja siistimpää) antaa sekä viesti että numerot suoraan lahetaViesti-funktiolle.
Totta, tjaa a.
Metabolix kirjoitti:
Numerot olisi kiva voida antaa myös taulukkona.
Jos nyt muodot:
$lahetys->asetaVastaanottajat("0401234XXX"); /** Tai **/ $lahetys->asetaVastaanottajat("0405644XXX,0401234XXX,040123XXX");
ei kävis, niin voi aina:
$lahetys->asetaVastaanottajat(implode(",", $numerot));
PHP 5.3.5:ssa pitää asettaa
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
jotta koodi toimii. Muuten toimii hienosti, kiitos! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.