XML-RPC: Постинг в LiveJournal
18 марта 1999 года американский программист Брэд Фитцпатрик (Brad Fitzpatrik) зарегистрировал домен www.livejournal.com. Изначально, Живой Журнал Брэд использовал для ведения своего личного дневника. Немного погодя, на сайте начали писать друзья разработчика. После чего начался взрывной рост популярности этого сайта.
Впервые на русском языке LiveJournal был представлен зимой 2001. Первую русскоязычную запись оставил Роман Лейбов в 3:58 1 февраля 2001 года.
На данный момент Живой Журнал имеет: 25 миллионов аккаунтов (из них активны около 18 миллионов), из них 1 427 224 из России. Впечатляет, правда?
Сегодня, в продолжение статьи о библиотеках для работы с XML-RPC рассмотрим примеры удаленного постинга в LiveJournal посредством протокола XML-RPC.
Удаленные процедуры
Список удаленных процедур, которые можно вызвать, доступен на страничке документации. Правда, вся документация на английском языке.
Всего процедур в документации описано 17. Это процедуры, для логина, постинга, редактирования поста, работы с френдами и некоторые другие служебные процедуры.
Сервер расположен по адресу http://www.livejournal.com/interface/xmlrpc и судя по всему, написан на Perl. Все процедуры имеют префикс «LJ.XMLRPC.».
Постинг
Для постинга нужна всего одна процедура. Эта процедура носит название postevent. Но при этом, нужно прислать авторизационные данные.
Из всех трех методов авторизации, на мой взгляд, самым надежным является challenge-response-метод. Этот метод работает так: сначала мы получаем у сервера секретный ключ, а потом с помощью этого ключа шифруем пароль и отсылаем его на сервер. Этот способ авторизации во много раз надежнее, чем отсылка незашифрованного пароля.
Напишем скрипты, которые запостят в ЖЖ, с использованием двух различных библиотек, которые были рассмотрены в предыдущей статье.
XML-RPC for PHP
Сначала рассмотрим библиотеку XML-RPC for PHP.
В процессе создания появились некоторые проблемы с кодировкой в этой библиотеке, при использовании кодировки UTF-8. Но это все довольно быстро решилось с помощью установки
$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
после подключения библиотеки.
xml-rpc.php
<?php //подключаем библиотеку include_once 'xml-rpc/lib/xmlrpc.inc'; //выставляем внутреннюю кодировку, //чтоб не было проблем с перекодированием $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8'; header('Content-type:text/html;charset=utf-8'); //логин и пароль к ЖЖ $u_name = 'ЖЖ_Логин'; $u_pass = 'ЖЖ_Пароль'; //обращаемся к www.livejournal.com/interface/xmlrpc $lj = new xmlrpc_client( '/interface/xmlrpc','www.livejournal.com',80); //кодировка клиента $lj->request_charset_encoding = 'UTF-8'; //чтоб возвращал в виде php-переменных $lj->return_type = 'phpvals'; //если нужен дебаг //$lj->setDebug(3); //получаем chellange $chellange = $lj->send( new xmlrpcmsg('LJ.XMLRPC.getchallenge')); if($chellange->faultCode()){ die( 'Невозможно получить chellange:'. $chellange->faultString()); } $c = $chellange->value(); //собираем данные для поста $data = array(); //имя пользователя $data['username'] = new xmlrpcval($u_name,'string'); //метод аутентификации: clear, cookie или challenge $data['auth_method'] = new xmlrpcval('challenge','string'); //строка с challenge $data['auth_challenge'] = new xmlrpcval($c['challenge'],'string'); //шифруем пароль $data['auth_response'] = new xmlrpcval( md5($c['challenge'] . md5($u_pass)),'string'); //версия протокола 0 или 1 //если используется 1, то все данные должны //быть в кодировке UTF-8 $data['ver'] = new xmlrpcval('1','string'); //символ перевода строк \n или \r\n $data['lineendings']=new xmlrpcval("\n",'string'); //название поста в UTF-8 $data['subject'] = new xmlrpcval( mb_convert_encoding('Постинг в живой журнальчик' , 'UTF-8','windows-1251'),'string'); //текст поста в UTF-8 $data['event'] = new xmlrpcval( mb_convert_encoding( 'Летит компьютер с 9-го этажа, и думает: '. '"Вот бы щас зависнуть..."','UTF-8','windows-1251'),'string'); //дата $data['day'] = new xmlrpcval(date('d'),'string'); $data['mon'] = new xmlrpcval(date('m'),'string'); $data['year'] = new xmlrpcval(date('Y'),'string'); $data['hour'] = new xmlrpcval(date('H'),'string'); $data['min'] = new xmlrpcval(date('i'),'string'); //доступ к посту публичный $data['security'] = new xmlrpcval('public','string'); //некоторые мета-данные $data['props'] = new xmlrpcval(array( //true, если пост в отформатирован в html 'opt_preformatted' => new xmlrpcval(true,'boolean'), //true, если запись добавляем задним числом 'opt_backdated' => new xmlrpcval(true,'boolean'), //список тегов через запятую в UTF-8 'taglist' => new xmlrpcval( mb_convert_encoding('юмор,анкдот', 'UTF-8','windows-1251'),'string'), ),'struct'); $d = new xmlrpcval($data,'struct'); //вызываем процедуру LJ.XMLRPC.postevent $result = $lj->send(new xmlrpcmsg( 'LJ.XMLRPC.postevent', array($d)),0,'http11'); //если произошла ошибка, то сообщаем об ошибке if($result->faultCode()){ die('Ошибка постинга:'.$result->faultString()); } //если все нормально, то сервер вернет //структуру с 3-мя переменными: //itemid - идентификатор поста //url - URL-адрес поста //anum - аутентификационный номер, //созданный для этой записи $p_data = $result->value(); echo 'Пост успешно добавлен. Прочитать его можно'. ' <a href="'.$p_data['url']. '" target="_blank">здесь</a>'; ?>
Если все прошло нормально, получаем пост на LiveJournal.
PEAR XML_RPC2
С этой библиотекой никаких проблем не возникло, в отличие от предыдущей.
pear.php
<?php //подключаем библиотеку include_once 'XML/RPC2/Client.php'; header('Content-type:text/html;charset=utf-8'); //логин и пароль к ЖЖ $u_name = 'ЖЖ_Логин'; $u_pass = 'ЖЖ_Пароль'; //массив опций $options = array( //префикс 'prefix'=>'LJ.XMLRPC.', //кодировка 'encoding'=>'utf-8', //если нужен дебаг //'debug'=>true ); //создаем клиента $client = XML_RPC2_Client::create( 'http://www.livejournal.com/interface/xmlrpc', $options); try { //получаем строку с challenge $c = $client->getchallenge(); //собираем данные для поста $data = array(); //имя пользователя $data['username'] = $u_name; //метод аутентификации: clear, cookie или challenge $data['auth_method'] = 'challenge'; //строка с challenge $data['auth_challenge'] = $c['challenge']; //шифруем пароль $data['auth_response'] = md5($c['challenge'] . md5($u_pass)); //если используется 1, то все данные должны //быть в кодировке UTF-8 $data['ver'] = '1'; //символ перевода строк \n или \r\n $data['lineendings']="\n"; //название поста в UTF-8 $data['subject'] = mb_convert_encoding( 'Постинг в живой журнальчик','UTF-8','windows-1251'); //текст поста в UTF-8 $data['event'] = mb_convert_encoding( 'Автозаполнение на Гугле: "Как узнать, что '. 'ваш кот собирается вас убить?" ','UTF-8','windows-1251'); //дата $data['day'] = date('d'); $data['mon'] = date('m'); $data['year'] = date('Y'); $data['hour'] =date('H'); $data['min'] = date('i'); //доступ к посту публичный $data['security'] = 'public'; //некоторые мета-данные $data['props'] = array( //true, если пост в отформатирован в html 'opt_preformatted' => true, //true, если запись добавляем задним числом 'opt_backdated' => true, //список тегов через запятую в UTF-8 'taglist' => mb_convert_encoding( 'юмор,анкдот','UTF-8','windows-1251') ); //вызываем процедуру LJ.XMLRPC.postevent $result = $client->postevent($data); //если все нормально, то сервер вернет //структуру с 3-мя переменными: //itemid - идентификатор поста //url - URL-адрес поста //anum - аутентификационный номер, //созданный для этой записи echo 'Пост успешно добавлен. Прочитать его'. ' можно <a href="'.$result['url']. '" target="_blank">здесь</a>'; } catch (XML_RPC2_FaultException $e) { die('Exception #' . $e->getFaultCode() . ' : ' . $e->getFaultString()); } catch (Exception $e) { die('Exception : ' . $e->getMessage()); } ?>
В результате пост в Живом Журнале имеет вид
Читайте все статьи цикла:
- XML-RPC: библиотеки для взаимодействия с удаленными сервисами
- XML-RPC: Постинг в LiveJournal
- XML-RPC: постинг в WORDPRESS
- XML-RPC: работа с помощью Zend Framework
Популярность: 14%
Интересное из других блогов:
2leep.comИ не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта


Автор: valeros, 3 сентября 2010 в 20:11
используетЗдравствуйте.Не подскажите мне по такому вопросу:
При попытке отправить сообщение латиницей происходит ошибка
“Application failed during request deserialization:
reference to invalid character number at line…”
Причем при отправке латиницей все работает верно.
Автор: valeros, 3 сентября 2010 в 20:12
используетОпечатка
*При попытке отправить сообщение кириллицей*
Автор: web-junior, 9 сентября 2010 в 19:31
используетможет быть существуют проблемы с кодировкой отправляемой кириллицы?
Автор: valeros, 9 сентября 2010 в 19:38
используетОтправляю в UTF-8
Автор: Александр, 13 декабря 2010 в 14:31
используетПервый вариант:
Ошибка постинга: No CURL support compiled in.
Что делать?
Автор: web-junior, 16 декабря 2010 в 10:45
используетЗдравствуйте.
Скорее всего у вас не установлено расширение php_curl
Автор: Александр, 16 декабря 2010 в 11:06
используетСпасибо, разобрался уже.
Еще вопрос не осветите? Нужно спарсить ссылки блогов с определенного региона, т.е. взять инфу по ссылке типа: http://www.livejournal.com/directory.bml?WidgetGeoSearchLocation_country=US&WidgetGeoSearchLocation_statedrop=KS&WidgetGeoSearchLocation_stateother=&WidgetGeoSearchLocation_city=&WidgetGeoSearchLocation_minimal_display=0&ut_days=&age_min=&age_max=&int_like=&fr_user=&fro_user=&opt_format=simple&opt_pagesize=200&start_search=1
Если просто пользоваться file_get_contents($url) без авторизации, то выдается главная страница.
Каким образом зайти на эту страницу авторизовавшись и взять данные?
Автор: Вячеслав, 25 декабря 2010 в 21:19
используетУ меня в LiveJournal постятся иероглифы: Ð ÑÐ ÐСâÐ ÑР·Р°РÑÐ Ñ
Автор: web-junior, 1 июня 2011 в 20:22
используетПроверяйте правильность кодировки. Лучше всего использовать UTF-8
Автор: Антон, 23 декабря 2011 в 21:13
используетДоброго времени суток! Скачал библиотеку XML_RPC2, папку XML скопировал на сервер, рядом создал файл php пример которого вы показывали выше… Но при запуске не находит файл HTTP/Request2.php, там папки HTTP вообще нет.
Warning: require_once(HTTP/Request2.php) [function.require-once]: failed to open stream: No such file or directory in /var/www/mixmir/data/www/mixmir.net/soc_post/gg/XML/RPC2/Util/HTTPRequest.php on line 45
Fatal error: require_once() [function.require]: Failed opening required ‘HTTP/Request2.php’ (include_path=’.:/usr/share/pear:/usr/share/php’) in /var/www/mixmir/data/www/mixmir.net/soc_post/gg/XML/RPC2/Util/HTTPRequest.php on line 45
Скажите что не так делаю?
Автор: web-junior, 24 декабря 2011 в 15:05
используетПриветствую.
Для корректной работы этого пакета необходимы базовые пакеты PEAR. О том, какие пакеты нужны, я писал в предыдущей статье