kouzdra Below are the 4 most recent journal entries recorded in the "kouzdra" journal:
September 26th, 2007
04:57 am

[Link]

Экспорт основого дневника
Тоже все очень просто - сначала надо узнать за какие месяцы собственно надо импортировать (поскольку импорт работает помесячно).
Для этого в протоколе есть фукция "getdaycounts" с параметром "usejournal=(journal-name)"

В ответ она, как и написано в документации, выдает пары ключ/значение вида 2007-08-27 3 (для каждого дня, когда были постинги, количество постов. Соотвественно - собираем список месяцев с ненулевым количеством постов и вперед, на мамонта.


Мамонт добывается запросом POST на url


http://www.livejournal.com/export_do.bml?authas=(journal-name) (если не заботиться о сообществах, authas можно не указывать)

с параметрами:
month=(month)
year=(year)
what=journal
format=xml (или csv - кому как удобнее)
header=1
notranslation = "1" (транслировать кодировку или нет - там есть какие-то нюансы, которые прямо сейчас я откомментировать не возьмусь)
encid = "2" (* UTF-8*)
field_itemid = "1"
field_eventtime= "1"
field_logtime = "1"
field_subject = "1"
field_event = "1"
field_security = "1"
field_allowmask= "1"
field_currents = "1"

В ответ приходит счастье во вполне внятном формате. itemid тут содержит anum - собственно простейший способ их быстро узнать.

Экспорт поста обратно в журнал делается функцией postevent.
Там все просто и понятно, единственная недокументированая деталь - помимо номера свежего поста, отдается и его anum.

Удаление (как и редактирование поста делается функцией editevent (для удаления надо просто послать пустой текст;

PS: В принципе, если делать эти операции постинга или удаления не через клиентский интерфейс, а через пользовательский - практически наверняка можно будет добиться в разы большей скорости (за счет распараллеливания). Надо будет попробовать потом - а то у наших аццких какеров удалялка постов как-то очень уж медленно работает. Их многие даже подозревают в ручной работе на ниве кнопочки delete. Непорядок это ;)

Tags:

(Leave a comment)

September 24th, 2007
09:50 pm

[Link]

Жестокое обращение с комментариями (2)
Еще бывает, хочется постить комментарии (что в частности делают сральные роботы):

Я с этим возился разбираясь, как сделать импорт комментов средствами ЖЖ (получилось довольно прилично - пример восстанавливалки:
(оригинал).

Там гемморою несколько больше, а как сделать неанонимный комментарий я пока не разобрался (понятно, что просто какие-то параметры указать правильно):

Для ответа в корень или в тред надо сделать запрос get на URL вида:
http://user.livejournal.com/xxxxxx.html?mode=reply
или
http://user.livejournal.com/xxxxx.html?thread=yyyyyy#tyyyyyy

В ответ приедет нудная html-ка в которой будет форма для ответа. Из нее надо вычучить два поля:
<input type='hidden' name='chal' id='login_chal'
value='c0:1190656800:83:900:DNooOKZ0pugJdWXZ9YPj:21a9bcf339cc2559d70a41e112a21b91' />
и:
<input type='hidden' name="chrp1"
value="471973-2371938-1190656800-CWhs5XiUu8eu90Anx5Pi-9551383c08447e996544d31e76c74b52" />
интересуют имнно значиния value (в необходимости второго я не уверен). После чего можно делать запрос POST на URL:

http://www.livejournal.com/talkpost_do.bml с параметрами:

login_chal=(challenge)
login_response=(response) -- response это MD5-хеш от (login_chal || MD5 (пользовательского пароля))
password=""
submitpost="1"
subject=(subject)
body=(comment-body)
itemid=(entry-url-no) (а вот тут anum принципиален)
journal=(journal-name) (имя пользователя или сообщества, куда постится коммент)
prop_opt_preformatted="0" или "1"
chrp1=(chrp1) (не уверен, что нужно)

Если ответ идет на другой коммент необходимо задать еще
replyto=(thread-no)
parenttalkid=(thread-no) (а вот в этих полях номер коммента идет без anum и умножения на 256)

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

The document has moved 
      <A HREF="http://kouzdra.livejourna.com/xxxxx.html?view=yyyyyy#tyyyyyy">here</A>


где yyyyyy - номер (с anum) нового комментария. Полезно, если нужно узнать его id.

Tags:

(2 comments | Leave a comment)

09:19 pm

[Link]

Жестокое обращение с комментариями (1)
Механически насиловать ЖЖ можно разными способами: их можно разбить на 3 категории:


Первый метод всем хорош, кроме двух моментов:
1) там можно делать далеко не все (например комменты фиг прочитаешь и фиг запостишь)
2) запросы там надо выдавать последовательно - при попытке делать это из нескольких тредов он дает отлуп. А это довольно сильно влияет на скорость. Можно пользоваться плоским интерфейсом (что imho проще и удобнее), но для фанатов XML - можно пользоваться и XMLRPC - разницы в общем никакой.

Второй метод всем замечателен, кроме того, что предназначен ровно для одной цели - экспорта дневника. Зато он работает хорошо и очень быстро - экспорт всего моего дневника занимает секунд 20 (у меня 100mbit-ный канал).

Ну а третий плох и недокументированностью и тем, что там часто приходится парсить html, отдаваемый ЖЖ (а это не очень надежно - тем более, что формат довольно сильно варируется в зависимости от настроек аккаунта)

Как логиниться в ЖЖ



Для последних двух методов нужна предварительная авторизация в ЖЖ. Самый простой способ ее получить - воспользоваться функцией протокола sessiongenerate. Она в ответ отдает куку, которую просто надо совать в заголовок всех последующих запросов к ЖЖ:
Coockie: ljsession=(session-id)

При этом полезно указывать флажки expiration=short (чтобы не плодить сессии) и ipfixed=1 (на всякий случай - секурнее будет)

Жестокое обращение с комментариями



Комменты в ЖЖ можно скачивать, удалять, скринить, морозить и т.п.

Делать это не просто просто, а очень просто: все кроме удаления делается посредством запроса post на URL
http://www.livejournal.com/talkscreen.bml

с параметрами:

confirm="Y"
journal=(user-or-community-name)
mode=(mode) ("freeze", "unfreeze", "screen", "unscreen")
talkid=(thread-no) - как я уже говорил (comment-no)*256 + anum, но вместо anum можно использовать 0 (наверное и любое число)

Удаление коммента делается запросом post на
http://www.livejournal.com/delcomment.bml?journal=(journal-name)&id=(номер треда)
c параметрами:
confirm="Delete Comments"
delthread="0" или "1" (удалять подтред или нет)
spam="0" или "1"
ban="0" или "1"

И будет вам счастье.

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

Напомню, что нумерация комментов сквозная и строго последовательная. То есть - если Вам навалило кучу дерьма в фиксированный интервал времени - самый простой способ ее снести - выяснить id первого коммента с дерьмом, id последнего и пройтись в цикле от первого ко второму. Единственный недостаток этого метода - будут снесены и "честные комменты", случившиеся в означенный период времени. Зато не просто просто, а очень просто.

Tags:

(2 comments | Leave a comment)

September 23rd, 2007
10:22 pm

[Link]

Слава ЖЖ роботам
Меня по итогам игр с ЖЖ-шкой потянуло изложить полученные сведения о том, как писать роботов.
Ну в смысле изложить свои познания о интерфейсе ЖЖ. Так вот первая серия:

Структура ЖЖ



Тут все очень просто: все записи в конкретном журнале имеют сквозную последовательную нумерацию.
Все комменты - так же. Откуда берутся дикие номера в URL: с каждым постом в ЖЖ ассоциируется так
называемый anum (более или менее случайное число в диапазоне 0..255) - и в URL id записей и комментариев
превращаются в id * 256 + (anum записи, к которой они относятся). На кой хер это надо - я не очень понимаю.
За разъяснение руководящей и направляющей роли anum thx [info]nit

Tags:

(4 comments | Leave a comment)

My Website Powered by LJ.Rossia.org