Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Saualahden SMS - luokka

qeijo [21.08.2011 15:11:47]

#

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();
}

?>

Metabolix [23.08.2011 17:28:19]

#

Kiva vinkki, kehittelin taannoin itsekin tekstiviestien lähetystä PHP:llä (Soneran API:n kautta).

Muutama parannusehdotus:

qeijo [23.08.2011 18:36:03]

#

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));

aliz_bazar [03.01.2012 00:42:36]

#

PHP 5.3.5:ssa pitää asettaa

curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

jotta koodi toimii. Muuten toimii hienosti, kiitos! :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta