Как стать автором
Обновить

Прогноз погоды по sms (*nix + shell script, email2sms)

Время на прочтение 3 мин
Количество просмотров 6.8K
Захотелось мне получать прогноз погоды на завтра по смс. Бесплатно, конечно :) Причём захотелось давно, был написан скрипт, который успешно работал, но некоторое время назад перестал (сменился формат на сайте). Решил переписать скрипт заново, заодно и сменить «поставщика прогнозов» на всем известного Gismeteo. Заранее оговорюсь, что скрипт, может, и не само совершенство, зато в некотором роде универсальный (предусмотрен вариант отправки транслитом) и, что самое главное, рабочий :)
  1. #!sh

  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH

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

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


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

  30. 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;'`
  31. 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;'`
  32. echo $TODAY $WEATHERN_TR"; "$WEATHERD_TR


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

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

  37. rm -f /tmp/weather.xml
  38. 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.
Теги:
Хабы:
+28
Комментарии 48
Комментарии Комментарии 48

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн