Погода, курсы валют, RSS 8.3 (Получение информации из интернета для чайников)

02.04.15

Интеграция - WEB-интеграция

Простенькая RSS читалка + прогноз погоды + курсы валют.
Пример использования HTTPСоединение, HTTPЗапрос, Msxml2.XMLHTTP, Msxml2.DOMDocument

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
info.epf
.epf 15,02Kb ver:1.0
54
54 Скачать (1 SM) Купить за 1 850 руб.

Некоторое время назад возникла идея собрать необходимую для "полноценной работы" любого сотрудника информацию в одном месте. Как понятно из названия - это прогноз погоды, курс валют и новости.

"В принципе ничего сложного" - скажете вы, но пришлось повозиться.

Проще всего было с курсами валют и погодой: примеры в интернете + различные сервисы, предоставляющие эту информацию в том или ином виде.

ПОГОДА

Погоду я взял с отечественного Я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. Трафик

Никаких уникальных технологий не применялось, всё сделано именно на уровне "для чайников", из-за этого кому-то код может показаться "не на уровне". Так что пожелания и конструктивная критика - приветствуются. 

Если где-то описал сумбурно и требуется больше пояснений или кода - готов откорректировать.

HTTPСоединение HTTPЗапрос Msxml2.XMLHTTP Msxml2.DOMDocument

См. также

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    1235    1    1    

4

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    18355    20    22    

18

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20564    13    19    

18

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    320    2    0    

5

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    2483    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Aleksey.Bochkov 3686 03.04.15 05:53 Сейчас в теме
1С не возвращает текст новости, а только заголовки (т.е. текст пустой)

У меня все нормально загрузилось через HTTPСоединение.
http://i.imgur.com/nqwp7eG.png
2. Silmariil 157 03.04.15 07:05 Сейчас в теме
(1) Aleksey.Bochkov, имелось ввиду что конкретно сайт 1c.ru не использует текст новости в RSS, а только заголовки. Скорректировал в статье.
3. AganinEvgeniy 2 08.04.15 11:46 Сейчас в теме
У меня немного иначе реализован алгоритм получения курсов валют, так как столкнулся с проблемой безопасности. В смысле настроен иса сервер, который обычные запросы в интернет блокирует, пришлось воспользоваться найденной в своё время процедурой XML запроса (к сожалению за давностью лет уже и не упомню откуда она бралась), немного подкорректированной под свои нужды. Может кому-нибудь и пригодится:
Функция ЗапроситьФайлыССервера(СерверИсточникПараметр, СтрокаПараметраПолученияПараметр, ИмяВходящегоФайлаПараметр, HTTP = Неопределено) Экспорт

СерверИсточник = СерверИсточникПараметр;
СтрокаПараметраПолучения = СтрокаПараметраПолученияПараметр;
ИмяВходящегоФайла = ИмяВходящегоФайлаПараметр;
Попытка
aUrlRequest = "http://" + СерверИсточникПараметр + "/" + СтрокаПараметраПолучения;

oXMLHTTP = Новый COMОбъект("MSXML2.XMLHTTP");
oXMLHTTP.open("GET",aUrlRequest, False );
oXMLHTTP.Send();
FSO = Новый COMОбъект("Scripting.FileSystemObject");
Fso.CreateTextFile(ИмяВходящегоФайла,True);
FileFso =Fso.OpenTextFile(ИмяВходящегоФайла,2,True);
FileFso.writeline(oXMLHTTP.responseText);

Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;


КонецФункции

Процедура ПриОткрытии()
СерверИсточник = "cbrates.rbc.ru";
HTTP = Новый HTTPСоединение(СерверИсточник);
Адрес = "tsv/";
ТМП = Строка(Формат(ТекущаяДата(), "ДФ=/yyyy/MM/dd"));
ВремКаталог = "C:\\Kurses\download\";//Указываем любой каталог, в который будем записывать данные
СоздатьКаталог(ВремКаталог);
УдалитьФайлы(ВремКаталог,"*.*");
СпрВал = Справочники.Валюты.Выбрать();
Пока СпрВал.Следующий() Цикл
Если СпрВал.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
ИмяВходящегоФайла = ВремКаталог + Прав(СпрВал.Код,3) + ".txt";
СтрокаПараметраПолучения = Адрес + Прав(СпрВал.Код,3) + ТМП + ".tsv";
Если ЗапроситьФайлыССервера(СерверИсточник, СтрокаПараметраПолучения, ИмяВходящегоФайла, HTTP) <> Истина Тогда
Сообщить("Не удалось получить ресурс для валюты " + СокрЛП(СпрВал.Наименование) + " (код " + СпрВал.Код + "). Курс для валюты не загружен.");
Продолжить;
КонецЕсли;
// Далее блок чтения и записи курсов
КонецЦикла;
КонецПроцедуры
4. Yashazz 4801 08.04.15 19:04 Сейчас в теме
Забавно. Такие баянчики до сих пор популярны, хотя это всё считалось давно открытой америкой ещё в 2008-09 гг. Автор, а зачем нужно было юзать Msxml2.DOMDocument?
5. Silmariil 157 08.04.15 19:21 Сейчас в теме
(4) Yashazz, затем что другого способа не нашел. Поделитесь опытом, с радостью перейму опыт.
6. grum01 115 09.04.15 05:13 Сейчас в теме
А я вот так и не смог забрать погоду с gismeteo.
У кого-нибудь получалось? Даже гугля по этому поводу молчит...
7. ZIGRAS 18.01.16 21:20 Сейчас в теме
А дает ли яндекс картинки к погоде?
8. пользователь 12.01.20 16:39
Сообщение было скрыто модератором.
...
9. jan-pechka 428 25.02.22 10:04 Сейчас в теме
Не запускается обработка...выдает ошибку(см.скрин)
Прикрепленные файлы:
Оставьте свое сообщение