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.