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

Radzhab

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

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

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

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

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

Добавляем компонент 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 поста
            }
Вуаля!)

Теперь включаем логику и думаем - зачем здесь переменная 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 = "[email protected]"; // Почта
                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 поста

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

Вложения

  • 25,4 КБ Просмотры: 714

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование модератором:

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 495
Благодарностей
1 193
Баллы
113
Решил выложить на всенародное достояние шаблон парсера 2gis. Изначально писал в Visual Studio, но потом решил портировать в ZP. Было очень много подводных камней, поэтому думаю данный шаб поможет тем разработчикам, которые будут работать с элементами формы. В программе я использовал три контрола - Listview, Treeview и Button. Обычные http get запросы, работа с регулярками, использование делегатов, событий и т.д. Огромная кладезь для начинающих разрабов. Ниже опишу некоторые из них.

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


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

Данный метод принимает на вход один параметр. Имя. И ничего не возвращает (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. Надеюсь из скриншота все будет ясно.

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

Как видите, можно на вход и не передавать никаких параметров, но суть от этого не меняется. 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);
                };
Друзья. Парсинг номеров и почт убрал дабы чего бы не было. Статья для того чтобы увидеть на что способна зеннка, а не для спама почт организаций. Спасибо за понимание и внимание)
Если возникнут еще вопросы по коду - задавайте вопросы в теме.
 

Вложения

  • 181,5 КБ Просмотры: 665

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 392
Благодарностей
1 963
Баллы
113
Radzhab давай финальную, инстаграм))
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 392
Благодарностей
1 963
Баллы
113
могу лично купить проект, знаю что ты это осилишь
 

Master Woo

Client
Регистрация
06.12.2014
Сообщения
123
Благодарностей
123
Баллы
43
как всегда на высоте, однозначно +
 
  • Спасибо
Реакции: Radzhab

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 207
Благодарностей
991
Баллы
113
Thanks for article I appreciate it, but please follow the rules:

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

Thanks
 

duksa

Client
Регистрация
18.12.2011
Сообщения
40
Благодарностей
3
Баллы
8

surrealmix

Client
Регистрация
07.03.2013
Сообщения
720
Благодарностей
398
Баллы
63
Content ="Контент записи, <p> А тут html код)</p>"
Как заливать картинки в content через xml-rpc ?
Например 3 изображения.
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 495
Благодарностей
1 193
Баллы
113
Как заливать картинки в 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

surrealmix

Client
Регистрация
07.03.2013
Сообщения
720
Благодарностей
398
Баллы
63
Это очевидно, но перед тем как это делать, необходимо фотки через FTP заливать, так вот вопрос заключается в том - можно ли избежать заливки через FTP и заливать их с локального компьютера через xml-rpc?
 

greengou

Client
Регистрация
09.02.2015
Сообщения
10
Благодарностей
2
Баллы
3
А обновлять уже существующие и опубликованные записи тоже можно?
 
  • Спасибо
Реакции: LightWood

nibiruanchild

Client
Регистрация
28.02.2015
Сообщения
133
Благодарностей
236
Баллы
43
Мне непонятен один момент. При чем тут зенно? Я делал автозаполнение сайтов на задолго до того как узнал что такое зенно, до сих пор один сайтец денюжку приносит. Зенно в качестве площадки для запуска C# кода использовать несколько странно, на мой взгляд, если не использовать другие его фишки или использовать по минимуму
 
  • Спасибо
Реакции: Zmaster и alex61

greengou

Client
Регистрация
09.02.2015
Сообщения
10
Благодарностей
2
Баллы
3
Мне непонятен один момент. При чем тут зенно? Я делал автозаполнение сайтов на задолго до того как узнал что такое зенно, до сих пор один сайтец денюжку приносит. Зенно в качестве площадки для запуска C# кода использовать несколько странно, на мой взгляд, если не использовать другие его фишки или использовать по минимуму
Ну так это только пример упрощения постинга, а вот где и как брать контент, как его обрабатывать - это уже тема для других конкурсов.
 
  • Спасибо
Реакции: Radzhab

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 495
Благодарностей
1 193
Баллы
113
Мне непонятен один момент. При чем тут зенно? Я делал автозаполнение сайтов на задолго до того как узнал что такое зенно, до сих пор один сайтец денюжку приносит. Зенно в качестве площадки для запуска C# кода использовать несколько странно, на мой взгляд, если не использовать другие его фишки или использовать по минимуму
Вижу два основных плюса
1) Софт написанный или портированный в ZP никогда не взломают и он не утечет в паблик (имхо). Для меня и для многих кодеров которые сперва научились кодить, а потом увидели Зеннопостер использование форм дает очень много преимуществ. Я могу сперва написать программу в Visual Studio, отладить ее и спокойно портировать в ZP. Тем более в последней версии это намного проще чем раньше.
2) Теперь Wordpress. Я показал людям что можно не используя браузер делать запросы к WP. Этот вопрос много раз поднимался на форуме, но новички так и не найдя ответя уходили. Кто то уходил к Лексу за денежным решением проблемы, кто то так и постил через гет-пост запросы.

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







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

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

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

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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 495
Благодарностей
1 193
Баллы
113
)) Уважаемый, ваши комментарии тут излишне. 2gis и Wordpress это абсолютно разные статьи, которые админы объединили в один.
По поводу htmlagilitypack. Какой htmlagilitypack для JSON :D. Столько воздуха. Раздражают такие мемы.

2gis парсер был написан 2 года назад. Недавно я вспомнил о нем, запускаю - а он не пашет. Отснифав запросы в 2gis я увидел что поменялся только один параметр, изменил его и все заработало)). Потом я портировал все в ZP. И использовал делегаты только для того чтобы показать как оно работает, мне проще было все запихнуть в библиотеку и вызывать в одну строчку в ZP. Я использовал десериализацию только в одном месте, и только потому что оно там нужно было. В других местах я захотел использовать регулярки. Какие проблемы Митрондил?*
 
  • Спасибо
Реакции: durovino943

insideath

Client
Регистрация
18.05.2013
Сообщения
57
Благодарностей
26
Баллы
8
Митрондил, похоже, под крокодилом писал ответ к статье :D Сразу видно, в суть не въехал, а ум зашкаливает, даёт советы. За статью плюс!;-)
 
  • Спасибо
Реакции: Greez, mrXrumer и Radzhab
Регистрация
03.12.2012
Сообщения
187
Благодарностей
83
Баллы
28
))
По поводу htmlagilitypack. Какой htmlagilitypack для JSON :D.*
Вот этот допустим -
"
Regex.Matches(bphones, "(?<=text\":\").+?(?=\")")
.Cast<Match>()
.Select(m => m.Value)
.ToList();"

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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 495
Благодарностей
1 193
Баллы
113
json - джсон вообще не парсят есть спец либа - я отписал выше что единожды использовал десериализацию, так как в других местах невалидный json. И здесь никакая либа не поможет.Суть конкурса раскрывать способности zenno - покажи мастеркласс) Может научимся чему-нибудь

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

Я всегда отношусь положительно к конструктивной критике. Ключевое слово "конструктивная". Ладно, думаю дальше нет смысла вести этот диалог.
Бла-бла-бла. Снова не о чем. Я тебе написал конструктивные проблемы:-) твоего мопеда. Ладно все практикуй .net, мастерклассса не будет :-)
 

insideath

Client
Регистрация
18.05.2013
Сообщения
57
Благодарностей
26
Баллы
8
Ключевое слово "джсон вообще не парсят, есть специальная либа". Т.е. мы должны обязывать себя в создании дополнительных накладных расходов в виде отдельной библиотеки для таких простых сценариев, как вышеприведенный? Это есть хорошая практика? По поводу раскрытия способностей программы - они раскрываются, нет? Тут "даже" описывается реализаыия возможности, которую программа, сама по себе, не реализует. А что по поводу "говнокода" - говно пока тут только критика, а вышеприведённых код с примерами (использование делегатов, и все такое), были представлены автором как есть.
 
  • Спасибо
Реакции: mrXrumer, zennoX и Radzhab

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 495
Благодарностей
1 193
Баллы
113
Я бы с удовольствием отредактировал, но у меня нет прав на изменение поста. Яотписал одному из админов. Тишина
 

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 207
Благодарностей
991
Баллы
113
  • Спасибо
Реакции: Radzhab

seoshnek

Client
Регистрация
08.03.2010
Сообщения
91
Благодарностей
34
Баллы
18
1. Либо пиши напрямую в базу вордпересс.
2. Либо использую импорт в вордпрессе(есть там такая фитча).
Как человек съевший несколько собак на вордпрессах, добавлю, что целесообразнее все же (хотя и медленнеe) использовать WP API, нежели wp-db class. На бложиках по 100-500 записей незаметно, на больших сайтах с разными таксономиями вылезают косяки в будущем, да и тупо запаришься писать инсерты.
 
  • Спасибо
Реакции: Hannes и Radzhab

18kotov

Client
Регистрация
03.03.2013
Сообщения
14
Благодарностей
0
Баллы
3
Radzhab
спасибо за статью.
поясни пожалуйста суть работы шаблона.
Скачал. Запустил в projectmaker
добавил компонент Ссылки из GAC
добавил компонент Директивы Using и добавил два пространства имен.
далее насколько я понимаю первый блок с C#кодом должен при заполнении пути, лога и паролей постить статьи на сайт.
Но у меня не хочет) Пишет действие не выполнено. Куда копать?
Сайт тестовый на локальном компе. WP 4 XMLRPC как я понимаю включен по умолчанию.
 

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