Recently in Movable Type Category

Опять кросспостнинг

|
Сделал почти человеческий кросспостинг в ЖЖ.

В чем оказалось дело?

Плагин Crossposter к MT пользуется Atom API для создания и последующего обновления кросспостов. И этот API у ЖЖ сломан. Работает и GET на feed, и POST для нового поста, и PUT на существующий для апдейта, и DELETE, но GET на отдельный пост выдает 401.

Как выкрутиться? GET перед PUT нужен в первую очередь, чтобы получить элемент <id> для поста. Без этого элемента PUT не пройдет, а на момент POST этот id еще неизвестен. Что делать? После POST получить feed журнала, пройтись по всем постам, найти нужный, сохранить его в базе, а потом при апдейте записи не делать GET, а вытянуть его из базы, изменить как нужно и отправить в ЖЖ PUT'ом.

Грязный и кривой хак, но ничего умнее я не придумал.

Вот патч: crossposter.patch.gz

Если Crossposter уже установлен, то надо изменить схему базы, добавив в таблицу mt_crossposter_cache колонку crossposter_cache_xml.

Important note: в патч закрался небольшой косяк, поэтому те, кто скачал его до Wed Dec 12 02:01:28 MSK 2007, просьба откатиться и выкачать заново.

Продолжаем упражняться

|
Тутбалин не так давно мизантропировал на предмет плагина Crossposter.

Потратил сегодня пару часов на разбирательства.

Что оказалось насчет левых <br>. Путем вдумчивого чтения сорцов ЖЖ было обнаружено следующее. Livejournal думает, что ему дают не настоящий html, а нечто, что ему нужно отформатировать самостоятельно. Вылечивается установкой флага convertLineBreaks в false. Логика, по которой это не есть установка по умолчанию, от меня ускользает. Как вылечить замену честного юникода на &#xNNNN-style порнуху, пока не ясно. Известно только, что на livejournal контент уходит в нормальном виде, а извращается уже на той стороне. До этого места в ЖЖ-шнух сорцах я еще не дочитал. Но это не сильно мешает.

Что оказалось насчет апдейтов кростпостнутых entries. Тут интересней.
Как положено, плагин Crossposter вытягивает entry к себе, меняет что нужно, и кладет обратно. Вот на этапе вытягивания возникает проблема: 401 Authentication Failed. Как же так? Что ж такое?

Причина вот в чем.
http://code.sixapart.com/trac/livejournal/browser/trunk/cgi-bin/Apache/LiveJournal/Interface/AtomAPI.pm#L576
# let's authenticate.
#
# if wsse information is supplied, use it.
# if not, fall back to digest.
my $wsse = $r->header_in('X-WSSE');
my $nonce_dup;
my $u = $wsse ? auth_wsse($wsse, \$nonce_dup) : LJ::auth_digest($r);
return respond( $r, 401, "Authentication failed for this AtomAPI request.")
    unless $u;

return respond( $r, 401, "Authentication failed for this AtomAPI request.")
    if $nonce_dup && $action && $action ne 'post';

Удивительные люди в этом ЖЖ. Почему post можно по WSSE, а остально нельзя? Загадка. Почему, если уж нельзя edit, не выдать нужные заголовки для digest auth? Еще загадочней.

Чего делать? Хакнуть XML::Atom::Client или засабмитить багу в суп?

А вот запрет на коменты к кростпостнутой entry, судя по всему, сделать не получится через atom. И ручками проставлять лень. Ну и фиг с ним, комментируйте меня где удобно.

Pages

Archives

Sign In