Некоторое время назад возникла идея собрать необходимую для "полноценной работы" любого сотрудника информацию в одном месте. Как понятно из названия - это прогноз погоды, курс валют и новости.
"В принципе ничего сложного" - скажете вы, но пришлось повозиться.
Проще всего было с курсами валют и погодой: примеры в интернете + различные сервисы, предоставляющие эту информацию в том или ином виде.
ПОГОДА
Погоду я взял с отечественного Яndex.
Для того, чтобы получить погоду в нужном городе, сначала нужно узнать его ID. Для этого заходим на страницу https://pogoda.yandex.ru/static/cities.xml и ищем город по наименованию. ID Москвы 27612
Я экспериментировал с другими сервисами, везде схожая технология. Где-то сначала нужно получить ID страны, а потом уже ID города, где-то сразу ищем город.
По сути Яндекс хранит прогноз погоды в XML файлах с именем файла равным ID города, поэтому забираем его через обычное HTTPСоединение.
Соединение = Новый HTTPСоединение("export.yandex.ru"); HTTPЗапрос = Новый HTTPЗапрос("weather-ng/forecasts/27612.xml"); HTTPЗапрос.Заголовки.Вставить("Accept-Charset", "utf-8");
ПутьДляСохранения = ПолучитьИмяВременногоФайла(); Результат = Соединение.Получить(HTTPЗапрос, ПутьДляСохранения);
Далее вскрываем файл:
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ПутьДляСохранения); ОбъектXDTO_Погода=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Далее кому что нужно. Можно взять текущие данные, например:
Актуальность = ОбъектXDTO_Погода.fact.uptime; Влажность = ОбъектXDTO_Погода.fact.humidity; СкоростьВетра = ОбъектXDTO_Погода.fact.wind_speed; ТипПогоды = ОбъектXDTO_Погода.fact.weather_type;
А можно вывести прогноз на несколько дней вперед. Я вывожу в таблицу прогноз на 5 дней, поэтому вывод выглядит немного некрасиво + заменяю заголовки колонок:
Ном = 0; Для Каждого День ИЗ ОбъектXDTO_Погода.day Цикл Если Ном < 5 Тогда Ном = Ном + 1; СтрДень["Д"+Ном] = День.day_part[4].temperature; СтрНочь["Д"+Ном] = День.day_part[5].temperature; СтрТип["Д"+Ном] = День.day_part[5].weather_type; Элементы["ПрогнозПогодыД"+Ном].Заголовок = Формат(Дата(СтрЗаменить(День.date, "-", "")), "ДФ=dd/MM"); Иначе Прервать; КонецЕсли; КонецЦикла;
в итоге получаем:
Курсы валют
Тут всё почти один-в-один с погодой. Сервис я выбрал rbc.ru. Хранятся курсы в файлах *.tsv, в подпапках с иерархией: tsv/код валюты/год/месяц/день.tsv
Код доллара: 840
Код евро: 978
Соединение = Новый HTTPСоединение("cbrates.rbc.ru"); HTTPЗапрос = Новый HTTPЗапрос("tsv/"+КодВалюты+"/"+Формат(ТекущаяДата(), "ДФ=/yyyy/MM/dd")+".tsv");
Сохраненный файл, в отличии от погоды, читаем как текстовый документ:
Текст = Новый ТекстовыйДокумент(); Текст.Прочитать(ПутьДляСохранения, КодировкаТекста.ANSI); Стр = Текст.ПолучитьСтроку(1);
Результат:
P.S.: Лично для меня укрпление иностранной валюты это негативная информация, поэтому, в отличие от сайтов: стрелочка вверх - красная, а вниз - зеленая.
RSS
У RSS есть один большущий плюс: Это стандарт, а следовательно, можно взять RSS с любого сайта и не допиливать код.
Но нюансы все же есть. Например, сайт Lenta.ru разбивает новости на категории внутри возвращаемого RSS, а 3Dnews на каждую категорию сделал отдельный RSS адрес, 1c.ru не возвращает текст новости, а только заголовки (т.е. текст пустой). Пришлось добавить немного условий при обработке RSS.
Получение RSS с сайтов немного не тривиально, поскольку путь обычно выглядит так: http://lenta.ru/rss/ или http://www.3dnews.ru/news/rss/ у 1С например http://www.1c.ru/news/rss-2.0.jsp
Получение реализовано через COMОбъект("Msxml2.XMLHTTP"). Код привожу без разнообразных проверок, чтобы не перегружать:
RSS_ComОбъект = Новый COMОбъект("Msxml2.XMLHTTP"); RSS_ComОбъект.open("GET", "http://lenta.ru/rss", false); RSS_ComОбъект.send(); XMLDocument_RSS = DOM_НовыйXMLДокумент(); //см. ниже XMLDocument_RSS.LoadXml(RSS_ComОбъект.responseText); XMLDocument_RSS.SetProperty("SelectionLanguage","XPath"); XMLDocument_RSS.setProperty("SelectionNamespaces", "xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' xmlns:a='http://www.w3.org/2005/Atom'" );
Поскольку можно не угадать с версией при формировании Msxml2.DOMDocument.4.0, то вынесено в отдельную функцию:
&НаКлиенте Функция DOM_НовыйXMLДокумент() Попытка XML = Новый COMОбъект("Msxml2.DOMDocument.4.0"); Исключение ош = ОписаниеОшибки(); Попытка XML = Новый COMОбъект("Msxml2.DOMDocument.3.0"); Исключение ош2 = ОписаниеОшибки(); Возврат Неопределено; КонецПопытки; КонецПопытки; Возврат XML; КонецФункции
Таким образом, на выходе у нас в переменной XMLDocument_RSS содержится XML самого RSS канала. Далее обегаем item-ы:
СписокЭлементов = XMLDocument_RSS.XMLDocument.selectNodes("rss/channel/item"); Для Каждого Элемент ИЗ СписокЭлементов Цикл Описание = Элемент.selectSingleNode("description").text; Ссылка = Элемент.selectSingleNode("link").text; Заголовок = Элемент.selectSingleNode("title").text; Категория = Элемент.selectSingleNode("category").text; Дата = Элемент.selectSingleNode("pubDate").text; КонецЦикла;
В обработке на самом деле есть проверки, преобразование формата даты и обработка текста новости. У 3Dnews, например, там много мусора: тэги, коды символов, ссылки на картинки т.д.
Отдельно по поводу картинок - их я не загружаю специально. Причины 2:
1. Вывод новостей идёт в таблицу. Вставка картинок большого размера в ячейку отрабатывает некорректно. Либо картинка маленькая, либо залезает на соседние ячейки. Надеюсь, это глюк платформы и в будущем всё будет нормально.
2. Трафик
Никаких уникальных технологий не применялось, всё сделано именно на уровне "для чайников", из-за этого кому-то код может показаться "не на уровне". Так что пожелания и конструктивная критика - приветствуются.
Если где-то описал сумбурно и требуется больше пояснений или кода - готов откорректировать.