#!/usr/bin/perl -w

# Skrypt wysyłający SMS-y na wszystkie polskie sieci przez bramkę
# Era Omnix Podstawowa (tj. z koniecznością logowania).
# http://www.eraomnix.pl/sms/do/singleSignonFromXAction
# Napisany w Perlu. 
# Wymaga: perl + LWP (RPM dla RedHat: perl-libwww)
#
# (c) 2003 Jacek Fiok <jfiok@jfiok.org>; http://sms.jfiok.org
#
# Podziękowania: Piotr Włodarczyk <piotr@wlodarczyk.waw.pl>
#
#
# wysyła wiadomości: dowolnie długie w kawałkach po 110 znaków; sieci: ERA GSM
#
#
#
# Last update: 03.12.2005
# Changelog:
#
# Legend: 
# + Added feature 
# * Improved/changed feature 
# - Bug fixed 
#
# 03.12.2005:
#  - Aktualizacja w zwiazku ze zmianami na stronie (by Marek 'Qwerty256' Knappe) 
#

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

# format struktury danych:
# string który możemy znaleźć w odpowiedzi z serwera =>
# [co należy z niego wywnioskować-opis, kod powrotu ze skryptu ]
my %odpowiedzi = (
	"Skrzynka wiadomości" => ["Wszystko OK", 0],
	"Zły numer" => ["Zły numer!", 2],
	"został wyczerpany" => ["Limit wiadomości na dziś przekroczony!", 3]
);

# główna procedurka analizująca odpowiedź serwera
# jeśli nie umiemy nic wywnioskować -> rzucamy [Nieznana Odpowiedz, 127]
sub analizujWynik {
	my $res = $_[0];
	my $searchString;
	my @val;
	while ( ($searchString, @val) = each (%odpowiedzi) ) {
	  if ($res =~ /$searchString/ ) {
		  print $odpowiedzi{$searchString}[0], "\n";
		  exit $odpowiedzi{$searchString}[1];
	  }		  
	}
	# jeśli nie znaleziono w opisach
	print "Nieznana odpowiedź:\n$res\n";
	exit 127;
}

# 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 -----------
my $token;


# 1. get sms-index
visit("http://www.eraomnix.pl/sso2/r_login.do?turl=http://www.eraomnix.pl/msg/user/sponsored/welcome.do?sn=Mojprofil&mg_id=4095&mg_ch=WWW&partnerlogin=test","Błąd przy otwieraniu formularza [1]", 1);
visit("http://www.eraomnix.pl/sso2/omnix_iframe/login.jsp","Błąd przy otwieraniu formularza [1]", 1);

if ($res->content =~ /TOKEN\" value=\"(.*)\"/ ) { $token=$1;} else { zakoncz ("Nie widze tokena?!", 127); }
       
# 2. send the POST login form
debug ("Logging in");
$req = POST "http://www.eraomnix.pl/sso2/authenticate.do", [
	login => $username,
	password => $password,
	"org.apache.struts.taglib.html.TOKEN" => $token
];

$res = $ua->request($req);
if (!($res->is_success)) { zakoncz("Błąd przy logowaniu - zerwane połączenie [2]", 1); }
if (!($res->content =~ /Pozostało SMS/)) { 
	zakoncz("Błąd przy logowaniu - nieprawidłowe hasło [2]", 6); 
} 
debug ("zalogowany");



my $poczatek=0;
my $dlugosc=110;

my $wiadomosc=$tresc;
my $ilosc_smsow = 1; 

if ((length($wiadomosc) % $dlugosc) != 0) { 
    $ilosc_smsow = ((length($wiadomosc) - (length($wiadomosc) % $dlugosc)) / $dlugosc) + 1; 
} else {
    $ilosc_smsow = length($wiadomosc) / $dlugosc;
}

debug("Liczba smsów do wysłania: ".$ilosc_smsow."\n");

# pętla wysyłająca po kawałku
for (my $i=1;$i<=$ilosc_smsow;$i++) {
	$tresc=substr($wiadomosc,$poczatek,$dlugosc);
	$poczatek += $dlugosc;

	my $sms_zostalo = 666;
	if ($res->content =~ /Pozostało SMSów: \<b\>([0-9]+)\<\/b\>/) { $sms_zostalo = $1; }
	if ($sms_zostalo == 666) { zakoncz ("Nie mogę odczytać ilości dostępnych SMSów", 1); }
	if ($sms_zostalo == 0) { zakoncz ("Limit wiadomości na ten miesiąc przekroczony", 3); }


	# 3. wyslij
if ($res->content =~ /TOKEN\" value=\"(.*)\"/ ) { $token=$1;} else { zakoncz ("Nie widze tokena?!", 127); }

	$req = POST 'http://www.eraomnix.pl/msg/user/sponsored/sms.do', [
		"top.phoneReceiver" => $numer,
		"top.text"  => $tresc,
		"org.apache.struts.taglib.html.TOKEN" => $token,
		"top.signature"	=> '',
		"top.characterLimit" => '99',
		"send" => '0',
		"mmsTab" => 'mmsTab',
		"send_x" => '15',
		"send_y" => '13'
	];


	$res = $ua->request($req);
	if (!($res->is_success)) { zakoncz("Błąd przy podglądzie wiadomości [3]", 1); }

	# 4. czy sie wysłało (?).

	my $sms_zostalo2 = 666;
	if ($res->content =~ /Pozostało SMSów: \<b\>([0-9]+)\<\/b\>/) { $sms_zostalo2 = $1; }
	if ($sms_zostalo2 == 666) { zakoncz ("Nie mogę odczytać ilości dostępnych SMSów", 1); }

	if ($sms_zostalo > $sms_zostalo2) {
		print ("Wszystko OK; pozostały limit wiadomości: ".$sms_zostalo2."\n"); 
	} else {
		print ("Wiadomość wysłana, ale STATUS NIEZNANY (pozostały limit: ".$sms_zostalo2.").\n");
	}
}

exit 0;


