войти зарегистрироваться

Linux для всех whois

индекс
181,26

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

Захотелось мне получать прогноз погоды на завтра по смс. Бесплатно, конечно :) Причём захотелось давно, был написан скрипт, который успешно работал, но некоторое время назад перестал (сменился формат на сайте). Решил переписать скрипт заново, заодно и сменить «поставщика прогнозов» на всем известного 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.

______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru

комментарии (48)

  • Вот бы лучше рассказали как по-нормальному смс послать, а не email2sms :) и бесплатно…
    • просто! купите себе оператора мобильной связи… =) Говорят можно будет скоро взять подешевке парочку… =)
    • это?
      • Он разве не таким же образом шлет?
      • выглядит как троян…
        даже ставить боязно…
        • а зря, отличная программулина (по крайней мере, была года 1,5 назад) :)
    • Бесплатно на свой номер можно через гуглокалендарь — настраиваите там уведомления о событиях по sms — а дальше через гуглоапи календаря шлете себе смски — вот пример моего скриптика для всяких уведомлений с сервера
      pesikot.org/static/google_sms.html
      • Звиняюсь, ссылку криво написал. Вот:
        pesikot.org/static/google_sms.html

        Кстати юзаю уже года три наверное — работает как часы.
      • что то я туплю похоже — в предпросмотре ссылка кликабельна — а после поста уже нет…
        pesikot.org/static/google_sms.html
        • Ссылки в посте не кликабельны из-за этой, как её там… На «К» ;)
          А через гуглоапи сменить номер нельзя? Чтоб сделать отправку на несколько номеров, а не только свой. Спрашиваю, а не пробую, потому, что пока мне это только для справки, но за идею спасибо.
          • Номер сменяется только через подтверждение (отсылка кода на sms и ввод его в календаре) — так что на несколько номеров нельзя — хотя есть вариант — заренее забить номера — на каждый календарь можно назначить свой номер телефона — и добавлять события в разные календари.
  • Интересная идея. Можно добавить подобным образом информацию о курсе валют, последних новостей, еще парочку полезных вещей — и можно открывать свой ресурс.
  • а по чем берут за одну «настроечную» смс? по ссылке не указано… :(
    • Берут как за обычную sms. Малость обидно конечно, но зато у них эта услуга работает, в отличие от некоторых (МТС имею в виду), которые «в интересах абонентов» её отключили вообще. У Киевстара хоть активировать можно, позвонив оператору.
      • ага. я уже тоже это установил опытным путем. =) с меня по 32 копейки содрали за каждую… =)
        ну гривну ради интересу не жалко =)

        у Билайна в этом смысле всегда было лучше всех все.) Даже когда он еще и билайном никаким не был.
        я вообще впервые начал интернетом в телефоне пользоваться, когда купил себе ПриватМобайл. Вообще хорошая была виртуалка… =)

        Только что-то мне после этих манипуляций с смс имейлы вообще перестали приходить… :D
        • Я пока экспериментировал, тоже переставали ходить, буквально на пару минут. А потом пришли все кучей. Видать сервера у них сонные сейчас. Или тех. обслуга какая — время как раз подходящее :)
          • ага. мне тоже начали ходить. при чем с паузами минут в 5 и в обратном порядке)
            (те что отправил раньше пришли позже =))

            может там модераторы их перечитывают на предмет спама? :D
          • Еще 2 момента.
            Где выдрать рсс для Киева?
            informer.gismeteo.ru/ — тут только уродский совершенно xml предлагают… :(

            и второй как в мэйл правильно передать дополнительный заголовок? а то я там когда-то на серваке антиспам импровизированный устроил — вся исходящая почта проверяется на наличие определенного хедера — и если его нет — удаляется просто. )
            а то блин замучили уже со своими дырявыми движками сайтов. вечно потом перед провайдером оправдывайся. =)
            • прошу прощения за некоторую бессвязность речи — спать охота ужас. )
            • не знаю, может я чего не так скопировал, но у меня этот скрипт выдает:
              #13: , ,; , ,

              и все :(
            • Код города для xml и для rss один и тот же. Добавил в примечания.
              • Там еще единичка какая-то левая:
                informer.gismeteo.ua/xml/33345_1.xml — ХМЛ для Киева
                informer.gismeteo.ua/rss/33345_1.xml — rss для Москвы
                informer.gismeteo.ua/rss/33345.xml — rss для Киева
              • так все же — почему пустой ответ выводит?

                и как хэдеры дописать? а то в манах пишут mail [-a headers] а сам mail ругается, что у него не бывает такого параметра… :(
                • Насчёт левой единички — она для rss не нужна.
                  Насчёт пустого ответа — попробуйте делать echo параметров после присвоения им значений (echo WEATHER_BETA и т.д.).
                  Насчёт заголовков для mail — не знаю зачем они вам понадобились, без них нормально работает.
                  • я там выше писал зачем. sendmail не пропускает писем без определенного заголовка.

                    эшить попробую…
  • А зачем, если не секрет, у вас все стандартные линуксовые утилиты вызываются через абсолютный путь? И fetch я бы заменил wget`ом — он как то более популярен
    • Абсолютные пути — привычка. Уже не вспомню после чего она выработалась, но, по-моему, как раз из-за косяков при исполнении скриптов из крона — утилиты не всегда находятся. Не самые стандартные, естественно, но это как с ложками — они нашлись, но осадок остался :)
      Насчёт wget'a — в FreeBSD его нет по умолчанию. Да и чтобы забрать такой мизер призывать Верховных — не комильфо :)
      • Правильнее всё же не указывать абсолютные пути, а правильно настраивать крон, или хотя бы просто прописать PATH в скрипте.

        Просто, например, у многих iconv лежит не в /usr/local/bin а в /usr/bin и ваш скриптик с треском провалится.
        • Спасибо, исправил скрипт и обновил примечания.
    • Потому, что приложение, вызванное через крон, а не ваш баш, не будет иметь путей в переменной окружения.
  • http://informer.gismeteo.ru/rss/48454.xml

    Это вы в Бангкоке погоду смотрите? 0_0
    • Это же просто пример, какая разница где смотреть? :)
  • Все очень легко есть php класс для mail.ru агента, который позволяет посылать смс на халяву, все что нужно это аккаунт на майле и php на компе.

    Больше по теме — wl500g.info/showpost.php?p=129356&postcount=1
  • А у вас нет скрипта не через гейт? а то билайносмс загнулось недавно(отправлял curl'ом через http), теперь мне отчеты не приходят… =/
  • Кажется для московских абонетов Megafon не существует услуги «e-mail to sms» или я плохо искал.
    А жаль…
  • О я такое писал давным давно на php, оператор был билайн. работало всё около года, потом сервачёк дома пришлось вырубить. Если кому интересно могу дать исходники.
    • Интересно. У меня вот скрипт тоже на пхп работал, но щас меня билайн посылаен на йух. Если не трудно, запастите свой скрипт куданить.
      • У билайна сначало надо разрешить отправку смс на сайте билайна это описано: www.beonline.ru/portal/comm/mem.sms?section=forw2sms далее для отправки смс надо отправлять емайл 79xxxxxxxxxxx@sms.beemail.ru и всё тока что проверил работает
  • в чём смысл использования кодировки koi8-r? многие давно уже используют utf8
    не лучше ли использовать текущую кодировку в системе, например $LANG

    хотя если опустить у iconv один из параметров конвертации, то он будет заменён на системную кодировку
    iconv -f cp1251 эквивалентно iconv -f cp1251 -t $LANG
    ну и iconv -t cp1251 эквивалентно iconv -f $LANG -t cp1251
  • Написать xml парсер это мегаизврат, имея xslt процессоры…
    в свое время (года 4-е назад (второй курс)) писали на php простенькую напоминалку «к какой паре идти и куда»… зато там был целый api на soap прикручен… ээх…
    • интересно, в каком это университете?
      • Владимирский гос универ. Делали не для пром использования, конечно же, так два студента для себя — ради изучения скорее, нежели для использования.
  • Да отлично но вот с МТС оно не дружит так как оператор отрубил напрочь такую услугу :( хотя раньше было можно пользоваться. На Билайн и ДиДжус (киевстар) идёт на ура.
  • #13:, ,;,,
    аналогично :(
    FBSD 7.1
    • Выводы по результатам разбора полётов: лечится взятием с гисметео именно rss'ного xml и правильной настройкой консоли :)
  • Делал такое 4 года назад на php. Тогда можно было просто sms через e-mail посылать. А gismeteo.ru не отдавал xml, я парсил wap.gismeteo.ru.
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.