30 8 * * * wapuser nice /gdziesnadysku/wapmeteo/go
30 18 * * * wapuser nice /gdziesnadysku/wapmeteo/go
Wygląd przykładowego SMS-a:
Cromarty0505 15/jul/02
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.
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ś ;-)