<?php
/*
Skrypt zawiera dwie funkcje CURL obsługująca mBox'a orange.pl.
Skrypt wykorzystuje Xpath'a.
PHP 5*...

Skrypt pozwala na wysyłanie długich smsów, dzieli wpisany tekst na 640 znaków akceptowanych przez bramkę i
wysyła jako 'n' ilość smsów.

Zachęcam do dowolnego wykorzystania, modyfikacji i ulepszania (też chciałbym kopię ;)).
piotr eldora pl
20091103
*/


/*
Ustawienie zmiennych użytkownika, wystarczy wpisać dane i skrypt będzie po prostu działał
*/

// określenie użytkownia oraz hasła do portalu orange.pl
$user "";
$pass "";

// określenie danych wiadomości sms
$number ""
$msg "";

/*
Ustawienia podstawowych zmiennych skryptu
*/

// ustawienie klienta
$userAgent $_SERVER['HTTP_USER_AGENT'];
// $userAgent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3';

// ustawienia pliku cookie, należy się upewnić, że można zapisywać
$cookie '/tmp/'.md5(microtime());

// określenie wykorzystywanych URL
$loginURL 'http://www.orange.pl/portal/map/map/signin';
$smsURL 'http://www.orange.pl/portal/map/map/message_box?mbox_view=newsms';
$sendURL 'http://www.orange.pl/portal/map/map/message_box?_DARGS=/gear/mapmessagebox/smsform.jsp';


/*
*
*  Koniec zmiennych kontrolnych
*
*/

// fukcja pobierania stron
function curl_get ($url) {
    global 
$userAgent,$cookie;
    
$ch curl_init();
//    curl_setopt($ch, CURLOPT_VERBOSE, true);
    
curl_setopt($chCURLOPT_URL$url);
    
curl_setopt($chCURLOPT_USERAGENT$userAgent);
    
curl_setopt($chCURLOPT_COOKIEJAR,$cookie);
    
curl_setopt($chCURLOPT_COOKIEFILE$cookie);
    
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    
$out curl_exec($ch);
    
curl_close($ch);
    return 
$out;
}

// funkcja wysyłania danych do formularzy
function curl_post ($url,$data,$referer) {
    global 
$userAgent,$cookie;
    
$ch curl_init();
//    curl_setopt($ch, CURLOPT_VERBOSE, true);
    
curl_setopt($chCURLOPT_TIMEOUT20);
    
curl_setopt($chCURLOPT_URL$url);
    
curl_setopt($chCURLOPT_USERAGENT$userAgent);
    
curl_setopt($chCURLOPT_REFERER$referer);
    
curl_setopt($chCURLOPT_POST1);
    
curl_setopt($chCURLOPT_POSTFIELDS$data);
    
curl_setopt($chCURLOPT_COOKIEJAR$cookie);
    
curl_setopt($chCURLOPT_COOKIEFILE$cookie);
    
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1);

    
$out curl_exec($ch);
    
curl_close($ch);
    return 
$out;
}

/* funkcja szukająca błędów na stronie, niestety nie może być uniwersalna,
   ponieważ w przypadku logowania curl wysyła POST do przekierowywanego GET.
   Można to obejść i jest to na liście todo...
*/
function error_check ($page) {
    
$doc = new DOMDocument();
    @
$doc ->loadHTML($page);
    
$xpath = new DOMXPath($doc);
    
$error $xpath->evaluate('//div[@class="box-error"]/p');
    if (
$error -> length 0) {
    for (
$n=0;$n $error->length;$n++) {
        echo 
$error ->item($n) -> nodeValue "<br>\n";
    }
    exit;
    }
    return 
false;
}
// funkcja wysyłająca sms'y
function send_sms ($msg,$number) {
    global 
$sendURL,$smsPost,$smsURL;
    
// Wyszukiwanie tokena
    
$doc = new DOMDocument();
    @
$doc->loadHTML(curl_get($smsURL));
    
$xpath = new DOMXPath($doc);
    
$token $xpath->evaluate('//input[@name="/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.token"]')->item(0)->getAttribute('value');

    
// Formularz wysyłania wiadomości sms
    
$smsData = array(
       
'_dyncharset' => 'UTF-8',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.type' => 'sms',
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.type' => '',
       
'enabled' => 'true',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.token' => $token,
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.token' => '',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.errorURL' => '/portal/map/map/message_box?mbox_view=newsms',
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.errorURL' => '',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.successURL' => '/portal/map/map/message_box?mbox_view=messageslist',
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.successURL' =>'',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.to' => $number,
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.to' => '',
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.body' => '',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.body' => $msg,
       
'_D:/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.create' => '',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.create' => 'Wyślij',
       
'_DARGS' => '/gear/mapmessagebox/smsform.jsp',
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.create.x' => 10,
       
'/amg/ptk/map/messagebox/formhandlers/MessageFormHandler.create.y' => 10
       
);
    
$smsPost '';
    foreach (
$smsData as $a => $b) {
    
$smsPost .= $a'=' .urlencode($b). '&';
    }

    
// Wysyłanie wiadomości
    
$send curl_post($sendURL,$smsPost,$smsURL);
    
error_check($send);
    return 
$send;
}

// Formularz logowania do portalu orange.pl
$loginData = array(
       
'_dyncharset' => 'UTF-8',
       
'/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.loginErrorURL' => 'http://www.orange.pl/portal/map/map/signin',
       
'_D:/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.loginErrorURL=' => '',
       
'/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.loginSuccessURL' => 'http://www.orange.pl/portal/map/map/pim',
       
'_D:/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.loginSuccessURL' => '',
       
'/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.value.login' => $user,
       
'_D:/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.value.login' => '',
       
'/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.value.password' => $pass,
       
'_D:/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.value.password' => '',
       
'/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.login.x' => 10,
       
'/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.login.y' => 10,
       
'_D:/amg/ptk/map/core/formhandlers/AdvancedProfileFormHandler.login' => '',
       
'&_DARGS' => '/gear/static/signInLoginBox.jsp'
       
);
// Poprawienie stringów
$loginPost '';
foreach (
$loginData as $a => $b) {
    
$loginPost .= $a'=' .urlencode($b). '&';
}

// Logowanie
curl_get($loginURL);
$login curl_post($loginURL,$loginPost,$loginURL);
if (
preg_match('/Podałeś błędny login lub hasło. Sprawdź je i wpisz jeszcze raz/'$login)) {
    echo 
"Błędne dane użytkownika.<br>\n";
    exit;
}
//error_check($login);

/*
*
* Wysyłanie wiadomości
*
*/

// dzieli wiadomości dłuższe niż 640 znaków na kilka sms'ów
if (strlen($msg) >640) {         // sprawdza długość sms'a
    
$msg str_split($msg,640);     // dzieli sms'a na kilka wiadomości
    
$n_sms count($msg);        // zlicza ilość wiadomości do wysłania
    
for ($n=0;$n<$n_sms;$n++) {
    
$sent send_sms($msg[$n],$number);
    echo 
"Wysłano część ".($n+1)." z $n_sms.<br>\n";
    
flush();            // czasami ten flush nie działa jak powinien...
    
sleep(3);            // żeby nie zabić bramki
    
}
}
else {
    
$n_sms 1;
    
$sent send_sms($msg,$number);
}
if (!
error_check($sent)) {
    echo 
"<br>Wiadomość wysłano poprawnie.<br>\n";
    
// sprawdza pozostałe smsy
    
$doc = new DOMDocument();
    @
$doc -> loadHTML($sent);
    
$xpath = new DOMXPath($doc);
    
$nsms1 $xpath->evaluate('//div[@id="syndication"]//p[@class="item"]/span[@class="value"]')->item(0)->nodeValue;
    
$nsms2 $xpath->evaluate('//div[@id="syndication"]//p[@class="item"]/span[@class="value"]')->item(1)->nodeValue;
    echo 
"Pozosotało $nsms1 bezpłatnych smsów oraz $nsms2 dodatkowych.<br>\n";
}
unlink($cookie);

?>