#!/usr/bin/perl -w

# Skrypt wysyłający SMS-y na wszystkie polskie sieci przez bramkę
# Miasto Plusa (tj. z koniecznością logowania).
# http://www.miastoplusa.pl
# Napisany w Perlu. 
# Wymaga: perl + libwww-perl (apt-get install libwww-perl) dla Debiana
#
# Autor:
# Rafal "RaV." Matczak [rafal.matczak..skorpion.wroc.pl] (wstaw@pomiedzy.dwie.kropki)
#
# Wersja:
# 0.0.3
#
# Na bazie skryptow:
# Jacka Fioka http://sms.jfiok.org
#
# Licencja:
# GNU General Public License (http://www.gnu.org.pl/text/licencja-gnu.html)
# 
# Jako autor skryptu nie udzielam ZADNEJ gwarancji na poprawne dzialanie skryptu,
# ani tego, ze bedzie on przydatny. Pamietaj, ze uzywasz skryptu wylacznie na 
# wlasna odpowiedzialnosc.
#
# wysyła wiadomości: do 600 znakow dzielac je na mniejsze i
# laczac je w jedna. Wg. MiastaPlusa czesc telefonow traktuje go jako jeden SMS

use strict;
use HTTP::Request::Common;
use HTTP::Cookies;
use LWP::UserAgent;

# use LWP::Debug qw(+ -conns);
# LWP::Debug::trace('send()');

# ----------------------- pomocnicze -------------------------

my $debug = 0;				# czy "tryb gadatliwy"

sub debug { if ($debug) { print "[", shift, "]\n"; } }

sub zakoncz {
  my ($tekst, $ret) = @_;
  print "$tekst\n";
  exit $ret;
}

# getCookie ($nazwa) -> wartość cookie; wymaga: $cookie_jar.
my $ckey = "";
my $cval = "";
my $cookie_jar = HTTP::Cookies->new;
# zwraca wartość ciasteczka dla podanej nazwy klucza
sub cookieScanner {
	# my $i; for ($i=0; $i<5; $i++) { print $i, " : ", $_[$i], "\n"; }
	($ckey eq $_[1]) and $cval = $_[2]; 
}
sub getCookie {
	$cval = "";
	$ckey = shift;
	$cookie_jar->scan (\&cookieScanner);
	return $cval;
}

my $ua = new LWP::UserAgent;
$ua->timeout(30);
$ua->agent("Mozilla/5.0 Galeon/1.2.7 (X11; Linux i686; U;) Gecko/20021216");
$ua->env_proxy();
$ua->cookie_jar($cookie_jar);

# odwiedza stronę $_[0]; w razie błędu wychodzi z tekstem $_[1] i kodem $_[2].
# w zmiennej globalnej $res ląduje HTML -- wynik zapytania.
my $res; my $req;
sub visit {
        $res = $ua->request (GET $_[0]);
        if (!($res->is_success)) { zakoncz($_[1], $_[2]); }
}
# ----------------------- main() -----------------------------

select(STDERR); $| = 1;     # make unbuffered
select(STDOUT); $| = 1;     # make unbuffered

if ($#ARGV != 3 ) { die "Zła ilość parametrów - podaj numer i treść sms-a"; }

my $numer = $ARGV[0];
my $tresc = $ARGV[1];
my $username = $ARGV[2];
my $password = $ARGV[3];

# wstępna obróbka numerów. nazwą użytkownika na bramce ma być nr telefonu, lub e-mail.
# jeśli numer, to ma się zaczynać na "48", bez plusa. wpp zostaw bez zmian.
$username =~ s/^\+//;
if (($username =~ /^[0-9]/) and (!($username =~ /^48/))) { $username = "48".$username; }
$numer =~ s/^\+48//;
$numer =~ s/^00//;

push @{ $ua->requests_redirectable }, 'POST';

# --------- konwersacja -----------

# 1. get sms-index
visit ("http://www.miastoplusa.pl/minimal/frameset.jsp",
       "Błąd przy otwieraniu formularza [1]", 1);
# 2. send the POST login form
debug ("Logging in");
$req = POST "http://www.miastoplusa.pl/auth/LoginCitizen.do", [
	"login" => $username,
	"password" => $password
];
$req->referer ("http://www.miastoplusa.pl/sms/send_sms.jsp");
$res = $ua->request($req);
if (!($res->is_success)) { zakoncz("Błąd przy logowaniu - zerwane połączenie [2]", 1); }
if (($res->content =~ /Uwaga, wielko/)) { 
#print $res->content;
	zakoncz("Błąd przy logowaniu - nieprawidłowe hasło [2]", 1); 
} 
debug ("zalogowany");

#3 wysylanie smsa

visit ("http://www.miastoplusa.pl/sms/send_sms.jsp", "Błąd przy otwieraniu formularza [2]", 1);

$req = POST 'http://www.miastoplusa.pl/sms/SendSMS2.do', [
	"smsType"	=> "10",
	"phoneNumber"	=> $numer,
	"smsType"	=> "20",
	"userId"  => "0",
	"smsType"	=> "30",
	"groupId" => "0",
	"message"	=> $tresc,
	"notifyCode"	=> "0",		# czy ma wysylac potwierdzenie dostarczenia
	"validity"	=> "72",		# waznosc smsa w godzinach
	"sendDay"	=> "-1",		# kiedy wyslac
	"sendHour"	=> "0",			# -----||-----
	"sendMin"	=> "0",			# -----||-----
	"archiveMessage"  => "0",	# czy archiwizowac
	"flashMessage"	=> "0",		# czy ma to byc sms w klasie 0
	"templateCategory"	=> "0",	
	"targetURL"	=> "/sms/send_sms.jsp"
	];

$req->referer("http://www.miastoplusa.pl/sms/send_sms.jsp");
debug ("Wysylam...");	
$res = $ua->request($req);
#	print ($res->content);			#debuguje wyjscie

# odzczytywanie odpowiedzi serwera
if (!($res->is_success)) { zakoncz("Błąd przy wysylaniu wiadomości [3]", 1); }
if ($res->content =~ /SMS przekazany/) {debug("SMS przekazany do wysłania."); };
if ($res->content =~ /Podany numer telefonu jest nieprawid/) {zakoncz("Błędny numer telefonu odbiorcy [3]", 1)};
if ($res->content =~ /Limit płatnych SMS-ów został wyczerpany/) {zakoncz("Limit płatnych SMSów został wyczerpany. Doładuj konto [3]", 1)};
if ($res->content =~ /SMSa to 600 znak/) {zakoncz("SMS za dlugi. Maksymalnie 600 znakow [3]", 1)};

# sprawdzam ilosc SMSow
my $ilosc_Plus = "666";
my $ilosc_other = "666";

if ($res->content =~ /sieci Plus GSM\<\/td\>\<td align=\"right\" bgcolor=\"#eeeeee\">([\w\sń]+)([\s\S]*)do innych sieci\<\/td\>\<td align=\"right\" bgcolor=\"#eeeeee">([0-9\/]+) */)
		{ $ilosc_Plus = $1; $ilosc_other = $3;};
		
# cos poszlo nie tak przy odczytywaniu...
if (($ilosc_Plus eq "666")||($ilosc_other) eq "666") {zakoncz("Blad przy odczytywaniu ilosci SMS'ow")}
		
print "Stan twojego konta umożliwia wysłanie SMS-ów:\n\tdo sieci Plus GSM:\t$ilosc_Plus\n\tdo innych sieci:\t$ilosc_other\n";

exit 0;

