Чиним ljArchive

Nov 22, 2011 19:43

С некоторых пор самая удобная (хотя, увы, давно не поддерживающаяся) программа для оффлайн-копии ЖЖ 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.

UPD 2022.01.02: ЖЖ сделал TLS 1.2 обязательным, пришлось обновить используемый .NET Framework до 4.0 и пришпилить используемую версию TLS. Переложил исходники и инсталлятор на Гитхаб https://github.com/sharpden/ljarchive

In order to use ljArchive in 2022, download release 0.9.8 from https://github.com/sharpden/ljarchive

software, программирование, интернет

Previous post Next post
Up