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
Популярность: 16%
Интересное из других блогов:
2leep.comИ не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта


Автор: Himik, 21 февраля 2010 в 12:19
используетДавно искал такую тему. Плагины не устраивают. Спасибо.
Автор: tortoiseshell, 23 февраля 2010 в 18:50
используетСпасибо. Очень полезный пост.
А как поведет себя запись если передать не текущую дату, а, скажем, завтрашнюю?
Автор: web-junior, 23 февраля 2010 в 20:51
используетЕсли opt_backdated установлена в true, то запись отобразится немедленно.
Автор: tortoiseshell, 24 февраля 2010 в 12:23
используетСпасибо. Пойду тестить.
Автор: aktualnonews, 28 мая 2010 в 14:33
используетПодскажите, есть ли возможность создавать комментарии на уже имеющиеся посты?
В документации не нашел…
Автор: web-junior, 28 мая 2010 в 15:08
используетВ документации экспорт комментариев описан на этой странице http://www.livejournal.com/doc/server/ljp.csp.export_comments.html
Автор: AleksRyzhov, 1 июня 2010 в 17:57
используетПриветствую! Если переделать ваш скрипт можно ли постить им например в 1000 акков и не получить бан?
Спасибо.
Автор: web-junior, 3 июня 2010 в 17:51
используетЗдравствуйте!
Честно говоря, это по большей части зависит от того как вы переделаете скрипт и от того, насколько жесткая политика банов livejournal
Автор: Игорь, 5 июня 2010 в 15:29
используетменя интересует item id , как его получить, если я хочу модифицировать запись.
Вот что я получаю при создании записи… если я её хочу изменять, то itemid у меня есть и все отлично
itemid=43
anum=220
url=http://**.livejournal.com/11228.html
НО
мне понадобится изменить запись зная только её ссылку… это можно осуществить?
И зачем нужен параметр anum? (если не секрет)
Автор: web-junior, 10 июня 2010 в 10:53
используетскорее всего при изменении записи нельзя обойтись без itemid.
anum – аутентификационный номер, который был создан для записи
Автор: WebSeoLife, 7 июля 2010 в 00:58
используетА как в друзья добавить, подскажи.
Автор: web-junior, 11 июля 2010 в 12:50
используетДля добавления в друзья (а также удаления или изменения) нужно вызывать процедуру editfriends
Автор: WebSeoLife, 20 июля 2010 в 18:17
используетСпасибо большое, буду пробыват работать с ней
Автор: WebSeoLife, 12 августа 2010 в 18:48
используетА не подскажещь что там такое, не как понять не могу:
username
test
password
вот test это зачем нужно?
Автор: WebSeoLife, 12 августа 2010 в 18:55
используетВот так верней
<value><struct>
<member><name>username</name>
<value><string>test</string></value>
</member>
<member><name>password</name>
вот что такое <value><string>test</string></value>
Зачем оно, не как не пойму (
Автор: web-junior, 14 августа 2010 в 10:44
используеттэг value содержит в себе значение передаваемых данных. Тэг string – указывает на тип передаваемых данных, а test – это собственно данные
Автор: borN_free, 19 июля 2010 в 18:08
используетДобрый день. По нуждам работы надо постить программно в liveinternet. Интерфейса xml-rpc там я не нашел, но поддержка LJ flat API вроде как есть? Был ли опыт у вас постинга (а мне надо изменение постов) на ли.ру?
Буду рад любому совету. Спасибо
Автор: web-junior, 22 июля 2010 в 10:18
используетЗдравствуйте.
К сожалению опыта работы с li.ru у меня не было. Могу вам посоветовать внимательно читать API ли.ру и постить в соответствии с ним.
Автор: borN_free, 22 июля 2010 в 10:40
используетПолучилось постить, там API metaWeblog. Может был с diary.ru или blogs.mail.ru или ya.ru опыт? там все не так просто (
Автор: web-junior, 22 июля 2010 в 11:05
используетнет, к сожалению, пока что такого опыта у меня не было.
Автор: BoB, 21 июля 2010 в 13:44
используетА как комментарии постить через PHP курлом? Уже все перепробовал. Никак не получается. Подскажите.
Автор: web-junior, 22 июля 2010 в 10:08
используетПостить комментарии в LJ с помощью XML-RPC кажется невозможно.
Автор: BoB, 22 июля 2010 в 10:33
используетТак и курлом никак сделать не получается. Не пробовали?
Автор: web-junior, 22 июля 2010 в 10:36
используетнет, к сожалению, не пробовал.