Итак. Захотелось мне сделать так, чтобы новости с Автобегиннера транслировались в Живой Журнал. Т.е. добавляется новость на сайт и сразу же появляется в LiveJournal. После недолгих поисков, я набрел на этот документ. Из него видно, что ЖЖ поддерживает 2 протокола взаимодействия: «Тонкий клиент» и XML-RPC протокол.
«Тонкий клиент» – довольно примитивная технология, поэтому ее я даже не расматривал, и стал изучать XML-RPC. Wikipedia любезно сообщает нам, что
XML-RPC (сокр. от англ. Extensible Markup Language Remote Procedure Call — XML-вызов удалённых процедур) — стандарт/протокол вызова удалённых процедур, основанный на XML, является прародителем SOAP, отличается исключительной простотой применения. XML-RPC, как и любой другой интерфейс RPC, определяет набор стандартных типов данных и команд, которые программист может использовать для доступа к функциональности другой программы, находящейся на другом компьютере в сети.
Здорово, правда? Итак. Нам нужна библиотека, которая могла бы формировать, посылать, получать и обрабатывать XMP-RPC-запросы. Для этих целей я использовал The Incutio XML-RPC Library for PHP весом всего 27 Кбайт.
Вот код, который добавляет новую запись в ЖЖ:
require('IXR_Library.inc.php');
// Кросспостинг в ЖЖ
define('LJ_HOST', 'www.livejournal.com');
define('LJ_PATH', '/interface/xmlrpc');
define('LJ_LOGIN', 'ваш_ЖЖ_логин');
define('LJ_PASSWD', 'ваш_ЖЖ_пароль');
// Создаем xml-rpc клиента
$ljClient = new IXR_Client(LJ_HOST, LJ_PATH);
// Посылаем challange-запрос (что такое - читайте ниже)
if (!$ljClient->query('LJ.XMLRPC.getchallenge')) {
echo 'Ошибка [' . $ljClient->getErrorpre().'] '.$ljClient->getErrorMessage();
}
else {
// Получаем ответ
$ljResponse = $ljClient->getResponse();
// Вытягиваем challenge
$ljChallenge = $ljResponse['challenge'];
// Заполняем поля XML-запроса
$ljArgs = array();
// Имя пользователя
$ljArgs['username'] = LJ_LOGIN;
// Указываем способ идентификации
$ljArgs['auth_method'] = 'challenge';
// Указываем полученный challenge
$ljArgs['auth_challenge'] = $ljChallenge;
// Посылаем зафрованный пароль
// формула md5(challenge + md5(password))
$ljArgs['auth_response'] = md5($ljChallenge . md5(LJ_PASSWD));
// Версия протокола, 1 - все данные в кодировке UTF-8
$ljArgs['ver'] = "1";
// Текст записи (перекодируем из windows-1251 в UTF-8)
$ljArgs['event'] = iconv('windows-1251', 'UTF-8', 'текст записи');
// Заголовок записи (перекодируем из windows-1251 в UTF-8)
$ljArgs['subject'] = iconv('windows-1251', 'UTF-8', 'заголовок');
// Дата
$ljArgs['year'] = 2008; // год
$ljArgs['mon'] = 2; // месяц
$ljArgs['day'] = 11; // день
$ljArgs['hour'] = 14; // часы
$ljArgs['min'] = 58; // минуты
// Доп параметры
$ljArgs['props'] = array(
// Текст уже отформатирован (содержит HTML-теги)
'opt_preformatted' => true,
// Добавляем запись "задним числом"
'opt_backdated' => true,
'taglist' => iconv('windows-1251', 'UTF-8', 'список тегов (меток), разделенный запятыми'),
);
// Доступность записи - доступна всем (по-умолчанию)
$ljArgs['security'] = 'public';
// Добавляем новое сообщение
$ljMethod = 'LJ.XMLRPC.postevent';
// Посылаем запрос
if (!$ljClient->query($ljMethod, $ljArgs)) {
echo 'Ошибка ['.$ljClient->getErrorpre().'] '.$ljClient->getErrorMessage();
}
else {
// Получаем ответ
$ljResponse = $ljClient->getResponse();
print_r($ljResponse);
}
}
В коде можно заметить странные пассы с паролем. Зачем? Объясняю.
ЖЖ поддерживает несколько схем авторизации. Самая простая – clear: пароль посылается обычным текстом, что согласитесь, небезопасно. Схема, когда посылается MD5-хэш пароля тоже не идеальна. Наиболее надежна, так называемая challenge-response схема («вызов – ответ», «отзыв – пароль» и т.д.).
Мы запрашиваем у сервера «секретное слово»:
if (!$ljClient->query('LJ.XMLRPC.getchallenge')) {
echo 'Ошибка [' . $ljClient->getErrorCode().'] '.$ljClient->getErrorMessage();
}
И шифруем наш пароль (по формуле md5(«секретное слово» + md5(«пароль»))) с использованием этого слова:
$ljArgs['auth_response'] = md5($ljChallenge . md5(LJ_PASSWD));
Элегантно и надежно )))
Кстати, похожая схема используется в сотовой связи.
В приведенном коде я использую iconv для перекодирования из windows-1251 (стандартная кодировка для бегиннера) в UTF-8.
Если все ОК, от сервера придет ответ такого вида:
Array
(
[itemid] => 23
[url] => http://адрес_записи
[anum] => 105
)
Главное, что нас интересует – это itemid. С помощью него можно эту запись редактировать. Для этого в коде меняем строки 59-60:
// Добавляем новое сообщение
$ljMethod = 'LJ.XMLRPC.postevent';
на
// Редактируем запись
$ljMethod = 'LJ.XMLRPC.editevent';
$ljArgs['itemid'] = itemid;
Где itemid – это itemid записи :))))
В случае успеха ответ будет таким же, как при добавлении.



Добрый день. А не подскажете, где можно найти такую же инфу, но на английском языке
[ссылка]
Хочется уподобиться боту и написать нечто вроде «Спасибо, очень полезный материал» ;) и ведь не совру же )))
да и еще один момент )
в Вашем коде с датами заморочка… защита от дурака? Это чтобы абсолютные нубы не заюзали?
Нет. Это остатки работающего кода на сайте, из которого брался пример.
Исправил. Спасибо за замечание.
Я не программер. И не совсем ясно куда этот код прилеплять.
Привет, можешь помочь написать что-то подобное для добавления-удаления друзей в аккаунте LJ? в долгу не останусь!
Если есть API функции для этого – попробую.
Хорошо, написал на почту
Скажите, а куда этот код необходимо прикрутить, чтобы заработал кросспостинг в ЖЖ ?
Доброго дня!
Подскажите, после выполнения выдается следующая ошибка:
«Ошибка [-32300] transport error – HTTP status code was not 200″
в какую сторону смотреть?
Какая ошибка при получении ответа (статус не 200). Попробуйте посмотреть что возвращает запрос. Может 404 или 502 или что-нибудь другое.
Запрос возвращает полностью сгенерированные данные, если Вы об этом…
Ошибка [-32300] transport error – HTTP status code was not 200
А как постить в blogger.com?
Мне не совсем понятно,как сие к джумле прикрутить.поясните плиз.
Здравствуйте. Спасибо за пример.
Почему-то не могу запостить запись в сообщество, хотя в свой ЖЖ получается.
добавляю аргумент:
$ljArgs['usejournal'] = iconv(‘windows-1251′, ‘UTF-8′, $post_target);
если в переменной мой жж — всё работает, если сообщество — «Fatal error: Call to undefined method IXR_Client::getErrorpre() … »
Не подскажете в чём дело?
ну вот, только пожаловался, как сам разобрался.
оказался лишним параметр $ljArgs['security']
а откуда взялся метод $ljClient->getErrorpre()
в бибилиотеки такого нет
Исправил. Это ошибка – должно быть ErrorCode
А возможно с помощью интерфейса XML-RPC добавлять в друзья в ЖЖ
А как с тобой связаться, тоже это интересует.
Большое пребольшое спасибо!
На многочисленные вопросы о том, можно ли и помощью интерфейса XML-RPC добавлять в друзья в ЖЖ, отвечаю – можно. Только для этого нужно использовать метод consolecommand а не postevent. Ну, и список друзей не забыть подготовить =))