#!/usr/bin/perl -w

# Skrypt wysyłający SMS-y na wszystkie polskie sieci przez bramkę
# Era - Dostęp Skryptowy API Prywatne, wersja Podstawowa (darmowa).
# info: http://www.eraomnix.pl/service/gw/bAPIPrv.jsp
# Napisany w Perlu. 
# Wymaga: perl + LWP (RPM dla RedHat: perl-libwww)
#
# (c) 2003-2005 Jacek Fiok <jfiok@jfiok.org>; http://sms.jfiok.org
#
# wysyła wiadomości: dowolnie długie w kawałkach po 110 znaków; sieci: ERA GSM

use strict;
use HTTP::Request::Common;
use HTTP::Cookies;
use LWP::UserAgent;
use URI::URL;
use CGI;
# 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//;

@{$ua->requests_redirectable} = ();

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

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;

	debug ("wysyłam...");
	my $url = url ('http://www.eraomnix.pl/msg/api/do/tinker/sponsored');
	$url->query_form( success => 'http://www.era.pl', failure => 'http://www.era.pl', login => $username, password => $password, number => '48'.$numer, message => $tresc);
	$res = $ua->get($url);	

	if (!($res->is_redirect)) { print $res->code."--\n".$res->message."--\n"; zakoncz("Coś nie tak - res nie jest redirectem", 1); }

	# print $res->header('Location')."---\n";
	my $args = $res->header('Location');
	# trzeba obciąć base url, zostawić tylko argumenty get
	$args =~ s/.*\?//;
	my $cgi = new CGI($args);
	# print $cgi->param('X-ERA-error')."---\n";
	# print $cgi->param('X-ERA-counter')."---\n";
	
	if ( (!(defined($cgi->param('X-ERA-error')))) || ($cgi->param('X-ERA-error')==0) ) {	
	    if (defined($cgi->param('X-ERA-counter'))) {
		print ("Wszystko OK; pozostały limit wiadomości: ".$cgi->param('X-ERA-counter')."\n"); 
	    } else {
		print ("Wszystko OK, ale serwer nie podał pozostałego limitu wiadomości\n");
	    }
	
	} else {
	    my %errorcodes = (
		    1 => 'awaria systemu',
		    2 => 'nieautoryzowany użytkownik (sprawdź hasło?)',
		    3 => 'dostęp zablokowany',
		    5 => 'błąd składni',
		    7 => 'wyczerpany limit SMS',
		    8 => 'błędny adres odbiorcy SMS',
		    9 => 'wiadomość zbyt długa',
		    10=> 'brak wymaganej liczby żetonów' );
	    print "Błąd wysyłania : ".$errorcodes{$cgi->param('X-ERA-error')}, "\n";

	}


} # for (kawałki wiadomości)


    

exit 0;

