Неделю назад произошло очередное улучшение Хабра, и кроме всего прочего, была добавлена возможность вставлять контент с помощью механизма oEmbed. Я хочу немного рассказать, что это за зверь, и продемонстрировать, как он работает с чем-нибудь популярным, вроде jsFiddle, чтобы добавить в хабрапост необычное. Например — телефон.
Что такое oEmbed? Это соглашение, благодаря которому можно вставить кусок одной страницы на другую. В мире веба для такой задачи предназначена технология iframe, но в ее использовании есть нюанс: она встраивает содержимое сайта целиком. А сайты, на секундочку, рассчитаны на то, чтобы занимать большую часть экрана вашего компьютера или телефона, а не встраиваться. Разработчики это понимают, и довольно давно у нас есть несколько соглашений по встраиванию. Три самых популярных: Open Graph Protocol, Twitter Cards и oEmbed. Кроме них есть еще сотни менее популярных, но в основном используется именно эта тройка.
Работают они по-разному. Чтобы соответствовать «Open Graph Protocol», веб-странице нужно разместить в своем HTML-коде несколько meta-тегов вроде og:title, которые опишут минимальное представление страницы для встраивания. Обычно это заголовок, картинка и несколько строк краткого описания. Сайт, куда происходит встраивание (к примеру, пост фейсбука), создаст соответствующие HTML-элементы сам. От «донора» требуется только информация по содержимому. oEmbed работает по-другому. Чтобы соответствовать oEmbed, сайт должен «предоставить» некий URL, по которому делается запрос о встраивании. Обратите внимание, что «предоставить» у меня в кавычках. На практике «предоставить» значит иметь под рукой большой whitelist доменов и соответствующих им URL для запросов. «Более 1800» в анонсе хабра и есть размер такого белого списка. В соглашении есть альтернативный вариант «oEmbed Discovery», когда в HTML-теге на веб-странице прописывается URL для запроса информации. Но Хабр, судя по всему, этот механизм не поддерживает. Наверное, чтобы всякие особо хитрые товарищи не вставляли таким образом трекающие пиксели и прочее забавное с собственных сайтов.
В ответ на запрос о встраивании oEmbed, сайт должен вернуть JSON с необходимой информацией. Например, информацию о картинке и тексте. Но чаще всего возвращают URL, который можно вставлять через iframe. Что выгодно отличает oEmbed от «Open Graph Protocol» и позволяет встроить всё что угодно, начиная от плеера YouTube и заканчивая JSFiddle.
Вот JSFiddle я и продемонстрирую: теперь можно вставлять прямо в статьи разнообразные HTML/CSS/JS демки и показывать интересные технологии. В «external resources» слева можно добавить необходимые JavaScript библиотеки. Например, дебагер, чтобы видеть результаты, console.log или наш SDK, чтобы звонить с веб страницы:
Чтобы позвонить и услышать «Привет, Хабр!», нужно переключиться на вкладку «Result». Не очень user friendly. Но. Многие популярные сайты, поддерживающие встраивание, поддерживают еще и настройку этого встраивания! Гугление показывать, что для JSFiddle есть подробный раздел документации. Следовательно, если мы хотим сразу вкладку «Result», то нам нужно добавить к URL соответствующие настройки:
jsfiddle.net/grigoryvp/rxnj9hcn/embedded/result/
Увы, такого Хабр пока не поддерживает. И пока не совсем ясно — это сто стороны jsfiddle неправильно формируется iframe, или же Хабр неправильно запрашивает URL. Если кто владеет такой магией — пишите в комментариях, будет очень полезно!
Что такое oEmbed? Это соглашение, благодаря которому можно вставить кусок одной страницы на другую. В мире веба для такой задачи предназначена технология iframe, но в ее использовании есть нюанс: она встраивает содержимое сайта целиком. А сайты, на секундочку, рассчитаны на то, чтобы занимать большую часть экрана вашего компьютера или телефона, а не встраиваться. Разработчики это понимают, и довольно давно у нас есть несколько соглашений по встраиванию. Три самых популярных: Open Graph Protocol, Twitter Cards и oEmbed. Кроме них есть еще сотни менее популярных, но в основном используется именно эта тройка.
Работают они по-разному. Чтобы соответствовать «Open Graph Protocol», веб-странице нужно разместить в своем HTML-коде несколько meta-тегов вроде og:title, которые опишут минимальное представление страницы для встраивания. Обычно это заголовок, картинка и несколько строк краткого описания. Сайт, куда происходит встраивание (к примеру, пост фейсбука), создаст соответствующие HTML-элементы сам. От «донора» требуется только информация по содержимому. oEmbed работает по-другому. Чтобы соответствовать oEmbed, сайт должен «предоставить» некий URL, по которому делается запрос о встраивании. Обратите внимание, что «предоставить» у меня в кавычках. На практике «предоставить» значит иметь под рукой большой whitelist доменов и соответствующих им URL для запросов. «Более 1800» в анонсе хабра и есть размер такого белого списка. В соглашении есть альтернативный вариант «oEmbed Discovery», когда в HTML-теге на веб-странице прописывается URL для запроса информации. Но Хабр, судя по всему, этот механизм не поддерживает. Наверное, чтобы всякие особо хитрые товарищи не вставляли таким образом трекающие пиксели и прочее забавное с собственных сайтов.
В ответ на запрос о встраивании oEmbed, сайт должен вернуть JSON с необходимой информацией. Например, информацию о картинке и тексте. Но чаще всего возвращают URL, который можно вставлять через iframe. Что выгодно отличает oEmbed от «Open Graph Protocol» и позволяет встроить всё что угодно, начиная от плеера YouTube и заканчивая JSFiddle.
Вот JSFiddle я и продемонстрирую: теперь можно вставлять прямо в статьи разнообразные HTML/CSS/JS демки и показывать интересные технологии. В «external resources» слева можно добавить необходимые JavaScript библиотеки. Например, дебагер, чтобы видеть результаты, console.log или наш SDK, чтобы звонить с веб страницы:
Чтобы позвонить и услышать «Привет, Хабр!», нужно переключиться на вкладку «Result». Не очень user friendly. Но. Многие популярные сайты, поддерживающие встраивание, поддерживают еще и настройку этого встраивания! Гугление показывать, что для JSFiddle есть подробный раздел документации. Следовательно, если мы хотим сразу вкладку «Result», то нам нужно добавить к URL соответствующие настройки:
jsfiddle.net/grigoryvp/rxnj9hcn/embedded/result/
Увы, такого Хабр пока не поддерживает. И пока не совсем ясно — это сто стороны jsfiddle неправильно формируется iframe, или же Хабр неправильно запрашивает URL. Если кто владеет такой магией — пишите в комментариях, будет очень полезно!
Поделиться с друзьями
Комментарии (4)
dvnil
19.12.2016 16:42Мне одному кажется, что разрешать embedded result небезопасно? XSS же.
eyeofhell
19.12.2016 16:44Там iframe, он по секьюрности ничем не отличается от еще одного таба, который плавает в указанной точке поверх страницы. Открывать второй таб с другим сайтом безопасно или небезопасно?
dotZero
Сервис которым мы пользуемся не поддерживает набор вкладок для jsfiddle. Но я думаю мы их попинаем и они все добавят.
eyeofhell
Очень на это надеюсь. Выбор по умолчанию «result» позволит делать намного более «читаемые» статьи про веб разработку.