Чиним ljArchive

May 21, 2012 18:23

Оригинал взят у sharpc в Чиним 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 байт.
Previous post Next post
Up