Грабим Яндекс с помощью 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С:Предприятие это современная СУБД и среда разработки, с помощью которой можно делать не только скучные бухгалтерские программы, но и другие интересные вещи, не имеющие к этой канцелярщине никакого отношения.

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2604    3    0    

10

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

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

60000 руб.

07.05.2019    34678    68    45    

27

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

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

57600 руб.

26.11.2024    2375    2    2    

4

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

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

36000 руб.

03.08.2020    19077    22    22    

19

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

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

12000 руб.

02.02.2021    18844    54    50    

30

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    845    4    1    

5

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

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

24000 руб.

27.09.2024    4060    3    2    

4

Обмен с ГосИС 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    93036    191    217    

343