Leonid Evdokimov ([info]darkk) wrote,
@ 2009-01-06 04:27:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:django, google, livejournal, python, rss, rss-proxy

Даёшь фрэндленту в GoogleReader!

Вообщем, потратил я пару-тройку часов и набросал простенькое django-приложение, которое позволяет читать в google reader подзамочные записи из френдленты.

В текущий момент сервис работает по адресу rss-proxy.darkk.net.ru, на мощностях google appengine, код сервиса лежит на github.

Сервис в настоящий момент простой как топор — вводите логин и пароль от ЖЖ, они шифруются секретным ключем сервера и записываются в URL-ы RSS-потоков. На выходе из предоставленных ЖЖ данных генерируется OPML-файл, который уже можно скормить Google Reader или другой онлайновой читалке.

К вопросу о безопасности. Пароль на сервере не хранится, он зашифрован в URL-е потока. В качестве шифрования используется SHA1-OFB, который считается относительно надежным. Влияют ли найденные в SHA-1 коллизии на стойкость шифра — мне до конца не ясно, и без дополнительного анализа менять шифр на SHA2-OFB я не считаю хорошей идеей. Более подробно про SHA1-OFB можно посмотреть в ChangeLog. Конечно, это не AES и не RSA, но в GAE на настоящий момент этот функционал не доступен. При авторизации сервера rss-proxy в ЖЖ пароль также открытым текстом не передается, т.к. используется digest-аутентификация. Т.е. пароль хранится только в памяти сервера во время обработки запроса. Кто не верит — может посмотреть исходники.

Кстати, некоторые подобные сервисы (например, http://lj.abnib.co.uk/) хранят пароль на стороне сервера, некоторые — не хранят, но закрывают свой код. Например, FAQ freemyfeed говорит, что они используют сдвиговый алгоритм, к которому имеет доступ только главный разработчик сайта. Напоминает чертовски безопасный ROT-13.

Таким образом, худшее, что может случится — вы куда-нибудь «опубликуете» URL фида, подставив этим своих френдов. В настоящий момент механизма «закрытия» засвеченных фидов нет, но его не сложно сделать.

Согласно информации по Google Reader, он сам фиды не индексирует, всей индексацией занимается GoogleBot, который ходит по ссылкам. Файл robots.txt на сайте лежит и индексирование фидов GoogleBot-ом «запрещает».

Как видно, дизайном сервис не блещет, если у кого-то есть желание это исправить — welcome.




(36 comments) - (Post a new comment)


[info]aster_x86
2009-01-05 11:17 pm UTC (link)
Однако!

(Reply to this) (Thread)


[info]darkk
2009-01-05 11:22 pm UTC (link)
Пожелания? Предложения? Патчи? Ж-)

(Reply to this) (Parent)(Thread)


[info]bobromedved
2009-01-05 11:34 pm UTC (link)
Купи ru домен красивый, повесь на него приложение, затет напиши в хабре в "я пиарюсь" ) Будет толпа пользователей и можно будет даже вешать какой-нить адсенс на морду (точку, куда юзверь заходит в момент ознакомления с сервисом) :-) Или можно адсенс не вешать, будет просто живой проект для портфолио )

(Reply to this) (Parent)(Thread)


[info]darkk
2009-01-06 08:44 am UTC (link)
Ну назвать «проектом» 200 строчек на питоне у меня пока язык не поворачивается :-)

(Reply to this) (Parent)


[info]aster_x86
2009-01-05 11:36 pm UTC (link)
Заступаю на вахту тестера ;) А там посмотрим :)

(Reply to this) (Parent)(Thread)


[info]aster_x86
2009-01-05 11:55 pm UTC (link)
в качестве опции очень хочется иметь всю ленту в одном потоке :)

(Reply to this) (Parent)(Thread)


[info]aster_x86
2009-01-05 11:58 pm UTC (link)
Опа. В гугл-ридере теперь есть папки. Проблема отвалилась.

(Reply to this) (Parent)


[info]darkk
2009-01-06 08:43 am UTC (link)
Я в ридере вообще все ленты одним потоком смотрю обычно, их пока у меня не так уж много :-)

(Reply to this) (Parent)


[info]eth0_blog
2009-01-06 12:52 am UTC (link)
Прикольно, спасибо.
А можно так сделать, чтобы одним фидом френдлента(да ещё и по группе друзей желательно) была. Всмысле в гуглридере чтобы не каждый жж-френд был отдельным фидом, а ленту всю экспортнуть в один фид?

(Reply to this) (Thread)


[info]darkk
2009-01-06 07:19 am UTC (link)
Теоретически, можно, практически, если автоматом всю сотню фидов конкатенировать — получится чушь. Опять таки, как отметил [info]aster_x86, в гуглеридере есть папки, которые эту проблему почти решают.

Разбиение по группам друзей ЖЖ через простой интерфейс не отдаёт, по крайней мере я не нашел, в отличие от полного списка читаемых журналов/сообществ (оно отдаётся OPML-файлом по адресу http://www.livejournal.com/tools/opml.bml?user=${USERNAME}).

(Reply to this) (Parent)


[info]assaron
2009-01-07 07:22 am UTC (link)
что-то я не понял как этот файлик скормить гугл рдеру
можно поподробнее?

и, насколько я понимаю, необходимо каждый раз при обновлении френд-листа добавлять рсс-фиды?

(Reply to this) (Thread)


[info]darkk
2009-01-07 07:37 am UTC (link)
В manage subscriptions (в низу списка подписок), import/export.

Да, при обновлении френд-листа надо добавлять фиды вручную, правда, интерфейса для создания URL-а для отдельного фида пока нет - если надо, сделаю.

(Reply to this) (Parent)(Thread)


[info]assaron
2009-01-07 08:01 am UTC (link)
ага, действительно
сенкс

мне кажется неплохо было бы
добавить еще одно поле - имя френда, если оно пустое, то всю френдленту выдавать, иначе одну ссылку
ну или можно отдельную формочку

(Reply to this) (Parent)(Thread)


[info]darkk
2009-01-07 08:03 am UTC (link)
Хорошо, обязательно добавлю что-нибудь в таком духе.

(Reply to this) (Parent)


[info]snusmumrikkk
2009-01-07 09:23 am UTC (link)
Спасибо! Пару недель уже все собирался сделать в точности это же (на GAE и с открытыми исходниками). Большой минус сейчас в том, что он не берет в расчет сообщества. И еще хочется такой же маленький сервис, который бы сам обновлял с некоторой периодичностью папку в GReader на случай добавления/удаления друзей. В общем-то как экзамены сдам, напишу это. И немного дизайна придумаю для rss-proxy.darkk.net.ru.

(Reply to this) (Thread)


[info]darkk
2009-01-07 09:30 am UTC (link)
Это известный факт, что идеи витают в воздухе пока не сконденсируются где-нибудь в виде реализации.
А вот сообщества в opml-файл грузятся, кстати.

Думаю, автообновление — зло, т.к. потребуется еще и логин от ридера, а это, простите, логин ко всем гуглёвым сервисам. А вот сделать фид из обновлений списка сообществ и френдов вполне реально.

(Reply to this) (Parent)


[info]assaron
2009-01-07 01:54 pm UTC (link)
еще неплохо бы увидеть всякие location'ы, mood'ы, now listening'и и прочую фигню
это возможно?

(Reply to this) (Thread)


[info]darkk
2009-01-07 02:05 pm UTC (link)
Теоретически, да, вопрос в том, как это сделать «правильно».

В отдаваемых фидах они есть (тэги lj:music, lj:mood и прочие), но google reader про них не знает, т.к. это lj-специфичное расширение для RSS.

(Reply to this) (Parent)


[info]vanushah2
2009-01-09 06:29 pm UTC (link)
в Google Chrome не работает, выплевывает это:

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>405 Method Not Allowed</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Method Not Allowed</h1>
<h2>The request method <code>GET</code> is inappropriate for the URL <code>/livejournal/opml</code>.</h2>
<h2></h2>
</body></html>

(Reply to this) (Thread)


[info]darkk
2009-01-09 06:38 pm UTC (link)
Ага, правильно, POST != post.

Поправил, помогло?

(Reply to this) (Parent)(Thread)


[info]vanushah2
2009-01-09 06:43 pm UTC (link)
нет

(Reply to this) (Parent)


[info]darkk
2009-01-09 06:40 pm UTC (link)
Эм, а выплевывает-то HTML-ем или прям таким текстом?

(Reply to this) (Parent)(Thread)


[info]vanushah2
2009-01-09 06:42 pm UTC (link)
Это код эйчтиэмэля, сам текст выглядит так:

vanushah2's LiveJournal.com reading list Иван

(Reply to this) (Parent)(Thread)


[info]darkk
2009-01-09 06:49 pm UTC (link)
Значит, помогло, да, я знаю, интерфейс ужасный, но до очеловечивания интерфейса руки пока не дошли.
Это OPML-файл, его сохранить и грузить в ридер.

<opml version="1.1">
<head>
<title>darkk's LiveJournal.com reading list</title>
<ownerName>глупец</ownerName>
</head>
...

(Reply to this) (Parent)(Thread)


[info]vanushah2
2009-01-09 06:53 pm UTC (link)
проблема в том, что сохраняет он html-код который я привел выше

(Reply to this) (Parent)(Thread)


[info]darkk
2009-01-09 07:02 pm UTC (link)
html-код привёденный выше не содержит текста про reading list, проблему, которая вызывала ошибку доступа я уже, кажется, устранил.

Если же html-код с reading list при сохранении не является opml файлом, пришли мне его начало, пожалуйста. URL-ы вида http://rss-proxy[.a-z]*/feed/.* лучше порезать, чтоб не было ко мне вопросов, если вдруг пароль от ЖЖ куда-нибудь утечёт.

(Reply to this) (Parent)(Thread)


[info]vanushah2
2009-01-09 07:11 pm UTC (link)
html-код который сохраняется - это тот же самый код что я привел выше )

мне кажется это какой-то баг хрома, потому что если открыть просмотр кода не в виде текста а в chrome-inspector, то отобразится чертово содержимое opml'я.

(Reply to this) (Parent)(Thread)


[info]darkk
2009-01-09 07:19 pm UTC (link)
Хм. Ну как сказать, это полубаг. Я примерно понимаю, как он возникает, моя это ошибка или хрома — надо читать спеку HTTP/1.1, завтра может быть займусь этим после экзамена, если будет время.

А может быть это просто баг с кэшированием старого ответа, т.к. There are only two hard things in Computer Science: cache invalidation and naming things.

(Reply to this) (Parent)


[info]vanushah2
2009-01-09 08:09 pm UTC (link)
"Даёшь фрэндленту в GoogleReader!"

так и хочется поправить: Даёшь фрэндленту в <your favorite feed aggregator>! )

(Reply to this) (Thread)


[info]darkk
2009-01-09 08:16 pm UTC (link)
s/aggregator/web-&/
десктопные аггрегаторы обычно умеют авторизовываться.

(Reply to this) (Parent)


[info]vanushah2
2009-01-10 11:38 am UTC (link)
единственная большая пробелма, это что ридер таким образом читаемые фиды будет считать "непопулярными" и из-за этого лаг при их обновление будет более часа (мой личный максимум 4 часа с копейками)

2.00 КБ

(Reply to this) (Thread)


[info]darkk
2009-01-10 11:52 am UTC (link)
Эм... Я что-то не понимаю, или в картинке лаг — два часа с копейками, а не четыре?

А вообще, до этого у меня rss2email проверял фиды раз в час, и я не могу сказать, что испытываю неудобства какие-то. Более того, google reader в любом случае не гарантирует лага — так что использовать его для критически важных фидов (вот глупость-то сказал?) не стоит.

Еще один вариант — положиться на то, что сообщества в большинстве своём не закрытые, соответственно, пропускать их через rss-proxy нужды нет. Ну и навешать на это условно-удобный UI по генерации OPML-файла с нужным набором проксируемых/непроксируемых фидов.

(Reply to this) (Parent)(Thread)


[info]vanushah2
2009-01-11 05:03 am UTC (link)
Да. Это как для примера "популярного" фида (пользователь-тысячник)

Я думаю не надо ничего придумывать и просто предложить пользователю явно (как говорят англичане explicitly) указать какие фиды нужно пропускать через прокси.


(Reply to this) (Parent)(Thread)


[info]darkk
2009-01-11 05:28 am UTC (link)
Ессесно, но для этого стоит придумать разумные умолчания (например, проксировать только взаимных френдов) и не сильно мерзкий UI.

(Reply to this) (Parent)

:-)
[info]vanushah2
2009-01-14 08:00 am UTC (link)
2.02 КБ

(Reply to this) (Parent)(Thread)

Re: :-)
[info]darkk
2009-01-14 08:10 am UTC (link)
За всё приходится платить :-)

(Reply to this) (Parent)


(36 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…