XML-RPC в блоголёте
30.03.2009Блоголётом можно управлять из любого блогклиента. Есть два адреса для блогклиентов - это /rpc.xml и /xmlrpc.php они являются синонимами друг друга и нет никакой разницы к какому из них обращаться. Второй адрес был добавлен для совместимости некоторых блогклиентов, которые прописывают именно такой адрес для xmlrpc сервера, хотя документация по пингбекам утверждает, что адрес xmlrpc сервера необходимо брать из серверного заголовка (значение X-Pingback), а если его там не будет, то в из самого html страницы - в секции head должно быть это самое X-Pingback. В настоящее время блоголёт поддерживает все известные апи для удаленного постинга, но некоторые из методов до конца не протестированы, так как у меня лично отсутствуют инструменты для проверки правильности. Гарантировано сейчас работают апи для wordpress и, metaweblog и movabletype. Но в случае чего могу подправить и другие методы xmlrpc.
В блоголёте xmlrpc сервер устроен следующим образом: есть центральный класс TXMLRPC, который и обслуживает xml запросы. Если вы хотите добавить свои методы к xmlrpc серверу то вы легко это сделаете, привязав имя xmlrpc метода к методу вашего класса, для примера приведу реальный код для metaweblog.newpost, вот две строки из исходника:
$Caller = &TXMLRPC::Instance();
$Caller->Add('metaWeblog.newPost', 'newPost', get_class($this));
Вполне очевидный и понятны код: создаем обработчик xmlrpc и в него добавляем метод, где первый аргумент - это имя xmlrpc функции, второй аргумент - это имя метода в вашем классе, и третий аргумент - собственно имя класса. Можно также добавить не метод класса, а просто функцию, сделав имя класса пустой строкой, но тогда вы должны самостоятельно заботиться о том, чтобы во время обработки xmlrpc запроса php модуль с вашей функцией был загружен. В случае с классом блоголёт сделает все сам самостоятельно - если файл с классом не был загружен, то будет вначале загружен модуль, создан объект - экземпляр вашего класса, после чего вызван соответствующий метод. Такая модель позволяет разгрузить систему - малоиспользуемые модули не будут практически загружаться, а для каждого вызова будет загружаться конкретный обработчик. Очень удобная и эффективная модель.
← Ранее XML-RPC в блоголёте
Комментарии (21) на запись “XML-RPC в блоголёте”
Оставить комментарий
Но не хотят постить в него пока что стандартные блог клиенты..
А то у меня, например, затычка с дистанционным постингом полная!
Сервер возвратил искажённый ответ. Проверьте, что вы правильно ввели имя и адрес API блога.
На счет отладочного модуля - давно хочется быть хоть в чем-то полезным! Жду отладочный модуль!
В вордпрес-блоги нормально постит.
Посмотрел исходники. Для публикации значение параметра publish должно быть установлено в 'publish'. Тогда постит нормально.
Автору: Может стоит сделать как это сделано в вордпресе?
Внутренние значения статуса никак не кореллируются с запросом xmlrpc. А можно получить листинг запросов? Включается директивой
define('debug', true);
в корневом index.php, тогда в data/domain/logs/xmlrpc.txt будут писаться все запросы и ответы
Ну я имел ввиду что параметр publish в xmlrpc запросе должен быть установлен в 'publish'.
Иначе пост уйдет в черновики.
$client->query("metaWeblog.newPost", '0', $login, $password, $content_struct, 'publish')
Насколько я помню - моя проблема решилась довольно просто.
My fault. При формировании RPC-запроса, значение параметра publish передавалось как строка <string>1</string>, а по спецификации - должен быть булев (или целочисленный) тип. Другие движки закрывают глаза на стандарты и нормально принимают строковый параметр, а вот блоголёт ждёт запроса четко по стандартам.
как решить такую проблему создания страниц через протокол XML-RPC: страницы создаются, но ни текста, ни заголовка, ни slug нету на сайте.
Забыл уточнить: ошибка касается имено создания страниц, а постов блога (с которыми проблем нету). Использую такой же запрос как и для ВП. Установил несколько проверок в движке Блоголёта - данные он получает нормально, т.е. "$item->title" правильный, но почему то создаётся пустым.
Копать очень глубоко к сожалению нету времени.