Постинг сообщений в Wordpress блоги

Автоматизация постинга в Wordpress блоги

  1. Support Денис
    Думаю многим знакомо такое монотонное и скучное занятие как постинг,а так как самому этого делать не хочется, то давайте попробуем автоматизировать этот процесс с помощью A-Parser.
    Теперь определимся какой движок для эксперимента мы выберем.
    На сайте http://www.ratingruneta.ru/cms/ есть раздел с рейтингом cms.
    Как видим лидером рейтинга open-source cms является Wordpress. Ну что же, кандидата для испытаний мы выбрали ;).

    [​IMG]
    В Wordpress имеются API, которые мы будем использовать для автоматизации постинга. С документацией по этой технологиии вы можете ознакомиться по ссылке .
    Как видно из документации метод wp.newpost отправляет XML по адресу: https://site.com/xmlrpc.php.
    Теперь стоит определиться кто падет "жертвой" наших испытаний. Дабы не вызывать праведного гнева модераторов ресурсов, было принято решения создать свой блог на сайте wordpress.com
    Учитывая то, что некоторые владельцы ресурсов отключают возможность работать с xmlrpc, либо попросту переименовывают этот файл, давайте напишем метод который проверяет существование xmlrpc.php.
    Код:
     //Метод класса который проверяет существует ли xmlrpc.php
        * XmlrpcExist(set) {
            let responce = yield this.request('GET', set.query + 'xmlrpc.php', {}, {
                parsecodes: {
                    405: 1,
                    404: 1,
                }
            });
            //Если получаем успешный ответ, значит файл есть
            if (responce.headers.Status == 405){
                this.logger.put(responce.data);
                return true;
            }
            return false;
        }
    Мы отлавливаем ответ на 405 код потому как это значит, что файл есть и принимает он запросы другим методом. Как видно из кода мы отправляли GET запрос.
    Теперь давайте определим какой структуры должен быть XML, который мы будем отправлять на сервер. После нескольких часов поиска был найден такой вот пример
    <?xml version="1.0"?>
    <methodCall>
    <methodName>wp.newPost</methodName>
    <params>
    <param>
    <value>
    <string>Blog id</string>
    </value>
    </param>
    <param>
    <value>
    <string>login</string>
    </value>
    </param>
    <param>
    <value>
    <string>password</string>
    </value>
    </param>
    <param>
    <value>
    <struct>
    <member>
    <name>post_content</name>
    <value>
    <string>&lt;a href="http://securereader.guardianproject...-B656-A4635C0F530D-56160-0000990E96BAC672.jpg"&gt;Enclosure Link&lt;/a&gt;</string>
    </value>
    </member>
    <member>
    <name>enclosure</name>
    <value>
    <struct>
    <member>
    <name>url</name>
    <value>
    <string>http://securereader.guardianproject...-B656-A4635C0F530D-56160-0000990E96BAC672.jpg</string>
    </value>
    </member>
    <member>
    <name>type</name>
    <value>
    <string>image/jpeg</string>
    </value>
    </member>
    <member>
    <name>length</name>
    <value>
    <i4>1584</i4>
    </value>
    </member>
    </struct>
    </value>
    </member>
    <member>
    <name>post_title</name>
    <value>
    <string>Test Enclosure</string>
    </value>
    </member>
    <member>
    <name>post_status</name>
    <value>
    <string>publish</string>
    </value>
    </member>
    </struct>
    </value>
    </param>
    </params>
    </methodCall>
    Нам нужно чтобы пользователь мог ввести идентификатор блога, логин и пароль, а также название поста и сам пост. Давайте реализуем такую возможность.
    Код:
     this.editableConf = [
                ['TitlePost', ['textfield', 'Post title']],
                ['TextPost', ['textfield', 'Text Post']],
                ['IdBlog', ['textfield', 'Id blog']],
                ['login', ['textfield', 'Login']],
                ['password', ['textfield', 'Password']],
            ];
    Выглядеть это будет так
    [​IMG]

    Теперь когда мы получили все данные давайте приступим к формированию XML и отправке его на сервер
    Код:
      * parse(set, results) {
            this.logger.put("Start scraping query: " + set.query);
            let res = yield* this.XmlrpcExist(set);
            if (res) {
                if (this.conf.IdBlog != 1 || this.conf.login != 'none' || this.conf.password != '') {
                    //Формируем xml  с параметрами
                    let xml = '<?xml version="1.0"?><methodCall><methodName>wp.newPost</methodName><params><param><value><string>' + this.conf.IdBlog + '</string></value></param><param><value><string>';
                    xml += this.conf.login + '</string></value></param><param><value><string>' + this.conf.password + '</string>';
                    xml += '</value></param><param><value><struct><member><name>post_content</name><value>' + this.conf.TextPost + '</value></member> ';
                    xml += ' <member><name>post_title</name><value><string>' + this.conf.TitlePost + '</string></value></member><member>            <name>post_status</name>            <value>              <string>publish</string>            </value>          </member>        </struct>      </value>    </param>  </params></methodCall>';
                    //Делаем запрос используя Net::HTTP
                    let response = yield this.parser.request('Net::HTTP', 'default', {
                        'body': xml,
                        'method': 'POST'
                    }, set.query + 'xmlrpc.php');
                    if (response.info.success) {
                        //Если пришел ответ с ошибкой
                        let matches = response.data.match(/faultCode<\/name>\s+<value><int>(\d+)[\s\S]+?faultString<\/name>\s+<value><string>([^<]+)/);
                        if (matches) {
                            //То выводим её в результат
                            results.error = matches[1] + ' ' + matches[2];
                        } else {
                            results.error = 'Succesfull';
                        }
    
    
                    }
    
     
                } else {
                    this.logger.put('Empty fields');
                }
            } else {
                results.error = 'xmlrpc.php not found';
            }
            results.success = res.success;
    
                    return results;
        }
    Проверяем результат.

    [​IMG]

    Пост есть.
    Удачного постинга ! )
    Скачать парсер вы можете в нашем каталоге по этой ссылке
    Sobesednic и vadim4uk нравится это.