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 к 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';
Потратил сегодня пару часов на разбирательства.
Что оказалось насчет левых <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. И ручками проставлять лень. Ну и фиг с ним, комментируйте меня где удобно.
Чего делать? Хакнуть XML::Atom::Client или засабмитить багу в суп?
А вот запрет на коменты к кростпостнутой entry, судя по всему, сделать не получится через atom. И ручками проставлять лень. Ну и фиг с ним, комментируйте меня где удобно.