Прогноз погоды по sms (*nix + shell script, email2sms)
Создано: 12-03-2009 17:39:20 изменено: 04-07-2009 19:20:04  Метки: bash
http://habrahabr.ru/blogs/linux/54199/
Захотелось мне получать прогноз погоды на завтра по смс. Бесплатно, конечно :) Причём захотелось давно, был написан скрипт, который успешно работал, но некоторое время назад перестал (сменился формат на сайте). Решил переписать скрипт заново, заодно и сменить «поставщика прогнозов» на всем известного Gismeteo. Заранее оговорюсь, что скрипт, может, и не само совершенство, зато в некотором роде универсальный (предусмотрен вариант отправки транслитом) и, что самое главное, рабочий :)

#!sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
       4.

       5. fetch -a -q -w 5 -o /tmp/weather.xml http://informer.gismeteo.ru/rss/48454.xml
       6. iconv -c -f windows-1251 -t koi8-r /tmp/weather.xml > /tmp/weather-koi8.xml
       7. TODAY=`date -v+1d "+%d:"`
       8.

       9. # -= Night =-
      10. WEATHER_BETA=`cat /tmp/weather-koi8.xml | grep -A 2 "Бангкок: Ночь" | tail -n 1`
      11. CLOUDINESS=`echo $WEATHER_BETA | awk -F"<|>|," '{print $3}'`
      12. PRECIPITATION=`echo $WEATHER_BETA | awk -F"<|>|," '{print $4}'`
      13. TEMPERATURE=`echo $WEATHER_BETA | awk -F"<|>|," '{print $5}' | awk '{print $2}'`
      14. WIND=`echo $WEATHER_BETA | awk -F"<|>|," '{print $7 $8}' | awk '{print $2 " " $3 $4}'`
      15. if [ "$PRECIPITATION" != "без осадков" ]
      16. then
      17.     WEATHERN=`echo $TEMPERATURE", "$CLOUDINESS", "$WIND`
      18. else
      19.     WEATHERN=`echo $TEMPERATURE", "$PRECIPITATION", "$WIND`
      20. fi
      21.

      22.


      23. # -= Day =-
      24. WEATHER_BETA=`cat /tmp/weather-koi8.xml | grep -A 2 "Бангкок: День" | tail -n 1`
      25. CLOUDINESS=`echo $WEATHER_BETA | awk -F"<|>|," '{print $3}'`
      26. PRECIPITATION=`echo $WEATHER_BETA | awk -F"<|>|," '{print $4}'`
      27. TEMPERATURE=`echo $WEATHER_BETA | awk -F"<|>|," '{print $5}' | awk '{print $2}'`
      28. WIND=`echo $WEATHER_BETA | awk -F"<|>|," '{print $7 $8}' | awk '{print $2 " " $3 $4}'`
      29. if [ "$PRECIPITATION" != "без осадков" ]Weather forecast SMS
      30. then
      31.     WEATHERD=`echo $TEMPERATURE", "$CLOUDINESS", "$WIND`
      32. else
      33.     WEATHERD=`echo $TEMPERATURE", "$PRECIPITATION", "$WIND`
      34. fi
      35.

      36. WEATHERN_TR=`echo $WEATHERN | tr "абвгдезийклмнопрстуфхцьыАБВГДЕЗИЙКЛМНОПРСТУФХЦЬЫ" "abvgdezijklmnoprstufhc'yABVGDEZIJKLMNOPRSTUFHC'Y" | sed -e 's/ё/io/g;s/ж/zh/g;s/ч/ch/g;s/ш/sh/g;s/щ/sch/g;s/э/\`e/g;s/ю/yu/g;s/я/ya/g;s/ъ/"/g;s/Ё/Io/g;s/Ж/Zh/g;s/Ч/Ch/g;s/Ш/Sh/g;s/Щ/Sch/g;s/Э/\`Е/g;s/Ю/Yu/g;s/Я/Ya/g;s/Ъ/"/g;'`
      37. WEATHERD_TR=`echo $WEATHERD | tr "абвгдезийклмнопрстуфхцьыАБВГДЕЗИЙКЛМНОПРСТУФХЦЬЫ" "abvgdezijklmnoprstufhc'yABVGDEZIJKLMNOPRSTUFHC'Y" | sed -e 's/ё/io/g;s/ж/zh/g;s/ч/ch/g;s/ш/sh/g;s/щ/sch/g;s/э/\`e/g;s/ю/yu/g;s/я/ya/g;s/ъ/"/g;s/Ё/Io/g;s/Ж/Zh/g;s/Ч/Ch/g;s/Ш/Sh/g;s/Щ/Sch/g;s/Э/\`Е/g;s/Ю/Yu/g;s/Я/Ya/g;s/Ъ/"/g;'`
      38. echo $TODAY $WEATHERN_TR"; "$WEATHERD_TR
      39.

      40.


      41. # Translit
      42. #echo $TODAY $WEATHERN_TR $WEATHERD_TR | mail -s "" number@sms.your.sms.gate -froot@yourdomain.net
      43.

      44. # Cyrillic
      45. echo $TODAY $WEATHERN"; "$WEATHERD | iconv -c -f koi8-r -t CP1251 | mail -s "" number@sms.your.sms.gate -froot@yourdomain.net
      46.

      47. rm -f /tmp/weather.xml
      48. rm -f /tmp/weather-koi8.xml

Примечания к скрипту:

* вместо «number@sms.your.sms.gate» нужно, естественно, вписать свой номер в соответствии с рекомендациями вашего оператора
* вместо «root@yourdomain.net» нужно вписать действующий адрес, т.к. он проверяется некоторыми операторами, причём желательно, чтобы адрес был как можно короче, т.к. он будет включён в основной текст sms и «съест» несколько драгоценных символов
* с кириллицей, скорее всего, придётся повозиться, ибо к ней применимо множество ограничений, от в два раза меньшего количества символов в sms до принудительной транслитерации на стороне оператора
* если нужно указать нескольких получателей, то нужно делать примерно вот так: /usr/bin/mail -s "" -c number2@sms.your.sms.gate,number3@sms.your.sms.gate number1@sms.your.sms.gate -froot@yourdomain.net. И не всовывайте всех получателей в одно письмо: в конфиге почтаря может быть ограничение на количество адресатов
* Обновление исходного xml происходит 4 раза в сутки: в 2:30, 8:30, 14:30 и 20:30 МСК по зимнему времени
______________________
UPD:
* в скрипте изначально были указаны абсолютные пути к утилитам для FreeBSD 7.1. У вас они могут лежать в другом месте! Поэтому, если у вас скрипт ещё с прописанными путями, то лучше их из скрипта убрать, а при редактировании кронтаба, в самом его начале, перед расписаниями, прописать правильный PATH для вашей ОС, например, вот такой: PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
* ID нужного города можно узнать в настройках xml-информера

Вот, собственно и всё. Осталось только внести выполнение скрипта в кронтаб. Надеюсь, кому-нибудь пригодится :)

P.S. Абонентам украинского Beeline очень рекомендую почитать об услуге SMS на Email — там описано как включить приём кириллицы и возможность приёма «склеенных» sms.
1499 просмотров комментировать