Грабим Яндекс с помощью 1С

23.03.14

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

Статья для участия в конкурсе: "Нападение на Перл-Хабр".
Да, мои дорогие, хабровчане, вы не любите 1С-ников, мы "много зарабатываем и мало знаем". На самом деле это не совсем так (попытайтесь на досуге стать профессионалами одновременно в программировании, бухгалтерии, юриспруденции и ещё куче разных смежных областей). Но сейчас не об этом. В этой статье я опишу весьма необычный метод использования платформы разработки 1С:Предприятие.

Небольшая предистория, которую можно пропустить.

Я программист 1С, да, можете пинать меня ногами. Но так уж пошло, что в молодости я был парнем не богатым, без компьютера, но был безумно влюблен в науку "программирование". Попытки найти хоть какую-нибудь работу связанную с программированием в маленьком провинциальном городе 17-тилетнего юношу без образования и опыта привели в 1С:Франчайзи. И пошло-поехало, мальчик на подхвате, программист 1С, начальник отдела внедрения программного обеспечения на платформе 1С (отдел из двух человек, провинция-с). Сейчас у меня жена, двое детей, кот и своя фирма-франчайзи со мной в роли руководителя, внедренца, программиста, водителя и всего остального. И да, что бы сразу набить авторитет, в ваших глазах, у меня есть борода :)

Чего хочется

Задумал я тут вот собрать себе HTPC. Сказано-сделано. В качестве ОС естественно Windows (я 1С-ник, не забыли?). В качестве медиа центра WMC. Да вот беда, всё работает и показывает, да вот хочется тв-программу прямо сразу в телевизоре, что бы с тайм-шифтом, отсроченной записью, сериалами и прочими плюшками. Порывшись по интернету, обнаружил несколько решений на эту тему, но все они мне показались в чем-то неудобными. То сериалы не распознаются, то программа конвертации пропиетарная, а в самом WMC весьма ограниченный набор телеканалов для загрузки тв-программы. Решил делать свой велосипед. В качестве источника телепрограммы решил выбрать замечательный сервис Яндекс.Телепрограмма. В качестве инструмента добывания программы... угадайте что? Правильно, то единственное на чём я в совершенстве умею программировать - 1С. (А ещё я отлично когда-то программировал в среде Turbo Basic, вот такая профессиональная деградация, смешно да?). Кстати, выбор платформы 1С:Предприятие под эту задачу - оказался крайне удачным. Платформа просто создана для хранения зависимых сложных справочных данных.

Грабим

WMC кушает файлы телепрограмм в собственном формате MXF. Который достаточно хорошо описан в MSDN. Вытягивать будем, как уже говорилось с Яндекса. Проблема в том, что Яндекс не спешит делиться форматом своей телепрограммы (может не нашел), поэтому Ctrl+Shift+I в Chrome, и вперед щелкать по программам. Самое интересное оказалось в последней строчке сетевого запроса, который наш браузер отправил на сервер.

Именно этим запросом мы получаем тв-программу в формате JSON. Изучение формата тоже проблем не создало, все достаточно интуитивно понятно. Итак, создаем в 1С справочник "Провайдеры тв-программы". (Первая строка использовалась мною раньше, когда Яндекс не давал программу в JSON, программу я снимал прямо парсом HTML-страниц. Сейчас я так уже не делаю)

И поехали, пишем затяжку. Простите мой говнокод, писал "по-быстренькому" и для себя.

	Пока  НачальныйДень > 0 ИЛИ ВыборкаДетальныеЗаписи.Следующий() Цикл
		Сообщить("Загружаю программу по каналу: " + ВыборкаДетальныеЗаписи.Канал);
		Для Индикатор2 = НачальныйДень По ЧислоДней Цикл
			ДатаЗагрузки	= НачПериода + Индикатор2 * 86400;
			Сообщить("	Загружаю программу за: " + Формат(ДатаЗагрузки, "ДЛФ=DD"));
			СтрокаВызова	= Провайдер.СтрокаВызова;
			ИДКанала		= ВыборкаДетальныеЗаписи.ИдентификационнаяИнформация;
			СтрокаВызова	= СтрЗаменить(СтрокаВызова, "[ИдентификационнаяИнформацияКанала]", ИДКанала);
			СтрокаВызова	= СтрЗаменить(СтрокаВызова, "[ДатаГГГГ-ММ-ДД]", Формат(ДатаЗагрузки, "ДФ=yyyy-MM-dd"));
			СтрокаВызова	= СтрЗаменить(СтрокаВызова, "[ПродолжительностьВСекундах]", Формат(86400, "ЧГ=0"));
			
			
			СтрокаСтраницы		= РаботаСИнтернет.ПолучитьСтрокуСтраницы(СтрокаВызова);
			
			//начинаем парсинг
			ПарсСтраницы(СтрокаСтраницы, ВыборкаДетальныеЗаписи.Канал, ВыборкаДетальныеЗаписи.РезатьПоТочке);
		КонецЦикла;
		НачальныйДень = 0;
		
		Индикатор1	= Индикатор1 + 1;
	КонецЦикла;

Интересно, будет в комментариях шутка про бейсик переведенный Промптом?

Читаем то, что возвращается с сервера через COM-объект Microsoft.XMLHTTP:

Функция ПолучитьСтрокуСтраницы(УРЛ, Кодировка = "utf-8") Экспорт
	Соединение = ПолучитьCOMОбъект("","Microsoft.XMLHTTP");
	Соединение.open("GET", УРЛ,0,,); //0 - синхронный (по другому 1с не умеет), 1 - асинхронный
	Соединение.send();
	Пока Соединение.readyState <> 4 Цикл
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	Если Соединение.responseBody = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	Текст	= ПреобразоватьСтрокуВУТФ8(Соединение.responseBody, Кодировка);
	Возврат Текст;
КонецФункции

Отлично, создаем справочники Каналы, Передачи и Эпизоды (для сериалов). В 1С на это уходит буквально секунды.

Но просто названия передач так скучны. Добавим ещё описания, картинки, актеров и прочее-прочее, что благосклонно дает нам добрый дедушка Яндекс.

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

Ну вот, у нас все затянуто в базу данных и надежно в ней хранится. Это хранение поддерживает сама платформа. Ну и естественно, пишем сам "компилятор" выходного файла.

Приводить его длиннющий программный  код не буду, что бы не захламлять статью.

Ну и всё, на стороне HTPC пишем простенький bat-ничек:

C:\Windows\ehome\loadmxf.exe -i tvxb_after.mxf
%SystemRoot%\ehome\ehPrivJob.exe /DoReindexSearchRoot

Profit

Вместо заключения

На всё про-все ушло 2 бессонных ночи. И потом уже в течении годов алгоритм постепенно "допиливался" и прирастал разными полезностями. Это и загрузка рейтинга фильмов с Кинопоиска, и интеллектуальная самообучающаяся (да-да!) система распознавания сериалов (с ними было тяжелее всего).

Так же надеюсь Яндекс не обидится на меня за столь невинную шалость с моей стороны по граббингу телепрограммы. Конфигурацию использую только лично для себя, распространять - не распространял и не собираюсь. Нагрузку на ваш сервер создаю совсем мизерную и всего раз в неделю, так что простите меня, я хороший :)

Я старался сделать статью более популярную, нежели техническую, побольше картинок, поменьше кода, не ругайте меня за это :) Хотелось показать, что 1С:Предприятие это современная СУБД и среда разработки, с помощью которой можно делать не только скучные бухгалтерские программы, но и другие интересные вещи, не имеющие к этой канцелярщине никакого отношения.

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    15749    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

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

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17557    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16362    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25746    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88587    160    215    

318