Strona Krysi i Rafała Fitt

HR_METEO – program do wysyłania SMS-ami prognozy pogody dla Chorwacji na telefon komórkowy

Skrypt przesyła SMS-ami morskie prognozy pogody dla Chorwacji.

Wymagania:
  1. moje skrypty
  2. program wget
  3. program awk
  4. program sendmail (jeżeli inny, to należy zmienić skrypt weather)
Stąd można ściągnąć poniższe skrypty. Po rozpakowaniu archiwum, należy oznaczyć skrypt weather jako wykonywalny (czyli wykonać chmod u+x weather). Należy pamiętać o zmianie numerów telefonów w skrypcie weather, skrypt wysyła tekst prognozy na adres emailowy bramki Plusa. Jeżeli posiadasz telefon w innej sieci, to musisz zmienić skrypt weather. Proponuję uruchamiać skrypt weather conajmniej raz dziennie, np. przy pomocy demona cron (patrz plik /etc/crontab).

Wygląd przykładowego SMS-a z ostrzeżeniami i sytuacją baryczną:
11.08.2005:1300 WARN:IsolatedThunderyRainshowers,MainlyInNorth&Central,DuringNightInSouthAdriaticAsWell.GustsOfNeWindExpectedInNorth&InAPartOfCentralAdriaticInSecondPartOfNight,Reaching30-40KTS,&DiminishingTomorrowDuringSYNOP:AShallowLowIsShiftingFromWestTowardAdriatic.END

Wygląd przykładowego SMS-a z prognozą na bieżące oraz następne 12 godzin:
11.08.2005:1300 FOR12H:Se6-14,InPlacesOfNorth&CentralAdriaticUpTo20,TurningInNorth&InAPartOfCentralAdriaticDuringNightToNe&N12-24KTS.Sea2-3,InOpenOfNorth&APartOfCentralAdriaticDuringNight3-4.VISIB10-20Km.VariablyOrMainlyCloudyWithScatteredRain,IsolatedRainshowers&Thunder,MainlyInNorth&Central,&InSouthAdriaticDuringNight.NEXT12H:VariablyOrMainlyCloudyWithScatteredRain,IsolatedRainshowers&Thunder,ParticularlyInFirstPartOfDay.GradualClearingIsExpectedInNorthAdriaticDuringDay.SlightlyCooler.InNorth&InAPartOfCentralAdriaticInMorningModerateToStrongNe,RapidlyDiminishing&TurningToNwWind.InSouthAdriaticStillLightToModerateSeWind.SeaSmooth,InMorningSlight,&InNorthAdriaticUpToModerate.END

Zawartość pliku weather:

#!/bin/sh
export TERM=xterm
export LYNX_TEMP_SPACE=/tmp
cd /gdziesnadysku/meteo

/usr/bin/lynx -reload -dump http://prognoza.hr/jadran_e.html > /gdziesnadysku/meteo/weather.txt

echo From: s@a.pl > /gdziesnadysku/meteo/sms
echo To: 48601123456@text.plusgsm.pl >> /gdziesnadysku/meteo/sms
/usr/bin/awk -f /gdziesnadysku/meteo/wapmeteo.awk /gdziesnadysku/meteo/weather.txt >> /gdziesnadysku/meteo/sms
echo END >> /gdziesnadysku/meteo/sms

/usr/sbin/sendmail -t < /gdziesnadysku/meteo/sms

/bin/sleep 3s

echo From: s@a.pl > /gdziesnadysku/meteo/sms12
echo To: 48601123456@text.plusgsm.pl >> /gdziesnadysku/meteo/sms12
/usr/bin/awk -f /gdziesnadysku/meteo/wapmeteo12.awk /gdziesnadysku/meteo/weather.txt >> /gdziesnadysku/meteo/sms12
echo END >> /gdziesnadysku/meteo/sms12

/usr/sbin/sendmail -t < /gdziesnadysku/meteo/sms12

rm -f /gdziesnadysku/meteo/weather.txt
rm -f /gdziesnadysku/meteo/sms
rm -f /gdziesnadysku/meteo/sms12
Zawartość pliku wapmeteo.awk:
BEGIN { RS="&"; }
{
   gsub(/\r/, " ");
   gsub(/\n/, " ");
   gsub(/\t\t/, " ");
   gsub(/\t /, " ");
   gsub(/WEATHER REPORT ISSUED BY THE MARINE METEOROLOGICAL CENTER SPLIT ON /,  "");
   gsub(/NO WARNINGS ARE IN FORCE./," NO.");
   gsub(/No warnings are in force./,"NO.");
   gsub(/WEATHER FORECAST FOR THE ADRIATIC FOR THE FIRST 12 HOURS:/,"FOR 12: ");
   gsub(/WEATHER FORECAST FOR THE NEXT 12 HOURS:/,"FOR NEXT 12: ");
   gsub(/[Ww]ind /, "");
   gsub(/PMC – Split.+/, "END");
   gsub(/HOURS/,"");
   gsub(/ +/, " ");

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

    $0 = out;
    gsub(/\. At/, ":");
    gsub(/Warning/, " WARN");
    gsub(/Synopsis/, "SYNOP");
    gsub(/ForNext12/, "NEXT12H");
    gsub(/For12/, "FOR12H");
#   gsub(/About/, "\\~");
    gsub(/Temperatures/, "TEMP");
    gsub(/Knots/, "KTS");
    gsub(/Visibility/, "VISIB");

    gsub(/The/, "");
    gsub(/And/, "\\&");

    gsub(/FOR12H.+/, "END");

    print "Subject: " $0;
    exit;
}
Zawartość pliku wapmeteo12.awk:
BEGIN { RS="&"; }
{
   gsub(/\r/, " ");
   gsub(/\n/, " ");
   gsub(/\t\t/, " ");
   gsub(/\t /, " ");
   gsub(/WEATHER REPORT ISSUED BY THE MARINE METEOROLOGICAL CENTER SPLIT ON /,  "");
   gsub(/NO WARNINGS ARE IN FORCE./," NO.");
   gsub(/No warnings are in force./,"NO.");
   gsub(/WEATHER FORECAST FOR THE ADRIATIC FOR THE FIRST 12 HOURS:/,"FOR 12: ");
   gsub(/WEATHER FORECAST FOR THE NEXT 12 HOURS:/,"FOR NEXT 12: ");
   gsub(/[Ww]ind /, "");
   gsub(/PMC – Split.+/, "END");
   gsub(/HOURS/,"");
   gsub(/ +/, " ");

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

    $0 = out;
    gsub(/\. At/, ":");
    gsub(/Warning/, " WARN");
    gsub(/Synopsis/, "SYNOP");
    gsub(/ForNext12/, "NEXT12H");
    gsub(/For12/, "FOR12H");
#   gsub(/About/, "\\~");
    gsub(/Temperatures/, "TEMP");
    gsub(/Knots/, "KTS");
    gsub(/Visibility/, "VISIB");

    gsub(/The/, "");
    gsub(/And/, "\\&");
    gsub(/End/, "END");

    gsub(/WARN.+FOR12H/, "FOR12H");

    print "Subject: " $0;
    exit;
}
© Krystyna & Rafał Fitt. Jeżeli kopiujesz, to przynajmniej napisz kto to wymyślił i gdzie to znalazłeś ;-)
© Krystyna & Rafał Fitt