Zennoposter + Wordpress = XMLRPC || ✔2GIS Parser в ZennoPoster

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Реакции
1 269
Баллы
113
Добрый день, друзья!) Как всегда приготовил для вас отличную, красиво оформленную и хорошо читабельную статью. Сразу говорю - никаких CPA, арбитража и прочих непонятных слов сегодня не будет). Речь сегодня пойдет о работе в Wordpress CMS. Что это за cms думаю нет смысла объяснять. Много раз этот вопрос поднимался на форуме, но любители извращений так и работают с WP с помощью GET -POST запросов :D (Хотя мы тоже будем юзать post-запросы, но будем это делать кошерно ))) )
Worpdress в большинстве случаев предоставляет нам доступ по протоколу XMLRPC. Для тех кто в танке https://ru.wikipedia.org/wiki/XML-RPC. Чтобы эта служба работала нужно его включить на сайте.
Вот здесь показано как это сделать.

http://abrudtkuhl.github.io/WordPressSharp/ Вот домашняя страница проекта.
L21LWXyiznlPmX.jpg

Верхний архив можно и не качать. Я скомпилировал в библиотку.
Качаем эту либу http://rghost.ru/8HnvKKZfd
Копируем библиотеку WordPressSharp.dll в папку ExternalAssemblies. Если этой папки нет - то создайте.

Далее добавляем компонент Ссылки из GAC и делаем как на скриншоте
9TYFo3.jpg

Добавляем компонент Директивы Using и добавляем два пространства имен
C#:
Развернуть Свернуть Копировать
using WordPressSharp;
using WordPressSharp.Models;

dTM2pC.jpg

Добавляем компонент C# код и начинаем кодить

C#:
Развернуть Свернуть Копировать
 // Настройки
            WordPressSiteConfig wordPressSiteConfig = new WordPressSiteConfig();
            wordPressSiteConfig.BaseUrl = "http://www.ru/xmlrpc.php"; // Путь к xmlrpc
            wordPressSiteConfig.Username = "login";   // Логин
            wordPressSiteConfig.Password = "pass"; // Пароль
            wordPressSiteConfig.BlogId = 1;

            using (var client = new WordPressClient(wordPressSiteConfig))
            {
                var post = new Post
                {
                    PostType = "post", // "post" или "page"
                    Title = "Заголовок",
                    Content = "Контент записи, <p> А тут html код)</p>",
                    PublishDateTime = DateTime.Now, // Дата публикации
                    Status = "publish" // "draft" или "publish" (draft это черновик)
                };

                var id = Convert.ToInt32(client.NewPost(post)); // ID поста
            }
Вуаля!)
GE9F6C.jpg

Теперь включаем логику и думаем - зачем здесь переменная ID? Правильно!) Мы можем добавить комментарий к статье. Итак...
C#:
Развернуть Свернуть Копировать
WordPressSiteConfig wordPressSiteConfig = new WordPressSiteConfig();
            wordPressSiteConfig.BaseUrl = "http://www.ru/xmlrpc.php"; // Путь к xmlrpc
            wordPressSiteConfig.Username = "login";   // Логин
            wordPressSiteConfig.Password = "pass"; // Пароль
            wordPressSiteConfig.BlogId = 1;

            using (var client = new WordPressClient(wordPressSiteConfig))
            {
                var post = new Post
                {
                    PostType = "post", // "post" или "page"
                    Title = "Заголовок",
                    Content = "Контент записи, <a> А тут html код)</a>",
                    PublishDateTime = DateTime.Now, // Дата публикации
                    Status = "publish" // "draft" или "publish" (draft это черновик)
                };

                var id = Convert.ToInt32(client.NewPost(post)); // ID поста
                var comment = new Comment();
                comment.PostId = id.ToString(); // ID записи
                comment.Author = "Radzhab";   // Автор
                comment.AuthorEmail = "zennolab@mail.com"; // Почта
                comment.AuthorIp = "127.0.0.1";  // IP
                comment.Content = "Здесь был комментарий"; // Комментарий
                comment.DateCreated = DateTime.Now.AddHours(1); // на час позже добавляем.
                                                                // чтобы без палева)
                client.NewComment(comment);
            }
Отлично. Идем дальше. Часто возникает необходимость добавить миниатюру к посту
C#:
Развернуть Свернуть Копировать
....
string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/CorporationParkGoose.JPG/530px-CorporationParkGoose.JPG";
                var featureImage = Data.CreateFromUrl(url);
                post.FeaturedImageId = client.UploadFile(featureImage).Id;
                var id = Convert.ToInt32(client.NewPost(post)); // ID поста
IjALZ7.jpg

Друзья. Если возникнут еще вопросы - буду рад ответить в теме.
ps Архив http://rghost.ru/8sGtrHM92
 
Номер конкурса статей
  1. Третий конкурс статей
Тема статьи
  1. Парсинг

Вложения

  • wp.rar
    wp.rar
    25,4 KB · Просмотры: 1 128
Последнее редактирование модератором:
Решил выложить на всенародное достояние шаблон парсера 2gis. Изначально писал в Visual Studio, но потом решил портировать в ZP. Было очень много подводных камней, поэтому думаю данный шаб поможет тем разработчикам, которые будут работать с элементами формы. В программе я использовал три контрола - Listview, Treeview и Button. Обычные http get запросы, работа с регулярками, использование делегатов, событий и т.д. Огромная кладезь для начинающих разрабов. Ниже опишу некоторые из них.

Делегаты
Цитировать статьи с msdn не вижу смысла. Лучше расскажу как легче всего запомнить для чего они нужны)
nAyzYbVcaWybrZ.jpg


Что делает данная функция? Правильно. Суммирует два числа. А как использовать этот метод?
C#:
Развернуть Свернуть Копировать
int rezult = Summa(2,3); // Результат 5

Идем далее.
J2be4D7CgvxJm6.jpg

Данный метод принимает на вход один параметр. Имя. И ничего не возвращает (void как бы намекает). Просто заносит данные в переменную str. А как вызвать?
C#:
Развернуть Свернуть Копировать
Hello("Radzhab");

Что в итоге. Есть два типа функций - функции которые возвращают значение и функции которые ничего не возвращают. Что будет если мы вставим верхние куски кода в ZP? Правильно) Она ругнется.
Давайте просуммируем два числа в контексте ZennoPoster с помощью делегатов. Мы будем использовать два типа делегатов Func и Action.
1) Func возвращает значение
2) Action НЕ возвращает значение

C#:
Развернуть Свернуть Копировать
Func<int,int> Summa;

        Summa  = (x,y)=>{
           return x+y;
        };

var result = Summa(2,3); // Результат 5

C#:
Развернуть Свернуть Копировать
Action<string> Hello;
Hello  = (name)=>{
    var result = "Привет! "+ name;
};

Hello("Radzhab");

Теперь где я использую эти делегаты в реальных условиях.
Я получаю html код страницы с помощью делегата Func. Надеюсь из скриншота все будет ясно.
5c62dbf48b.jpg

А теперь посмотрим как добавляются данные в Listbox.
c079a06978.jpg

Как видите, можно на вход и не передавать никаких параметров, но суть от этого не меняется. cityInit ничего не возвращает. Он добавляет данные в Listbox.

События для контролов (Button, Treeview...)

Выделение нод в TreeView

C#:
Развернуть Свернуть Копировать
catTree.AfterCheck += (o, t) =>
        {
            foreach (TreeNode treeSubNode in t.Node.Nodes)
            {
                treeSubNode.Checked = t.Node.Checked;
            }
        };

Событие нажатия кнопки
C#:
Развернуть Свернуть Копировать
startButton.Click += (o,t) =>{

};

Регулярные выражения

Данный код преобразует все совпадения в регулярке в новый экземпляр List
C#:
Развернуть Свернуть Копировать
 var phones =
            Regex.Matches(bphones, "(?<=text\":\").+?(?=\")")
                .Cast<Match>()
                 .Select(m => m.Value)
                 .ToList();

Регулярка в регулярке)))
C#:
Развернуть Свернуть Копировать
 MatchCollection matchs =
              Regex.Matches(Regex.Match(words[i], "rubrics\":\\[(.*?)\\]").Groups[1].Value,
                                       "(?<=name\":\").+?(?=\")");
Сохранение файла в формате csv

C#:
Развернуть Свернуть Копировать
  saveData = (sdata) =>
                {
                    using (var w = new StreamWriter("D:\\data.csv", false, Encoding.GetEncoding(1251)))
                    {
                        for (int i = 0; i < sdata.Count; i++)
                        {
                            var id = sdata[i].id;
                            var name = sdata[i].name;
                            var city = sdata[i].city;
                            var address = sdata[i].address;
                            var mail = sdata[i].mail;
                            var site = sdata[i].site;
                            var num1 = sdata[i].numberone;
                            var num2 = sdata[i].numbertwo;
                            var num3 = sdata[i].numberthree;
                            var rubrica = sdata[i].rubrica;
                            var podrubrica = sdata[i].podrubrica;
                            var line = string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10}", id, name, city,
                                address, mail, site, num1, num2, num3, rubrica, podrubrica);
                            w.WriteLine(line);
                            w.Flush();
                        }
                    }
                    MessageBox.Show("Экспорт завершен", "Успешно", MessageBoxButtons.OK);
                };
Друзья. Парсинг номеров и почт убрал дабы чего бы не было. Статья для того чтобы увидеть на что способна зеннка, а не для спама почт организаций. Спасибо за понимание и внимание)
Если возникнут еще вопросы по коду - задавайте вопросы в теме.
 

Вложения

  • 2g.rar
    2g.rar
    181,5 KB · Просмотры: 959
Radzhab давай финальную, инстаграм))
 
могу лично купить проект, знаю что ты это осилишь
 
как всегда на высоте, однозначно +
 
  • Спасибо
Реакции: Radzhab
Thanks for article I appreciate it, but please follow the rules:

Все файлы и картинки, входящие в статью, должны хоститься на форуме в сообщении, а не на сторонних image и file хостингах.

Thanks
 
Как заливать картинки в content через xml-rpc ?
Например 3 изображения.
html теги пихни в контент.
C#:
Развернуть Свернуть Копировать
var post = new Post
                {
                    PostType = "post", // "post" или "page"
                    Title = "Заголовок",
                    Content = "Контент записи, <p><img src="http://htmlbook.ru/images/logo.gif" width="450" height="450" alt=""></p>",
                    PublishDateTime = DateTime.Now, // Дата публикации
                    Status = "publish" // "draft" или "publish" (draft это черновик)
                };
 
  • Спасибо
Реакции: iulius
Это очевидно, но перед тем как это делать, необходимо фотки через FTP заливать, так вот вопрос заключается в том - можно ли избежать заливки через FTP и заливать их с локального компьютера через xml-rpc?
 
А обновлять уже существующие и опубликованные записи тоже можно?
 
  • Спасибо
Реакции: LightWood
Мне непонятен один момент. При чем тут зенно? Я делал автозаполнение сайтов на задолго до того как узнал что такое зенно, до сих пор один сайтец денюжку приносит. Зенно в качестве площадки для запуска C# кода использовать несколько странно, на мой взгляд, если не использовать другие его фишки или использовать по минимуму
 
  • Спасибо
Реакции: Zmaster и alex61
Мне непонятен один момент. При чем тут зенно? Я делал автозаполнение сайтов на задолго до того как узнал что такое зенно, до сих пор один сайтец денюжку приносит. Зенно в качестве площадки для запуска C# кода использовать несколько странно, на мой взгляд, если не использовать другие его фишки или использовать по минимуму
Ну так это только пример упрощения постинга, а вот где и как брать контент, как его обрабатывать - это уже тема для других конкурсов.
 
  • Спасибо
Реакции: Radzhab
Мне непонятен один момент. При чем тут зенно? Я делал автозаполнение сайтов на задолго до того как узнал что такое зенно, до сих пор один сайтец денюжку приносит. Зенно в качестве площадки для запуска C# кода использовать несколько странно, на мой взгляд, если не использовать другие его фишки или использовать по минимуму
Вижу два основных плюса
1) Софт написанный или портированный в ZP никогда не взломают и он не утечет в паблик (имхо). Для меня и для многих кодеров которые сперва научились кодить, а потом увидели Зеннопостер использование форм дает очень много преимуществ. Я могу сперва написать программу в Visual Studio, отладить ее и спокойно портировать в ZP. Тем более в последней версии это намного проще чем раньше.
2) Теперь Wordpress. Я показал людям что можно не используя браузер делать запросы к WP. Этот вопрос много раз поднимался на форуме, но новички так и не найдя ответя уходили. Кто то уходил к Лексу за денежным решением проблемы, кто то так и постил через гет-пост запросы.

Да. В этот раз не было темы про то как заработать бабки) Но я дал технологии. Показал как их заюзать.

MAj0zbKH1XlQme.jpg

RmzXYbWtjJ4EAO.jpg

v29QOXZHRkax2G.jpg




ps Я даже сперва разместил объяву у себя в группе что хочу сделать многофункциональный шаб для работы в ZP. Но, увы) Мало кто откликнулся. Так что тема актуальна)
 
  • Спасибо
Реакции: LmPopo
Да уж, вот это велосипед. Я так понял аффтор учится программировать на c#.

Работать через XML-RPC WordPress API долго. Если тебе нужно спарсить с двагигс(а там реально дофига данных) и потом через XML-RPC WordPress API залить на сайт, ты будешь делать это очень долго + обрыв конекта и все такое. На мой взгляд целесообразней:

1. Либо пиши напрямую в базу вордпересс.
2. Либо использую импорт в вордпрессе(есть там такая фитча).

Регулярками давно никто не парсит. Попробуй использовать htmlagilitypack + делегаты здесь нужны как собаке пятая нога.
И еще, если ты пишешь на .net, зачем тебе Wordpress? Да возьми ты движок на .net и кастомизируй его, что бы все было в одной коробке и автоматически: сам парсит, сам публикует, а тебе только об ошибках на почту шлет письма.
 
  • Спасибо
Реакции: bigshark, zortexx и AlisaZ
)) Уважаемый, ваши комментарии тут излишне. 2gis и Wordpress это абсолютно разные статьи, которые админы объединили в один.
По поводу htmlagilitypack. Какой htmlagilitypack для JSON :D. Столько воздуха. Раздражают такие мемы.

2gis парсер был написан 2 года назад. Недавно я вспомнил о нем, запускаю - а он не пашет. Отснифав запросы в 2gis я увидел что поменялся только один параметр, изменил его и все заработало)). Потом я портировал все в ZP. И использовал делегаты только для того чтобы показать как оно работает, мне проще было все запихнуть в библиотеку и вызывать в одну строчку в ZP. Я использовал десериализацию только в одном месте, и только потому что оно там нужно было. В других местах я захотел использовать регулярки. Какие проблемы Митрондил?*
 
  • Спасибо
Реакции: durovino943
Митрондил, похоже, под крокодилом писал ответ к статье :D Сразу видно, в суть не въехал, а ум зашкаливает, даёт советы. За статью плюс!;)
 
  • Спасибо
Реакции: Greez, Wide и Radzhab
))
По поводу htmlagilitypack. Какой htmlagilitypack для JSON :D.*
Вот этот допустим -
"
Regex.Matches(bphones, "(?<=text\":\").+?(?=\")")
.Cast<Match>()
.Select(m => m.Value)
.ToList();"

По поводу json - джсон вообще не парсят есть спец либа для работы с ним. Самое важное - я не переходил на личность. Дал тебе советы как не писать костыли и изобретать велосипеды.
Суть конкурса раскрывать способности zenno, а не писать говнокод и рассказывать что такое указатели на функцию.
 
  • Спасибо
Реакции: Azakim
json - джсон вообще не парсят есть спец либа - я отписал выше что единожды использовал десериализацию, так как в других местах невалидный json. И здесь никакая либа не поможет.Суть конкурса раскрывать способности zenno - покажи мастеркласс) Может научимся чему-нибудь

Я всегда отношусь положительно к конструктивной критике. Ключевое слово "конструктивная". Ладно, думаю дальше нет смысла вести этот диалог.
 
json - джсон вообще не парсят есть спец либа - я отписал выше что единожды использовал десериализацию, так как в других местах невалидный json. И здесь никакая либа не поможет.Суть конкурса раскрывать способности zenno - покажи мастеркласс) Может научимся чему-нибудь

Я всегда отношусь положительно к конструктивной критике. Ключевое слово "конструктивная". Ладно, думаю дальше нет смысла вести этот диалог.
Бла-бла-бла. Снова не о чем. Я тебе написал конструктивные проблемы:) твоего мопеда. Ладно все практикуй .net, мастерклассса не будет :)
 
Ключевое слово "джсон вообще не парсят, есть специальная либа". Т.е. мы должны обязывать себя в создании дополнительных накладных расходов в виде отдельной библиотеки для таких простых сценариев, как вышеприведенный? Это есть хорошая практика? По поводу раскрытия способностей программы - они раскрываются, нет? Тут "даже" описывается реализаыия возможности, которую программа, сама по себе, не реализует. А что по поводу "говнокода" - говно пока тут только критика, а вышеприведённых код с примерами (использование делегатов, и все такое), были представлены автором как есть.
 
  • Спасибо
Реакции: Wide, zennoX и Radzhab
Я бы с удовольствием отредактировал, но у меня нет прав на изменение поста. Яотписал одному из админов. Тишина
 
  • Спасибо
Реакции: Radzhab
1. Либо пиши напрямую в базу вордпересс.
2. Либо использую импорт в вордпрессе(есть там такая фитча).

Как человек съевший несколько собак на вордпрессах, добавлю, что целесообразнее все же (хотя и медленнеe) использовать WP API, нежели wp-db class. На бложиках по 100-500 записей незаметно, на больших сайтах с разными таксономиями вылезают косяки в будущем, да и тупо запаришься писать инсерты.
 
  • Спасибо
Реакции: Hannes и Radzhab
Radzhab
спасибо за статью.
поясни пожалуйста суть работы шаблона.
Скачал. Запустил в projectmaker
добавил компонент Ссылки из GAC
добавил компонент Директивы Using и добавил два пространства имен.
далее насколько я понимаю первый блок с C#кодом должен при заполнении пути, лога и паролей постить статьи на сайт.
Но у меня не хочет) Пишет действие не выполнено. Куда копать?
Сайт тестовый на локальном компе. WP 4 XMLRPC как я понимаю включен по умолчанию.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)