Видео ролики бесплатно онлайн

Смотреть супер видео

Официальный сайт graffitistudio 24/7/365

Смотреть видео бесплатно

nehaffian 01.12.2009 00:09

Скрипты на bashПогода gismeteo по sms

Когда-то на Хабре выкладывали скрипт, который парсил rss нужного города в gismeteo и отсылал на телефон пользуясь email2sms. У него было два недостатка: он был написан под FreeBSD (хотя и довольно просто портировался под Linux) и, что самое главное, он не показывал осадков (о_О). Поэтому я решил модифицировать скрипт, чтоб он брал информацию из xml для информеров, конвертировал в удобную форму и отсылал по смс. Потом передумал и просто написал с нуля.

Надо сказать, что это мой третий-пятый скрипт на bash вообще, впервые пользовался awk и никогда до этого не работал с xml. Поэтому мне пришлось все это учить до необходимого уровня, что и было проделано за несколько часов гугления. Говорю я все это для того, чтоб вы не высмеивали код за очевидные (не для меня) ляпы, а подсказали, что и как можно исправить\оптимизировать. За это я был бы очень благодарен (:
Собственно для работы скрипта обязательно нужна программа xmlstarlet. Отправка письма же идет через mutt, но ее можно легко можно заменить на, к примеру, mail.
Вот сам код:
  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/bash

# забираем погоду из обработанного xmlstarlet-ом mxl-информера
wheather ()
{
cloud=`echo $wh | awk '{print $3}'`
prec=`echo $wh | awk '{print $5}'`
tmin=`echo $wh | awk '{print $7}'`
tmax=`echo $wh | awk '{print $9}'`
}
# облачность и осадки
f_clpr ()
{
if << "$cloud" == "0" >>; then
cl="jasno"
elif << "$cloud" == "1" >>; then
cl="per.obl."
elif << "$cloud" == "2" >>; then
cl="oblachno"
elif << "$cloud" == "3" >>; then
cl="pasmurno"
fi
if << "$prec" == "10" >>; then
pr="bez osadkov"
elif << "$prec" == "9" >>; then
pr="n\d"
elif << "$prec" == "8" >>; then
pr="groza"
elif << "$prec" == "6" || "$prec" == "7" >>; then
pr="sneg"
elif << "$prec" == "5" >>; then
pr="liven"
elif << "$prec" == "4" >>; then
pr="dozhd"
fi
}
# средняя температура
f_temp ()
{
tc=$(($tmax/2+$tmin/2))
echo "$tc"
}

# создаем файл стиля для xml
(
cat <<'EOF'
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="MMWEATHER/REPORT/TOWN/FORECAST">
<xsl:value-of select="@hour" /> h
<xsl:for-each select="PHENOMENA">
<xsl:value-of select="@cloudiness" /> c
<xsl:value-of select="@precipitation" /> p
</xsl:for-each>
<xsl:for-each select="TEMPERATURE">
<xsl:value-of select="@min" /> tn
<xsl:value-of select="@max" /> tx
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
EOF
) > /tmp/informer.xsl

# скачиваем xml-информер. для нужного города задаем именно здесь
wget -q -O /tmp/informer.xml http://informer.gismeteo.ru/xml/33526_1.xml

# вытягиваем нужные данные из информера, путем наложения xmlstarlet-ом стиля на информер
/usr/bin/xmlstarlet tr /tmp/informer.xsl /tmp/informer.xml > /tmp/informer.tmp

# формируем sms по часам. среднюю($tc) температуру можно заменить на минимальную($tmin)-максимальную($tmax)
wh=`cat /tmp/informer.tmp | grep -A 4 "02 h"`
wheather
f_clpr
f_temp
w02=`echo "$cl" "$pr" t:"$tc"`

wh=`cat /tmp/informer.tmp | grep -A 4 "08 h"`
wheather
f_clpr
f_temp
w08=`echo "$cl" "$pr" t:"$tc"`

wh=`cat /tmp/informer.tmp | grep -A 4 "14 h"`
wheather
f_clpr
f_temp
w14=`echo "$cl" "$pr" t:"$tc"`

wh=`cat /tmp/informer.tmp | grep -A 4 "20 h"`
wheather
f_clpr
f_temp
w20=`echo "$cl" "$pr" t:"$tc"`

# отправляем сообщение. тут писать свой номер и sms-gate
echo "noch':$w02; utro:$w08; den':$w14; vecher:$w20" | mutt -s "" [email protected]

# удаляем временные файлы
rm -f /tmp/informer.xml /tmp/informer.tmp /tmp/informer.xsl

exit 0


В настройках крона нужно задать исполнение скрипта на 20:30 или позднее, т.к. до этого времени отдается погода не на следующий день, а на сегодня+завтра.
На этом все. Надеюсь, что кому-то пригодится (: .

UPD. Некоторые операторы блокируют услугу email2sms изначально. Например, чтоб активировать ее абонентам Djuice или Киевстар нужно отправить пустое сообщение на номер 7021 (бесплатно).


Тэги: bash email2sms gismeteo scripting weather
+ 7 -
Похожие Поделиться

renya 01.12.2009 08:25 #
+ 0 -
Клёво!
Slip 01.12.2009 08:43 #
+ 0 -
Спасибо!

Маленькое уточнение:

ЕМНИП, то этот шаблон для контрактных абонентов.
Для prepaid нужно будет писать xxxxxxxxxx@2sms.kyivstar.net
nehaffian 01.12.2009 10:06 #
+ 0 -
Надо сказать, что у меня работает как первый, так и второй гейт (сам я на djuice). Да и написано это только для примера.
bosha 01.12.2009 12:42 #
+ 0 -
Полезная штука. Быстро приспособил под свои нужды :)
ginz 01.12.2009 17:22 #
+ 0 -
LF МТС Москва sms gate. На официальке не нашел, да и гугл какие то проги шаманские и дохликов предлагает =\
nehaffian 01.12.2009 17:29 #
+ 0 -
http://smsprikol.com/email2sms.php?mod=email2sms.php
booley 02.12.2009 12:26 #
+ 0 -
Крут.

Пошел писать почти такое же на php :)
muhas 02.12.2009 17:33 #
+ 0 -
NIH синдром? =) работает не трож =)
Username 03.12.2009 11:47 #
+ 0 -
чочо такое NIH? Nine Inch Nails напомнило внезапно :d
muhas 03.12.2009 12:22 #
+ 0 -
лоровский сленг, не обращай внимания. хотя если любопытно то тынц
Slip 02.12.2009 20:07 #
+ 0 -
Мда...
Для моего города нет XML. Взял ближайший. Вбил номер.
Результат:

3
1
5
5
Сообщение отправить не удалось, процесс-потомок вернул 127 (Exec error.).
Сообщение отправить не удалось.


xmlstarlet и mutt установлены.

В чем может быть дело?

nehaffian 02.12.2009 20:48 #
+ 0 -
Хм.. Странно.
А sendmail\postfix\exim\msmtp либо любой другой MTA установлен\настроен?
Slip 03.12.2009 10:26 #
+ 0 -
Нет.
nehaffian 03.12.2009 13:00 #
+ 0 -
ну, mutt или mail отправляют письма с их помощью.
вот интересная статья:
http://debback.blogspot.com/2008/04/mta-mutt-smtp.html
Slip 04.12.2009 11:26 #
+ 0 -
Спасибо, разобрался.

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн