XML-RPC и кросспостинг в ЖЖ
Интернет — 1 марта, 2008 14:36 — Комментариев: 3
Теги: Livejournal, php, XML-RPC, ЖЖ, интернет, начинающий водитель
Итак. Захотелось мне сделать так, чтобы новости с Автобегиннера транслировались в Живой Журнал. Т.е. добавляется новость на сайт и сразу же появляется в 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->getErrorCode().'] '.$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'] = $ljNews['nyear']; $ljArgs['mon'] = $ljNews['nmonth']; $ljArgs['day'] = $ljNews['nday']; $ljArgs['hour'] = $ljNews['nhour']; $ljArgs['min'] = $ljNews['nminute']; // Доп параметры $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->getErrorCode().'] '.$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 записи:))))
В случае успеха ответ будет таким же, как при добавлении.
Комментариев: 3
-
— 5 Мар 2008 в 11:58
-
— 20 Апр 2008 в 13:30
[…] продолжение этого поста расскажу как написать собственный XML-RPC сервер, […]
-
— 4 мая 2008 в 22:31
[…] sape.ru. Кто-то знает что такое XML-RPC (кто не знает, прошу сюда и сюда). И лишь немногие знают, что с Сапой можно […]
Оставить комментарий
Поиск
Реклама
Новые комментарии
- → Хочу поблагодарить за класную обложку. Действительно здорово. Стильно!... 1
- → Класс! Про различия между добром и злом - согласен.... 7
- → p.s. подписался :) забавно пишешь.... 7
- → Моя любимая цитата касательно бога В 1921 году Эйнштейн получил телеграмму от... 7
- → +1 мне нравиться... 5
- → Пасиба :)... 5
- → Да, Костя, точно - не занимаемся:)))...Красиво получилось!... 5
- → Для неформального девиза сойдет :)... 5
- → по-моему жестковато =)... 5
- → Угу... 7
Свежие записи
- → Прочитал: Владимир Перемолотов — Звездолет «Иосиф Сталин» 1
- → Мы не занимаемся порнографией 5
- → Моя теория «бога». Критикуйте! 7
- → Россия — Нидерланды 3: 1 — мы в полуфинале!!! 5
- → Unsharp Mask на PHP 2
- → Призы от Майкрософт 0
- → На работу!? 6
- → Download Day 2008 0
- → Пасхальное яйцо от разработчиков форума SimpleMachines 0
- → Пластилиновый мультик про Кировскую Область 0
Друзья
Интернет - июля 2, 2008 21:56 - Комментариев: 5
Мы не занимаемся порнографией
Еще в рубрике Интернет
- Unsharp Mask на PHP
- Призы от Майкрософт
- Download Day 2008
- Пасхальное яйцо от разработчиков форума SimpleMachines
- Пульт управления сервером
Рукоприкладство - мая 25, 2008 15:12 - Комментариев: 3
Сдали: Пресс-база Volkswagen
Еще в рубрике Рукоприкладство
- Сдали: Кировская Городская дума
- Сдали: Маркетинговая база Volkswagen
- Сдали: Кировский молочный комбинат
МайЛайф - июля 2, 2008 20:20 - Комментариев: 7
Моя теория «бога». Критикуйте!
Еще в рубрике МайЛайф
- Россия — Нидерланды 3: 1 — мы в полуфинале!!!
- На работу!?
- Пластилиновый мультик про Кировскую Область
- Болельщикам на Евро 2008
- 5 фактов из моей жизни






Mobile Blogger Start…
Потихоньку начинаю реализовывать идею по созданию клиента для ведения блога с коммуникатора.
Клиент будет работать через XML-RPC. Интерфейс…