Добавлено: Thu Aug 06, 2009 11:13 pm Заголовок сообщения:
Доступна. По адресу http://informer.gismeteo.ru/rss/НомерГорода.xml
Правда сейчас там есть небольшой косячок - теперь rss-канал в utf-8 (новая версия поддерживает распознавание кодировок, поэтому это уже не проблема), и названия дней недели и месяцев на английском. Все никак руки не дойдут сделать парсер.
Добавлено: Sun Aug 09, 2009 1:40 am Заголовок сообщения:
Цитата:
Все никак руки не дойдут сделать парсер.
Ну вот добрался и до парсера после того, как поставил себе новую DigiTV 5.7.2 с поддержкой различных кодировок в rss.
Делюсь со всеми безвозмездно. Просьба не ругать, если покажется, что это не самый легкий и прямой путь решения проблемы. Дело в том, что у меня эфирный сервер не имеет прямого доступа в Интернет по различным причинам, в том числе и в целях безопасности. В сети у меня работает веб-сервер под управлением GNU/Linux, он доступен для эфирного сервера. На нем я поддерживаю зеркала тех Интернет-ресурсов, которые использую на эфирном сервере.
На веб-сервере, наряду со сценарием регулярного обновления rss каналов, работает такой скрипт:
Код:
#!/bin/sh
# Этот скрипт производит поиск сокращенных английских названий
# месяцев и дней недели в xml-файле погодного rss канала портала
# GISMETEO.RU и заменяет их на полные русские названия.
#
FILE=/var/www/rss/27612.xml # Имя обрабатываемого файла
# Поиск и замена названий месяцев
sed -i 's/ Jan/ января/g' $FILE
sed -i 's/ Feb/ февраля/g' $FILE
sed -i 's/ Mar/ марта/g' $FILE
sed -i 's/ Apr/ апреля/g' $FILE
sed -i 's/ May/ мая/g' $FILE
sed -i 's/ Jun/ июня/g' $FILE
sed -i 's/ Jul/ июля/g' $FILE
sed -i 's/ Aug/ августа/g' $FILE
sed -i 's/ Sep/ сентября/g' $FILE
sed -i 's/ Oct/ октября/g' $FILE
sed -i 's/ Nov/ ноября/g' $FILE
sed -i 's/ Dec/ декабря/g' $FILE
# Поиск и замена названий дней недели
sed -i 's/ Mon/ понедельник/g' $FILE
sed -i 's/ Tue/ вторник/g' $FILE
sed -i 's/ Wed/ среда/g' $FILE
sed -i 's/ Thu/ четверг/g' $FILE
sed -i 's/ Fri/ пятница/g' $FILE
sed -i 's/ Sat/ суббота/g' $FILE
sed -i 's/ Sun/ воскресенье/g' $FILE
В тексте скрипта нужно указать путь к обрабатываемому файлу (читайте комментарии).
Надеюсь мое решение будет полезно кому нибудь еще.
// Функция для обработки начальных тегов XML
// На входе:
// - указатель на SAX парсер
// - имя XML тега
// - массив аттрибутов
function saxStartElement($parser,$name,$attrs)
{
global $currentFORECAST ,$index;
switch($name)
{
case 'MMWEATHER':
// Тег FORECAST содержит все новости. Мы должны подготовить
// массив $FORECAST для приема новостей из XML файла.
$FORECAST = array();
break;
case 'FORECAST':
// Каждая новость находится в теге FORECAST. Подготавливаем массив
// $currentFORECAST для приема этой новости
$currentFORECAST = array();
// Если у новости есть дата - сохраняем ее в массиве
if (in_array('day',array_keys($attrs))) $currentFORECAST ['day'] = $attrs['day'];
if (in_array('month',array_keys($attrs))) $currentFORECAST ['month'] = $attrs['month'];
if (in_array('tod',array_keys($attrs))) $currentFORECAST ['tod'] = $attrs['tod'];
if (in_array('weekday',array_keys($attrs))) $currentFORECAST ['weekday'] = $attrs['weekday'];
break;
// Сохраняем в массиве всю необходимую информацию
case 'PHENOMENA':
$currentFORECAST ['phenomena_cloudiness'] = $attrs['cloudiness'];
$currentFORECAST ['phenomena_precipitation'] = $attrs['precipitation'];
$currentFORECAST ['phenomena_rpower'] = $attrs['rpower'];
$currentFORECAST ['phenomena_spower'] = $attrs['spower'];
break;
default:
// Все остальные теги, которые могут встретиться в XML файле
// находятся внутри тега <FORECAST>, поэтому мы просто запоминаем
// их название с тем, чтобы знать, какие именно данные мы
// обрабатываем.
$index = $name;
break;
}
}
// Функция для обработки конечных тегов XML
// На входе:
// - указатель на SAX парсер
// - имя XML тега
function saxEndElement($parser,$name)
{
global $FORECAST ,$currentFORECAST ,$index;
if ((is_array($currentFORECAST )) && ($name=='FORECAST'))
// Если в данный момент у нас есть массив $currentFORECAST (т.е.
// мы обрабатываем содержимое новости) и имя закрывающего
// тега - "FORECAST", то это значит, что данные для этой новости
// кончились и мы можем поместить готовую новость в массив
// новостей.
{
$FORECAST [] = $currentFORECAST ;
// Уничтожаем массив текущей новости, чтобы показать, что
// в данный момент мы не занимаемся получением данных для
// новости.
$currentFORECAST = null;
}
// В любом случае закрытие тега означает, что символьные
// данные, получаемые парсером не нужно помещать куда-либо.
$index = null;
}
// Функция для обработки символьных данных
// На входе:
// - указатель на SAX парсер
// - символьные данные XML
function saxCharacterData($parser,$data)
{
global $currentFORECAST ,$index;
// Мы принимаем только данные для новостей, помещенные в
// какой-нибудь тег. Все остальные символьные данные
// (как правило это пустое пространство, использованное
// для форматирования) мы опускаем за ненадобностью.
if ((is_array($currentFORECAST )) && ($index))
$currentFORECAST [$index] = $data;
}
// Создаем SAX парсер, который будет использоваться для
// обработки XML-данных.
$parser = xml_parser_create();
// Регистрируем функции для обработки различных типов
// XML-данных:
// - начальный и конечный тэги XML
xml_set_element_handler($parser,'saxStartElement','saxEndElement');
// - символьные данные
xml_set_character_data_handler($parser,'saxCharacterData');
// Также существуют аналогичные функции для регистрации
// обработчиков других типов XML-данных.
// Убираем case folding, в этом случае имена тэгов будут
// передаваться обработчикам в оригинальном виде. Если case
// folding включен, то все имена тегов будут переведены
// в верхний регистр.
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,false);
// Получаем содержимое XML-файла с новостями.
//$xml = join('',file('news.xml'));
$ch = curl_init();
// В этой строке вписываем url для своего города
curl_setopt($ch, CURLOPT_URL, 'http://informer.gismeteo.ru/xml/тут_цифровой_идентификатор_города.xml');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_HEADER, 0);
//curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
//curl_setopt($ch, CURLOPT_PROXY, '192.168.0.1');
$xml = curl_exec($ch);
curl_close($ch);
// Производим парсинг (разбор) полученного XML-файла.
// В процессе разбора парсер будет вызывать описанные нами
// функции и в результате мы получим массив $FORECAST day,
// содержащий новости из XML-файла.
if (!xml_parse($parser,$xml,true))
// Парсер возвращает значение FALSE, если произошла
// какая-либо ошибка. В этом случае мы также прекращаем
// выполнение скрипта и возвращаем ошибку.
die(sprintf('Ошибка XML: %s в строке %d',
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
// Уничтожаем парсер, освобождая занятые им ресурсы
xml_parser_free($parser);
?>
<rss xmlns:gismeteo="http://www.gismeteo.ru" version="2.0">
<channel>
<title>GISMETEO.RU: Погода от ФОБОС и Мэп Мейкер</title>
<item>
<title>Прогноз погоды предоставлен Gismeteo.ru совместно с ООО "Рога и копыта"</title>
<link>http://www.gismeteo.ru</link>
<description><?php
foreach($FORECAST as $n)
{
// Вывод времени суток
if ($n['tod']=='0') echo ('Ночь ');
elseif ($n['tod']=='1') echo ('Утро ');
elseif ($n['tod']=='2') echo ('День ');
elseif ($n['tod']=='3') echo ('Вечер ');
else echo ('');
// Вывод информации о температуре воздуха
echo ('температура ');
if ($n['temperature_min']>0) echo ('+');
echo ($n['temperature_min'].'..');
if ($n['temperature_max']>0) echo ('+');
echo ($n['temperature_max'].'°C, ');
// Вывод информации об атмосферном давлении
echo ('атмосферное давление '.$n['pressure_min'].'..'.$n['pressure_max'].' мм рт.ст., ');
// Вывод информации о влажности
echo ('относительная влажность ');
echo (($n['relwet_min']+$n['relwet_max'])/2);
echo ('%, ');
Добавлено: Sun Feb 20, 2011 2:46 am Заголовок сообщения:
Это php скрипт. Я его применяю на веб-сервере с установленным php-cli. Запускается скрипт периодически планировщиком, его вывод перенаправляется в файл rss.xml, который лежит в папке веб-сервера. DigiTV получает этот RSS канал своим встроенным модулем RSS.
Если вы не знакомы с веб-серверами и прочей их требухой, то использование моего решения сложноватым вам покажется.
Если решитесь реализовать - готов подсказать что к чему,
Добавлено: Thu Mar 03, 2011 2:18 pm Заголовок сообщения:
http://informer.gismeteo.ru/rss/29634.xml
Это для новосиба. Все работает, только месяц и день недели на фиглише. В веб-программирование ноль, потому сел и методом тыка - поиск в Яндексе gismeteo.ru/rss/*.xml нужный город - нашел нужные города.
Вы можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах