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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
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 КБ Просмотры: 934

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

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

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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
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 КБ Просмотры: 815

ssXXXss

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

ssXXXss

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

Master Woo

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

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 868
Благодарностей
1 114
Баллы
113
Бомба:bb:
 
  • Спасибо
Реакции: Radzhab

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 769
Благодарностей
1 179
Баллы
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
Сообщения
715
Благодарностей
409
Баллы
63
Content ="Контент записи, <p> А тут html код)</p>"
Как заливать картинки в content через xml-rpc ?
Например 3 изображения.
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
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
Сообщения
715
Благодарностей
409
Баллы
63
Это очевидно, но перед тем как это делать, необходимо фотки через FTP заливать, так вот вопрос заключается в том - можно ли избежать заливки через FTP и заливать их с локального компьютера через xml-rpc?
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
785
Баллы
113
  • Спасибо
Реакции: Radzhab

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

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







ps Я даже сперва разместил объяву у себя в группе что хочу сделать многофункциональный шаб для работы в ZP. Но, увы) Мало кто откликнулся. Так что тема актуальна)
 
  • Спасибо
Реакции: LmPopo
Регистрация
03.12.2012
Сообщения
187
Благодарностей
89
Баллы
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 500
Благодарностей
1 263
Баллы
113
)) Уважаемый, ваши комментарии тут излишне. 2gis и Wordpress это абсолютно разные статьи, которые админы объединили в один.
По поводу htmlagilitypack. Какой htmlagilitypack для JSON :D. Столько воздуха. Раздражают такие мемы.

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

insideath

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

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

Radzhab

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

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

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

insideath

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

Radzhab

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

lokiys

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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
) Ну же друзья, голосуем)
 

seoshnek

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

18kotov

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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
Отпиши в скайп. Разберемся удаленно
 

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