Strona Krysi i Rafała Fitt

WAPMETEO – program do wysyłania SMS-ami prognoz na podane obszary na telefon komórkowy

Skrypt przesyła SMS-ami prognozy z obszaru prognoz MetOffice.
Wymagania:
  1. moje skrypty
  2. program wget
  3. program awk
  4. program sendmail (jeżeli inny, to należy zmienić skrypt sms)
  5. opcjonalnie program procmail (umożliwia zmianę regionów z telefonu)
Stąd można ściągnąć poniższe skrypty. Po rozpakowaniu archiwum, należy oznaczyć skrypt go jako wykonywalny (czyli wykonać chmod u+x go). Należy pamiętać o zmianie numerów telefonów w skrypcie sms. Zalecam uruchamianie skryptu go conajmniej raz dziennie, np. przy pomocy demona cron (patrz plik /etc/crontab). Przykładowy wpis:
30 8 * * * wapuser nice /gdziesnadysku/wapmeteo/go
30 18 * * * wapuser nice /gdziesnadysku/wapmeteo/go

Wygląd przykładowego SMS-a:
Cromarty0505 15/jul/02SouthOrSouthwestVeeringNorthwest3ocnly4.PatchyRain.GoodOcnlyMod.

Dodatkowo można do swojego pliku .procmailrc można dopisać następującą regułę:

:0HWrc
* Subject:.*wapmeteo.*
| formail -I "" > /gdziesnadysku/wapmeteo/regions; /gdziesnadysku/go
co spowoduje, że treść emaila z tematem wapmeteo (wielkość liter nie jest ważna) zostanie zapisana do pliku regions, a następnie zostanie uruchomiony skrypt go, który od razu wyśle prognoze na nowe regiony. Emaila tego można wysłać zarówno z każdego programu pocztowego (należy wyłączyć wysyłanie w HTML-u), jak i z telefonu komórkowego w trakcie rejsu (patrz informacja o wysyłaniu emaili z telefonu). Można wysłać sobie emaila z kawiarenki internetowej w marinie lub poprosić znajomego w kraju.

Plik regions musi zawierać nazwy regionów, oddzielone znakami , lub . (lub innymi, które są zawarte pomiędzy [ i ] w pierwszej linijce pliku go.awk). Wielkość liter w nazwach regionów nie jest ważna, w nazwach mogą być spacje. Nazwy można skracać np. zamiast Viking może być V (skróty nazw regionów można znaleźć też go.awk). Przykładowa zawartość pliku regions:

c.40,sut@v#pl
co w efekcie spowoduje nam przysłanie prognoz na regiony Cromarty, Forties, South Utsire, Viking oraz Plymouth. Każdy region zostanie przysłany w osobnym SMS-ie. Należy pamiętać, że bramka email->SMS sieci Plus posiada ograniczenia dotyczące ilości SMS-ów z danego adresu IP oraz numeru telefonu.

Opis działania:
Po uruchomieniu skryptu go, program wget pobiera strony z serwera WAP MetOffice zawierającą Shipping Forecast na podane w pliku regions regiony (spis regionów). Zawartość każdej strony jest zapisywana na dysku do pliku output, następnie obrabiana skryptem wapmeteo.awk przy użyciu programu awk i zapisywana do pliku smsout. Skrypt sms wysyła zawartość pliku smsout na adres emailowy bramki Plusa. Jeżeli posiadasz telefon w innej sieci, to musisz zmienić skrypt sms.

Zawartość pliku go:
cd /gdziesnadysku/wapmeteo
awk -f go.awk regions
Zawartość pliku sms:
(
echo From: s@a.pl
echo To: 48601123456@text.plusgsm.pl
cat $1
) | /usr/sbin/sendmail -t
(
echo From: s@a.pl
echo To: 48603123456@text.plusgsm.pl
cat $1
) | /usr/sbin/sendmail -t
Zawartość pliku go.awk:
BEGIN { RS="[.,@#$|]"; IGNORECASE=1; OFS=""; }

function go(url, region)
{
#    print region;
    f_url = "http://www.mymetoffice.com/GRP.asp?C=-1&I=" url "&R=1";
    
    system("wget \"" f_url "\" -O output -a wget.log");
    system("awk -f wapmeteo.awk output > smsout")
    system("./sms smsout");
    next;
}

{   
    gsub(/\n/, ""); 
    gsub(/\r/, ""); 
    if ($0=="")
	next;
    gsub(/[^A-Za-z0-9]/, ""); 
}

/^ba/		{ go(38575, "Bailey"); }
/^bi/		{ go(38565, "Biscay"); }
/^c/		{ go(38553, "Cromarty"); }
/^dog/		{ go(38556, "Dogger"); }
/^dov/		{ go(38561, "Dover"); }
/^fae/		{ go(38577, "Faeroes"); }
/^fai/		{ go(38576, "FairIsle"); }
/^fas/		{ go(38569, "Fastnet"); }
/^fin/		{ go(38566, "Finist."); }
/^fis/		{ go(38557, "Fisher"); }
/^forth/   	{ go(38554, "Forth"); }
/^forties|^40/	{ go(38552, "Forties"); }
/^g/		{ go(38558, "GermanB"); }
/^he/		{ go(38574, "Hebrides"); }
/^hu/		{ go(38559, "Humber"); }
/^i/		{ go(38570, "IrishSea"); }
/^l/		{ go(38568, "Lundy"); }
/^m/		{ go(38573, "Malin"); }
/^n/		{ go(38550, "NUtsire"); }
/^pl/		{ go(38564, "Plymouth"); }
/^po/		{ go(38563, "Portland"); }
/^r/		{ go(38572, "Rockall"); }
/^sh/		{ go(38571, "Shannon"); }
/^sol/		{ go(38567, "Sole"); }
/^southe|^sice/	{ go(38578, "SEIceland"); }
/^southu|^sut/	{ go(38551, "SUtsire"); }
/^th/		{ go(38560, "Thames"); }
/^ty/		{ go(38555, "Tyne"); }
/^v/		{ go(38549, "Viking"); }
/^w/		{ go(38562, "Wight"); }
Zawartość pliku wapmeteo.awk:
BEGIN { RS=""; }
{   gsub(/.*<p>/, ""); 
    gsub(/<br\/><a.*/, ""); 
    gsub(/<br\/>/, ""); 
    gsub(/\r/, ""); 
    gsub(/\n/, " "); 
    gsub(/ +/, " "); 

#   zostawiamy nazwa obszaru na poczatku
    gsub(/^ SAF for /, "");
    gsub(/^ for /, "");
    gsub(/ 24 HRS FROM/, "");


    while (match($0, " *[^ ]+ *"))
    {
	# zapamietanie bo inne matche psuja
	_rstart = RSTART;
	_rlength = RLENGTH;

	a = substr($0, _rstart, _rlength);
	sub(/ /, "", a);
	a = toupper(a);
	l = length(a);
	if (l>1)
	{
	    # WEATHER -> Weather
	    b = substr(a, 2);
	    a = substr(a, 1, 1);
	    b = tolower(b);	    
	    a = a b;
    
	    # jezeli ostatni znak poprzedniego wyrazu to cyfra 
	    d = substr(out, length(out), 1);
	    if (match(d, /[0-9]/))
	    {
    		c = substr(a, length(a), 1);
    		# i pierwszy znak obrabianego wyrazu to tez cyfra, to wtedy spacja
    		if (match(c, /[0-9]/))
		{
		    a = " " a;
		}
		else if (substr(a,1,1)=="O")
		{
		    # mala litera o po cyfrze, bo inaczej wprowadza w blad
		    a = "o" b;
		}
	    }
	}

	out = out a;
	$0 = substr($0, _rstart+_rlength);
    }
    
    print out; 
    exit; 
}
© Rafał Fitt. Jeżeli kopiujesz, to przynajmniej napisz kto to wymyślił i gdzie to znalazłeś ;-)
© Krystyna & Rafał Fitt