Использование XML-RPC в PHP для публикации материалов в LiveJournal.com (ЖЖ)
Для начала вам потребуется скачать библиотеку XML-RPC. Наиболее удачной версией мне
кажется свободно распространяемая через sourceforge "XML-RPC for PHP":
Все примеры ниже будут приведены для этой библиотеки версии 2.2.
Что же такое XML-RPC? RPC расшифровывается как Remote Procedure Call, соответственно
на русский это можно перевести как удаленный вызов процедур с помощью XML. Сама методика
удаленного вызова процедуры известна давно и используется в таких технологиях,
как DCOM, SOAP, CORBA. RPC предназначен для построения распределенных клиент-серверных
приложений. Это дает возможность строить приложения, которые работают в гетерогенных
сетях, например, на компьютерах различных систем, производить удаленную обработку
данных и управление удаленными приложениями. В частности этим протоколом пользуется
хорошо известный в России сайт livejournal.com.
Рассмотрим пример, как можно разместить кириллическую запись (а именно с этим часто возникают
проблемы) в ЖЖ. Ниже приведен работающий код с комментариями:
<?
/* ваш ник в ЖЖ */
$name = "xxxx";
/* ваш пароль в ЖЖ */
$password = "xxxx";
/* текст который вы хотите опубликовать */
$text = "Некоторый текст";
/* заголовок для текста */
$subj = "Некоторый заголовок";
/* включаем библиотеку XML-RPC */
include("lib/xmlrpc.inc");
/* (!!!) Все денные в ЖЖ хранятся в кодировке Unicode,
используем и в нашем случае такую же кодировку */
$xmlrpc_internalencoding = 'UTF-8';
/* Получаем текущее время */
$date = time();
$year = date("Y", $date);
$mon = date("m", $date);
$day = date("d", $date);
$hour = date("G", $date);
$min = date("i", $date);
/* (!!!) Конвертируем текст из одной кодировки в UTF-8
в данном случае файл хранится в кодировке CP1251 */
$text = iconv("CP1251", "UTF-8", html_entity_decode($text));
$subj = iconv("CP1251", "UTF-8", html_entity_decode($subj));
/* заполняем массив с необходимыми переменными */
$post = array(
"username" => new xmlrpcval($name, "string"),
"password" => new xmlrpcval($password, "string"),
"event" => new xmlrpcval($text, "string"),
"subject" => new xmlrpcval($subj, "string"),
"lineendings" => new xmlrpcval("unix", "string"),
"year" => new xmlrpcval($year, "int"),
"mon" => new xmlrpcval($mon, "int"),
"day" => new xmlrpcval($day, "int"),
"hour" => new xmlrpcval($hour, "int"),
"min" => new xmlrpcval($min, "int"),
"ver" => new xmlrpcval(2, "int")
);
/* на основе массива создаем структуру */
$post2 = array(
new xmlrpcval($post, "struct")
);
/* создаем XML сообщение для сервера */
$f = new xmlrpcmsg('LJ.XMLRPC.postevent', $post2);
/* описываем сервер */
$c = new xmlrpc_client("/interface/xmlrpc", "www.livejournal.com", 80);
$c->request_charset_encoding = "UTF-8";
/* по желанию смотрим на XML-код того что отправится на сервер */
echo nl2br(htmlentities($f->serialize()));
/* отправляем XML сообщение на сервер */
$r = $c->send($f);
/* анализируем результат */
if(!$r->faultCode())
{
/* сообщение принято успешно и вернулся XML-результат */
$v = php_xmlrpc_decode($r->value());
print_r($v);
}
else
{
/* сервер вернул ошибку */
print "An error occurred: ";
print "Code: ".htmlspecialchars($r->faultCode());
print "Reason: '".htmlspecialchars($r->faultString())."'\n";
}
?>
В данном примере рассмотрен только один метод LJ.XMLRPC.postevent - полный список
возможных команд и их синтаксис (на английском языке) доступен по адресу:
http://www.livejournal.com/doc/server/ljp.csp.xml-rpc.protocol.html