Автопостинг в WordPress с XML-RPC и ZennoPoster

Сегодня поделюсь своим C# сниппетом ZennoPoster для удаленного постинга в WordPress  с помощью XML-RPC.

На самом деле, для этого существуют специальные библиотеки, но у меня завести их так и не получилось. Может руки кривые или либа не рабочая — не знаю. Однако почитав информацию по стандарту XML-RPC и проглядев примеры реализаций на php, у меня появилась кое-какая информация для начала работы.

ДИСКЛЕЙМЕР

Я писал этот код еще когда был совсем-совсем зеленым в c#, потому он такой громоздкий и некрасивый. Сейчас я понимаю, что конвертировать в нужный формат можно гораздо проще. А в идеале, я бы воспользовался готовой библиотекой, чтобы не изобретать велосипед. Но и это решения я удалять не хочу, так как оно неплохо должно подойти совсем новичкам.

Приступаем.

XML-RPC принимает POST-запросы. Уже хорошо, значит сможем обойтись без выкрутасов. Осталось определиться с тем, в каком формате данные. На замечательнейшем сайте stackoverflow.com был найден хороший код на php. Смотрим, анализируем и убираем лишнее.

cat test.php 
<?
$content = array(
'post_type' => 'post',
'post_content' => 'This is the post content',
'post_title' => 'This is the post title',
'post_name' => 'testpost',
'post_thumbnail' => 'http://img.dni.ru/binaries/v2_articlepic/792413.jpg',
'terms' => array('category' => array( 'Top News' ) ),
);
// parameters are blog_id, username, password and content
$params = array(1, 'login', 'password', $content);
$params = xmlrpc_encode_request('wp.newPost', $params);
var_dump ($params);
?>

 

Здесь я уже убрал все лишнее: нам не нужно постить, только посмотреть какие данные передаются, потому как их надо обработать xmlrpc_encode_request, коего нет в C#. Выполняем

php test.php 
string(1382) "<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.newPost</methodName>
<params>
<param>
<value>
<int>1</int>
</value>
</param>
<param>
<value>
<string>login</string>
</value>
</param>
<param>
<value>
<string>password</string>
</value>
</param>
<param>
<value>
<struct>
<member>
<name>post_type</name>
<value>
<string>post</string>
</value>
</member>
<member>
<name>post_content</name>
<value>
<string>This is the post content</string>
</value>
</member>
<member>
<name>post_title</name>
<value>
<string>This is the post title</string>
</value>
</member>
<member>
<name>post_name</name>
<value>
<string>testpost</string>
</value>
</member>
<member>
<name>post_thumbnail</name>
<value>
<string>http://img.dni.ru/binaries/v2_articlepic/792413.jpg</string>
</value>
</member>
<member>
<name>terms_names</name>
<value>
<struct>
<member>
<name>category</name>
<value>
<array>
<data>
<value>
<string>Top News</string>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
"

как видим, ничего сложного. Берем этот код и сохраняем.

ZennoPoster

Мне очень захотелось сделать все одним кубиком, поэтому используем только C#, хотя при желании можно сделать и на кубиках замены текста, запросов и т.д..

ВАЖНО! Не забываем заменить спецсимволы

Ну и не буду томить, вот сам сниппет

string login, password, url, title, keywords, content, data, name, cats, img;
//логин
login = project.Variables["b_login"].Value.Trim();
//пароль
password = project.Variables["b_password"].Value.Trim();
//адрес интерфейса
url = "https://"+project.Variables["b_domain"].Value.Trim()+"/xmlrpc.php";
//тайтл записи
title = project.Variables["p_title"].Value.Trim();
//картинка записи
img = project.Variables["p_img"].Value.Trim();
//в какую категорию постить. если такой нет - то будет создана
cats = project.Variables["p_category"].Value.Trim();
content = project.Variables["p_content"].Value;
//заменяем спецсимволы
content = content.Replace("&","&amp;").Replace("\"","&quot;").Replace("\'","&apos;").Replace("<","&lt;").Replace(">","&gt;");
//формируем данные для передачи
data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>wp.newPost</methodName><params> <param><value> <int>1</int></value> </param> <param><value> <string>"+login+"</string></value> </param> <param><value> <string>"+password+"</string></value> </param> <param><value> <struct><member> <name>post_type</name> <value><string>post</string> </value></member><member> <name>post_content</name> <value><string>"+content+"</string> </value></member><member> <name>post_title</name> <value><string>"+title+"</string> </value></member><member><name>post_status</name><value><string>publish</string></value></member><member><name>terms_names</name><value><struct><member><name>category</name><value><array><data><value><string>"+cats+"</string></value></data></array></value></member></struct></value></member></struct></value> </param></params></methodCall>";
//выполняем запрос
var resultHttpPost = ZennoPoster.HttpPost(url, data , "text/xml", "", "utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
return resultHttpPost;

Ну вроде бы все просто и надежно. На выходе получаем XML ответ с результатом: там или индекс поста или код ошибки. Но у меня работает хорошо.

6 Replies to “Автопостинг в WordPress с XML-RPC и ZennoPoster

  1. Привет,

    Спасибо за код! Но что-то картинки не заливаються! Добавил в data еще post_thumbnail»+img+», но перестало создавать пост! Не поможешь?

    И как вообще после того как залилась картинка, вставить ее в нужный код? Допустим у меня уже есть готовый текст для поста вида:

    текст

    в src=»» какой урл добавить после заливки?

    Еще кстати не знаешь как можно обновлять посты?

    Спасибо!

    1. я немного по-другому сделал:
      в контенте ставил тэг img с путем до картинки (ее можно залить куда угодно, например на имгур), на цмс ставил два плагина: один автоматом подтягивал все внешние картинки, второй автоматом создавал миниатюры из первой картинки поста.
      А по поводу изменений, там сложнее: нужно в начале получить айди поста, и потмо уже с ним манипулировать. Давно это было, так сходу не скажу.

  2. Здравствуйте! Самое банальное можно написать клиент для WordPress. Я правда такими никогда не пользовался, меня веб-интерфейс WP более чем устраивает.

  3. благодарю автора за ценный снипет. Но к сожалению тут так и не реализовано добавление картинок.
    И я так понимаю что именно из-за них и подключаются всевозможные библиотеки.
    Пожалуйста добавьте снимет добавления картинок в эти статьи

    1. Хм…возможно, ближайшее время появится такое: у самого возникла необходимость. Так что ждите)

Добавить комментарий для behemoth Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *