?

Log in

Чиним ljArchive

С некоторых пор самая удобная (хотя, увы, давно не поддерживающаяся) программа для оффлайн-копии ЖЖ ljArchive (что это такое и как этим пользоваться можно прочитать, например, тут) стала выдавать ошибки при синхронизации комментариев (по таймауту) вида:

The server is not responding. Please try again later.
EF.ljArchive.Engine.ExpectedSyncException: An expected exception occurred: ServerNotResponding ---> System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly.
и дальше коллстек из EF.ljArchive.Engine.Sync.ExportCommentsMeta в System.Xml.


Ошибка происходила из-за того, что в этой функции XmlTextReader пытался читать из WebResponse.GetResponseStream(), который возвращал не XML, как ожидалось, а главную HTML-страницу. Дальнейшее исследование показало, что для скачивания комментариев ЖЖ не устраивает авторизация, которую производит ljArchive, например, для скачивания записей. При сравнении HTTP-запросов Semagic (в последней версии которого скачивание комментариев работает) и ljArchive выяснилось, что их куки ljloggedin отличаются: у Semagic они имеют вид u9812774:s1373, а у ljArchive u9812774:s1371:11 BASE64-подобных символов, взятых из куков ljsession. Остальное было делом техники: надо в файле Engine/Util.cs:72 (функция HttpWebRequestFactory::Create) заменить строку
wr.CookieContainer.Add(new Cookie("ljloggedin", ljsession.Substring(ljsession.IndexOf(":") + 1, ljsession.LastIndexOf(":") - ljsession.IndexOf(":") - 1), "/", uri.Host));
например, на
wr.CookieContainer.Add(new Cookie("ljloggedin", ljsession.Substring(ljsession.IndexOf(":") + 1, ljsession.LastIndexOf(":", ljsession.LastIndexOf(":") - 1) - ljsession.IndexOf(":") - 1), "/", uri.Host));
и скачивание комментариев магическим образом заработало. Авось еще какое-то время не отвалится.


Для тех, кто не хочет компилировать, я положил пропатченную версию EF.ljArchive.Engine.dll на Народ. К сожалению, компиляторы разные, поэтому бинарный дифф большой, в идеале же достаточно было бы исправить всего 18 байт.

UPD 2015.03.19: ЖЖ опять поломал ljArchive, на этот раз помогло убрать все куки, кроме ljsession, в том же месте. Исправленная DLL тут.

In English: In order to fix most problems with ljArchive, download patched EF.ljArchive.Engine.dll and replace it in the program folder.

Comments

А нет ли средства сохранить "избранное"?
LJSM ломается на первой же мультитэговой записи, а обычные сайтокачалки не качают комменты и вообще ведут себя непредсказуемо (так как нельзя указать "качать только этот домен на глубину 3 ссылки", то норовят выкачать весь интернет)
Не встречал, не пользуюсь, возможно, по ссылкам с соответствующей страницы.
Удивлен таким отзывам о сайтокачалках, есть и указание глубины, и ограничение по URL (например, регекспами). Про комменты тоже непонятно, ?page=N имеется ввиду? Смотрели Offline Explorer?
что такое "избранное" хорошо представляете? Это структурированный по тэгам (то есть одноуровневое дерево с повторами) набор ссылок на разные страницы разных сайтов вида *.livejournal.com,
на практически всех из этих страниц есть ссылки на другие сайты такого вида. Как обеспечить загрузку только этих основных страниц и, желательно, всех их комментариев (с разворачиванием) средствами какой-нибудь сайтокачалки? Буду благодарен за подсказку. Ограничение глубины не проходит, во всяком случае, в TeleportPro не сработал.
а, понял, уточняю: ограничение по домену не проходит, потому что доменов 3-го уровня до чёрта, а домен 2-го уровня содержит слишком много не нужного (весь ЖЖ мне хранить не на чём :)