#!/usr/bin/perl

#################################################################
#  								#
#    Skrypt wysyłający SMSy z logowanej bramki MiastoPlusa	#
#                     http://www.plus.pl   			#
#  								#
#  Autor: Rafał 'RaV.' Matczak					#
#  Kontakt: rafal.matczak..poczta.finemedia.pl (s/../\@/)	#
#								#
#  Licencja: GPL (http://www.gnu.org.pl/text/licencja-gnu.html)	#
#								#
#  Autor nie udziela żadnej gwarancji, że niniejszy program	#
#  będzie działał poprawnie i nie bierze odpowiedzialności za	#
#  ewentualne szkody wyrządzone przez niewłaściwe użytkowanie	#
#  lub wadliwe działanie skryptu. Używasz programu na 		#
#  własną odpowiedzialność.					#
#  								#
#################################################################

use Getopt::Std;	# obsługa parametrow
use strict;
use HTTP::Request::Common;
use HTTP::Cookies;	# obsługa szarlotek
use Crypt::SSLeay;
use LWP::UserAgent;	# przeglądarka

my $version="0.0.3";
my $author="#rabvfal.mbatczaxk,po#bczta.fxiwnebqmxedia.pbl";

getopts('ad:fg:ihn:vw:');	# pobieram parametry
our($opt_a, $opt_d, $opt_f, $opt_g, $opt_h, $opt_i, $opt_n, $opt_v, $opt_w);

my $ua = new LWP::UserAgent;
$ua -> timeout(30);
$ua -> agent('Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');

my $cookie_jar_obj = HTTP::Cookies->new;
$ua -> cookie_jar( $cookie_jar_obj );

my $res;	# zmienna globalna zawierajaca wynik zapytania
my $req;	# zmienna, gdzie wczesniej przygotowuje zapytanie

# zmienne do obslugi SMSa (formularz na stronie)
my $flash; my $archive; my $notify; my $waznosc; my $godzina; my $minuta; 
my $implikacja_dg=0; my $dzien;

# funkcja wyświetlająca pomoc dotycząca użycia skryptu
sub pomoc
{
    my $skrypt = `echo $0`;	# jak wywolany skrypt skryptu
    $skrypt =~ s/\n//;
    print "UŻYCIE\n$skrypt [OPCJE] ODBIORCA \'TREŚĆ\' LOGIN HASŁO\n\n";
    print "OPCJE
    -a		Archiwizuj
    -d 0..7	Kiedy wysłać SMSa:
		    0 - Dzisiaj,
		    1 - Jutro,
		    2 - Pojutrze,
		    3 - Za 3 dni,
		    4 - Za 4 dni,
		    5 - Za 5 dni,
		    6 - Za 6 dni,
		    7 - Za tydzień.
		Użycie tego parametru implikuje użycie opcji -g.
		Domyślnie wysyła SMSa natychmiast.
    -f		Flash SMS
    -g HH:MM	O której godzinie wysłać SMSa. Implikuje użycie opcji -d
		    HH - godzina podana w systemie 24 godzinnym (0..23)
		    MM - minuty (0..59)		    
    -h		To, co teraz czytasz ;)
    -i		Informacje o wersji skryptu i autorze
    -n www|sms	Powiadamianie o dostarczeniu
    -w h	Waznosc SMSa w godzinach (8, 24, 48, 72). Domyślnie 72
    -v		Tryb gadatliwy\n"
}


sub info
{
    $author =~ s/[#bqxwvs]//g;
    $author =~ s/\,/\@/g;
    &zakoncz("Skrypt wysyłający SMSy z logowanej bramki MiastaPlusa.
Autor: Rafał 'RaV.' Matczak <$author>
Wersja: $version\n", 2);
}


# funkcja sprawdzajaca poprawnosc podanych parametrow a w razie ich
# braku, przyjmujaca wartosci domyslne
sub check_parameters 
{
    my $param_error=0;
    # Raporty doreczen
    if (($opt_n ne "") && ($opt_n ne "www") && ($opt_n ne "sms"))
	{print("Zły parametr -n www|sms\n"); $param_error=1;};
    # Waznosc SMSa w godzinach
    if (($opt_w ne "") && ($opt_w != 8) && ($opt_w != 24) && 
	($opt_w != 42) && ($opt_w != 72))
	{print("Zły parametr -w 8|24|48|72\n"); $param_error=1;};
    # Za ile dni wyslac
    if (($opt_d ne "") && (($opt_d<0) || ($opt_d>7)))
	{print("Zły parametr -d 0..7\n"); $param_error=1;};
    # Godzina wyslania
    if (($opt_g ne "") && ($opt_g=~/(\d{1,2})\:(\d{1,2})/))
    {
	$godzina=$1;$minuta=$2;
	if (($godzina<0)|| ($godzina>23)) {print "Błędna godzina\n"; $param_error=1;};
	if (($minuta<0)|| ($minuta>59)) {print "Godzina ma 60 minut!\n"; $param_error=1;};
    };
    
    # sprawdzam, czy parametry -d i -g wystepuja jednoczesnie
    if ($opt_d ne "") {$implikacja_dg=$implikacja_dg+1;};
    if ($opt_g ne "") {$implikacja_dg=$implikacja_dg+10;};
    if (($implikacja_dg!=0) && ($implikacja_dg!=11)) 
    {
	print "Opcje -d oraz -g muszą być użyte jednocześnie\n"; $param_error=1;
    };
	
    if ($param_error!=0){&zakoncz("Błędne opcje. Proszę popraw!", 1)};
    
    if ($opt_f) {$flash="1"} else {$flash="0"};	# flashSMS
    if ($opt_a) {$archive="1"} else {$archive="0"};	# archiwizacja
    if ($opt_n eq "www") {$notify="10"}	# raport www
	elsif ($opt_n eq "sms") {$notify="30"} # raport sms
	else {$notify="0"};	# domyslnie bez raportu
    if ($opt_w ne "") {$waznosc="$opt_w"} else {$waznosc="72"};
    if ($opt_d ne "") {$dzien="$opt_d"} else {$dzien="-1"};
    if ($opt_g eq "") {$godzina="0"; $minuta="0"};
}

# funkcja konczaca dzialanie w przypadku bledu i wypisujaca 
# informacje na ekran (parametr tekstowy)
sub zakoncz
    {
	my ($tekst, $ret) = @_;
	print "$tekst\n";
	exit $ret
    };
      

# funkcja odwiedzajaca strone 
# (1. parametr adres; 2. tekst w przypadku niepowodzenia)
sub visit
    {
	$res = $ua->request (GET $_[0]);
	if (!($res->is_success)) 
	{
	    &zakoncz($_[1], $_[2]);	# zakoncz z tekstem przekazanym w 2. parametrze i kodem wyjscia w 3.
	}
    };
    

# funkcja wyswietlajaca na ekranie informacje "debugujace"
sub debug 
    {
	if ($opt_v)
	{
	    print "[ ", shift, " ]\n";
	};
    };
    

# wlasciwy program

if ($opt_i) {&info};	
if ($opt_h) {&pomoc; &zakoncz("", 2);};

# co w przypadku nie przekazania wlasciwej ilosci niezbednych parametrow
if ($#ARGV != 3 )
{
    &pomoc;
    &zakoncz ("Zła ilość parametrów", 1);
}

&check_parameters;

# pobieram wymagane parametry i przyposuje do zmiennych
my $numer = $ARGV[0];
my $tresc = $ARGV[1];
my $username = $ARGV[2];
my $password = $ARGV[3];

# pozwol sie przekierowywac
push @{ $ua->requests_redirectable }, 'POST';

&debug("Logowanie do bramki");

# wypelniam formularz
$req = POST "https://www1.plus.pl/sso/logowanie/auth",
    ["login" => $username,
    "op" => "login",
    "Zaloguj" => "Zaloguj",
    "password" => $password];

# sprobuj zalogowac		
$res = $ua->request($req);
if (!($res->is_success)) {&zakoncz("Błąd przy logowaniu - zerwane połączenie", 1);};
if (($res->content =~ /Logowanie/)) {&zakoncz("Błąd przy logowaniu - nieprawidłowy login lub hasło", 1);};
if (($res->content =~ /Konto zablokowane/)) {&zakoncz("Konto zablokowane. Spróbuj za jakiś czas.", 1);};
&debug("Zalogowany");

# preparowanie SMSa
$req = POST 'http://www1.plus.pl/rozrywka_i_informacje/sms/SendSMS2.do', [
    "smsType"       => "10",
    "phoneNumber"   => $numer,
    "smsType"       => "20",
    "userId"  => "0",
    "smsType"       => "30",
    "groupId" => "0",
    "message"       => $tresc,
    "notifyCode"    => "$notify",         # czy ma wysylac potwierdzenie dostarczenia
    "validity"      => "$waznosc",                # waznosc smsa w godzinach
    "sendDay"       => "$dzien",                # kiedy wyslac
    "sendHour"      => "$godzina",                 # -----||-----
    "sendMin"       => "$minuta",                 # -----||-----
    "archiveMessage"  => "$archive",       # czy archiwizowac
    "flashMessage"  => "$flash",         # 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 ("Wysyłam");

# wysłanie zapytania
$res = $ua->request($req);

# odczytuje odpowiedzi bramki i probuje dopasowac wynik. W przeciwnym wypadku
# wyswietla cala strone i prosi o przeslanie jej do autora
if ($res->content =~ /Podany numer telefonu jest nieprawid/) {&zakoncz("Podany numer telefonu jest nieprawidłowy", 1);};
if ($res->content =~ /SMSa to 600 znak/) {&zakoncz("SMS za długi. Maksymalnie 600 znaków", 1)};
if ($res->content =~ /Wysłanie SMS-a pod ten numer jest obecnie niemożliwe/) { zakoncz("SMS NIE został wysłany - zabezpieczenie antyspamowe", 1)};
if ($res->content =~ /\<\/td\>\<td align\=\"right\" bgcolor\=\"\#eeeeee\"\>(\d+) pkt./) {print "Ilość pozostałych punktów: $1\n"};
if ($res->content =~ /SMS przekazany do wys/) {&debug ("Wysłałem");&zakoncz("SMS przekazany do wysłania", 1);}
else {print $res->content; &zakoncz("\n\nNieznana odpowiedź bramki. Jeśli to możliwe, to wyślij mi kod powyżej strony.", 1)};

