1 место Автоблоггер, или взгляд на дорвеи другим глазом

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Решил поучаствовать в конкурсе. Между прочим впервые пишу конкурсную статью, так что сильно не пинайте :-) Предупреждаю сразу, особенного палева тем, схем слива трафика и тонкостей заработка в статье не будет, в первую очередь это будет техническая статья, ориентированная на тех, кто в чем то не может разобраться или испытывает трудности, а идея статьи лежит на поверхности, я не сомневаюсь, что каждый из пользователей, читающих это приходил к ней.

Итак, приступим.
Мы будем создавать так называемые фанпейджи в социальной сети facebook, что это такое и с чем едят, я, пожалуй, расписывать не буду, достаточное количество материала можно почерпнуть на просторах интернета. Нужно понимать лишь одно, что такие страницы прекрасно индексируются поисковыми системами, и участвуют во внутреннем поиске самого фейсбука. Пример такой страницы можно посмотреть вот здесь https://www.facebook.com/funpagemedia

Перед написанием шаблона первым делом необходимо всю задачу разбить на отдельные подзадачи, а если необходимо, то и их разбить на подзадачи. Чтобы понять как действовать, лучше всего один раз создать такую страницу руками. Если вы после этих строк проделали эту, в общем, несложную процедуру, то самыми очевидными шагами при создании страницы будут следующие:

a) логин в аккаунт фейсбука, под которым будет создаваться страница
b) создание фанпейдж-страницы
c) настройка страницы
d) сохранение результата (ссылки на страницу)

Далее видно, что если пункты а) и d) вполне себе самостоятельные подзадачи, то пункты b) и d) необходимо разделить на еще более мелкие подзадачи.
 

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

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

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Получаем следующую структуру шаблона:

Этап 0. Подготовка исходных данных

Этап 1. Вход в социальную сеть

Шаг 1.1. Ввод логина и пароля с главной страницы фейсбука, клик на кнопку «логин»​

Этап 2. Создание страницы

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

Шаг 2.2. Заполнение общей информации о фанпейдж. Описание с основной информацией, ссылка на сайт, клик по радиокнопке, говорящей, что фанпейдж не является реальной организацией и клик по кнопке «сохранить информацию». Описанием страницы будет являться сниппет из поисковой системы по нашему ключевому слову, поэтому Шаг 2 будет разбит на дополнительные шаги.​

Шаг 2.2.1. в новой вкладке необходимо сделать запрос в поисковик с нашим ключевым словом

Шаг 2.2.2. Необходимо спарсить сниппет из результатов выдачи

Шаг 2.2.3. Почистить сниппет от HTML-тэгов​

Шаг 2.3. Загрузка фото. На этом шаге мы будем парсить аватарку для страницы из поисковика по фотографиям, сохранять к себе на компьютер и загружать ее в фейсбук. Поэтому Шаг 3 потребует еще дополнительной разбивки на шаги.​

Шаг 2.3.1. в новой вкладке необходимо сделать запрос в поисковик по картинкам с нашим ключевым словом

Шаг 2.3.2. какую-либо из картинок сохраняем к себе на компьютер

Шаг 2.3.3. Загружаем картинку на фейсбук​

Шаг 2.4. Добавить в избранное. Тут предлагается добавить ссылку на фанпейдж в избранное аккаунта, нам этого не требуется, поэтому на этом шаге нужно кликнуть по кнопке «пропустить»​

Шаг 2.5. На этом шаге фейсбук предлагает потратить деньги на рекламу. Но нам то это зачем? Здесь тоже будем кликать по кнопке «пропустить». После этого клика наша страница будет создана.​

Этап 3. Сохранение результатов

Шаг 3.1. Сохраняем ссылку на страницу в текстовый файл

Шаг 3.2. Здесь можно придумать много что еще, например постинг на страницу комментария, фотографии или видео, приглашение друзей, в общем организовать первоначальное наполнение страницы. Но этот шаг мы опустим, так как все действия будут повторять предыдущие и в плане понимания инструмента ZennoPosterникакой нагрузки не несут.​
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Итак, с концепцией шаблона определились, теперь следует определиться с такой интересной вещью, как слив трафика. Конечно у каждого вебмастера есть своя любимая партнерская программа, но в качестве примера будем использовать партнерку, которая платит за инсталлы. На примете имеется такая, я сам некоторое время с ней работал. Примечательно то, что раз выбрали для примера тематику «музыка», а у этой партнерки как раз есть лендинг, на котором предлагается установить музыкальный плеер. Плеер белый и пушистый, без вирусов и всякой черни. В общем, если кто решится после прочтения статьи с ней работать, то пожалуйста, вот рефссылка :-) http://bit.ly/1hI9Gsg . Скажу сразу одно, что партнерка не принимает трафик из России и некоторых стран СНГ, поэтому делать страницы будем исключительно на английском языке и парсить иностранные поисковые машины.
 
  • Спасибо
Реакции: AcidX, adamant и GreenWay

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
ЭТАП 0. Подготовка исходных даных

ШАГ 0.1 Настройка таблиц и списков, привязка к файлам.

Смысл главы думаю понятен из ее названия, поэтому просто создаем в папке с проектом несколько текстовых файлов

key_and_link.txt – в этом файле будут храниться ключи и ссылки на лендинг партнерки в виде

точка с запятой служит разделителем между ключевым словом и ссылкой. Почему я складываю эти данные не в разные файлы? Во-первых, я хочу показать как работать с таблицами. А во-вторых таким образом можно генерировать страницы под трафик на разные партнерки и разные тематики одновременно.
accounts.txt– текстовый файл с аккаунтами для фейсбука в виде
facebook_user_login:facebook_user_password:0
Думаю здесь все понятно, кроме последнего параметра «0», наверное я расскажу о нем позже, но он существенно может облегчить жизнь. Пусть будет это небольшой хак, который мы как будто придумали в процессе создания шаблона. Разделителем здесь служит символ «двоеточие». Почему здесь не точка с запятой? Не знаю, просто исторически как-то получилось, а статью я пишу на основании готового шаблона, поэтому менять ничего не хочется :-)

И последний файл

page_url.txt– текстовый файл в который будут сохраняться ссылки на наши созданные страницы. Одна ссылка на одной строчке.
Так как зеннопостер прекрасно работает со списками и таблицами, представленными в виде текста, то нужно привязать наши файлы к этим самым таблицам и спискам.


Для этого из бокового меню берем надпись «таблица» и тянем ее на панель инструментов вниз (отмечено красным). Далее делаем двойной клик по иконке и открывается окно настройки таблицы (отмечено синим).

Далее смотрим рисунок


1. Отмечаем все позиции. Если смотреть по порядку, то они обозначают:
- загружать таблицу из файла;
- все изменения таблицы будут синхронизированы с файлом, то есть если из нее что то удалить, то в файле эти данные так же удалятся;
- если все данные удалить из файла, то при наличии отмеченной позиции файл останется на диске и будет пустой, иначе файл удалится, как только в нем кончатся данные.​
2. помните мы сформировали исходные данные? Так вот чтобы разделить ключ и ссылку на лендинг мы могли бы взять строку из файла, и потом делить ее регулярным выражением. Но разработчики упростили нам жизнь и теперь достаточно просто поставить точку напротив разделителя, как таблица самостоятельно разобьется на ячейки. Можно использовать свой разделитель, например |||, тогда нжно выбрать пункт «Свой» и указать в нем, по какой последовательности символов делить строки в таблице. Очень удобно.
3. далее нужно выбрать текстовый файл, к которому будет привязана наша таблица. Там все просто кликаем мышью на иконку выбора файла, в диалоговом окне собственно выбираем сам файл. Но после выбора файла появляется интересная конструкция вида {-Project.Directory-}key_and_link.txt. Так вот {-Project.Directory-} означает папку на компьютере, где хранится наш шаблон, при выборе файла Зеннопостер автоматически выделяет путь к шаблону и заменяет его на эту конструкцию. Таким образом куда бы мы потом не переместили наш проект, ничего в нем изменять не нужно. Программа сама будет знать где находятся файлы.
4. после всех проведенных манипуляций мы видим как наша таблица отобразилась в окне предпросмотра. Тут удобно контролировать правильно ли мы настроили привязку таблицы, если ячейки разбились так как нужно, значит мы все сделали правильно :-). Так же можно посмотреть полную таблицу, для этого нужно кликнуть по кнопке «просмотр содержимого» вверху окна.

Дальше для того чтобы не запутаться мы переименуем таблицу, дадим ей нормальное название. Для этого кликаем правой кнопкой на иконке таблицы, и выбираем пункт меню «переименовать…»


В открывшемся диалоге введем название таблицы «keywords_and_links». Вообще нужно давать всем объектам (переменным, таблицам, спискам, группам действий, самим действиям) нормальные логичные названия. Согласитесь, когда в проекте пара десятков подобных названий а1, а2, а3… то через пару часов сам запутаешься, а если не запутаешься, то через неделю забудешь что какой параметр означает.

На этом настройку таблицы считаем законченой. Аналогичным образом настраиваем таблицу аккаунтов. Я не буду расписывать, просто приведу скриншот.


Здесь стоит отметить, что как раз и использовался собственный разделитель – двоеточие. Как видно схема, описанная выше прекрасно работает, все ячейки расставились по своим местам.

Далее настроим список.

Здесь все в общем то аналогично таблице, стоит лишь сказать, список это ведь просто набор строк, поэтому разделитель в списке, это та последовательность символов, которая означает конец строки. В нашем случае это «перевод строки» и «возврат каретки» или то же самое что нажать клавишу Enter в текстовом редакторе.
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Шаг 0.2 Взятие исходных данных из таблиц и списков

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

Для этого добавим в проект сразу после старта экшен «операция над таблицей»


Из выпадающих списков вверху окна настроек выберем таблицу, из которой будем брать данные, в нашем случае это «accounts», и действие, которое будем проводить над таблицей «Взять строку». И настроим экшен соответствующим образом:
1. Будем брать первую строку, тут вопрос не принципиальный, можно брать хоть какую :-)
2. «Удалить после взятия» здесь думаю понятно. После чтения строки она удалится из таблицы. Такая функция нам нужна для того, чтобы моно было запускать проект в несколько потоков. Логично ведь, что если не удалять строку, то может случиться так, что два или несколько потоков возьмут один и тот же аккаунт, ну и соответственно при выполнении возникнут ошибки. Но не стоит переживать, далее я расскажу как сделать так, чтобы наши данные не потерялись
3. «В переменные». Экшен взятия строки из таблицы предлагает эту очень удобную функцию, ненужно мучиться разбирать строку регулярными выражениями. Все уже встроено в программу. Поэтому просто указываем из какого столбца брать данные и какой переменной их присваивать

Аналогичным образом добавляем экшен взятия из таблицы для выборки данных из таблицы «keywords_and_links» и настраиваем его.


Все, теперь у нас есть все данные для создания фанпейджа, но остался еще один момент. Рассмотрим его сразу. Немного подумав, приходим к выводу, что шаблон может закончится двумя путями: выполнился нормально, и где то произошла ошибка, а исходные данные мы взяли с удалением, таким образом в любом случае они потеряются. Чтобы этого не произошло построим такую конструкцию:


Экшен «Good End» означает то, что после успешного завершения шаблона выполнится ветка которая идет следом за ним, а экшен «Bad End» соответственно выполнит то что идет после него при ошибочном завершении шаблона, то есть постер будет переходить на эту ветку при любом сбойном действии. Рассмотрим более подробно ветку «Good End»

1. Этот экшен собирает обратно из переменных в строку логин пароль и рейтинг аккаунта фейсбук, то есть вместо конструкции вида {-Variable.facebook_login-} подставляет значение логина, вместо {-Variable.facebook_password-} значение пароля и вместо {-Variable.facebook_ratio-} подставляет значение рейтинга аккаунта. И всю эту получившуюся строку перекладывает в переменную str.
2. Экшен обрезает в конце и в начале получившейся строки все ненужные символы, которыми являются пробелы. Не скажу почему возникла в этом необходимость, просто шаблон делался уже довольно давно, возможно в Зеннопостере был баг, который добавял лишние пробелы. Из настроек думаю становится понятно что конкретно делает экшен.
3. И наконец последний экшен добавляет в таблицу «accounts» получившуюся строку. Теперь при успешном выполнении шаблона строки аккаунтов не потеряются.

Аналогичным образом формируем ветку неудачного завершения проекта, но там добавим к сохранению аккаунта так же сохранение ключа и ссылки, и уменьшение рейтинга аккаунта. Почему так делаем? Будем считать что если проект не завершился удачно, то страницу мы не создали в том виде, в каком она нужна. И соответственно, чтобы не терять ключи и ссылки, мы сохраняем их обратно в исходные файлы.
 
  • Спасибо
Реакции: AcidX, adamant и GreenWay

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
ЭТАП 1. Логин в фейсбук

Ну чтоже, приступим к самому важному :-) включим запись шаблона и начнем. В адресной строке браузера, встроенного в Зеннопостер вводим адрес: http://facebook.com. Перед нами главная страница фейсбука. Считаем, что аккаунт в ней у нас уже есть, и стоит задача ввести логин и пароль в соответствующие поля и кликнуть на кнопку входа.


Можно конечно просто вписать в поля логин, пароль и кликнуть на кнопку логина, оставив поиск признаков, по которым ищутся поля на откуп алгоритмов Зеннопостера, но я предпочитаю контролировать ситуацию полностью :-) Поэтому кликаем на поле "Email" правой кнопкой мыши и открываем конструктор действий


Теперь предстоит найти атрибуты поля такие, чтоб на загруженной странице они были уникальными, или в нашем случае при клике на кнопку «поиск» конструктора действий нашелся один единственный элемент. Ставим вручную в поле «№ формы» значение равное -1. Это означает, что поиск на странице будет осуществляться по всем формам и элементам внутри них. Далее в поле «Тэг» устанавливаем значение «Input:text» так как типом поля у нас будет поле для ввода текста. Далее для того, чтобы узнать какими атрибутами обладает элемент email снова кликнем по нему правой кнопкой, но нужно выбрать пункт меню «исследовать элемент». Справа в двух окнах отобразятся в свойства элемента и его положение в структуре html-страницы. Сейчас нас больше интересуют свойства. Там мы видим, что элемент обладает атрибутом «id» и его значение равно «email». Впишем эти данные в конструктор действий: в «Имя атрибута» впишем «id», а в «значение» - «email», тип поиска возьмем «text» и нажмем кнопку «поиск», как видим нашлось всего одно совпадение, что нам и нужно. Для примера возьмем атрибут «class» и его значение, в поиске найдется более одного элемента. Можно конечно оставить и так, выбрать нужный номер совпадения, но стоит сайту изменить порядок этих элементов, то придется заново переделывать шаблон. Именно поэтому и следует искать элемент по уникальным признакам, чтобы он всегда находился один на странице.
Итак, элемент мы уже нашли, теперь нужно присвоить ему значение. Для этого выберем тип действия «Set», в выпадающем списке выберем что будем устанавливать атрибут «value» и в поле значение введем логин от фейсбука следующим образом:


И нажмем кнопку «тестировать» если элемент заполнился нужным значением, то значит мы все сделали правильно, и можно смело кликать на кнопку «добавить в проект». Этим самым мы сохраняем наш настроенный экшен в проекте.
Аналогичным образом поступаем с полем «password» и кнопкой «login», но при конструировании экшена клика по кнопке, тип действия выбираем «Rise» (событие) и действие выбираем «click». Если все сделано правильно, то в итоге мы должны попасть в аккаунт фейсбука.
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
ЭТАП 2. Создание фанпейджа

Шаг 2.1
Немного поискав на странице, в самом низу обнаруживаем ссылку на создание фанпейджа. Она всегда будет следующей:
Вставляем в проект действие перехода на эту страницу и соединяем успешный выход из экшена клика по кнопке логина с входом этого экшена перехода на страницу. С учетом взятия исходных данных получим примерно следующий вид шаблона


Прогнав шаблон с самого начала, в браузере зеннопостера мы должны увидеть примерно следующее:

Нам интересен раздел «Cause or Community». Кликнув по нему, мы увидим как открываются поле для заполнения названия и кнопка создания страницы. Скрытие этих полей реализовано на JAVA, поэтому картинка закрывающая поля, всего лишь ширма J. Кликать на нее не будем, а сразу начнем заполнять поля. Аналогично конструктором действий ищем признаки этого элемента так, чтобы номер формы был равен -1 и элемент при этом был один на странице. У меня получилось найти по атрибуту «id» равному «community_form_page_name». Устанавливаем значение атрибута «value» равным значению переменной {-Variable.keyword-}

Осталось кликнуть по кнопке «Get Started». Но здесь возникает одна проблема: поискав кнопку конструктором действий мы не находим уникальных признаков, точнее находим, но значение атрибута «class» содержит в себе значение, которое ну… мне не нравится, хотя и может быть уникальным. Но здесь очень удобный случай, чтобы продемонстрировать одну фишку. Итак, считаем, что у кнопки нет уникальных признаков. Но посмотрев в дереве элементов выше, мы видим, что эта кнопка является вложенной внутри формы с id равным «community_form» которого больше не встречается на странице. Таким образом, нам необходимо найти форму id = community_form, а кнопка внутри нее ищется просто по признаку tag = button. Здесь на помощь нам приходит экшен «Свой C# код». Содержание его будет следующее:

var tab = instance.ActiveTab;
var community_form = tab.FindElementByAttribute("form", "id", "community_form", "text", 0);
if (!community_form.IsVoid)
{
var button = community_form.FindChildByAttribute("button", "fulltag", "button", "text", 0);
if (!button.IsVoid)
{
button.RiseEvent("click", "Full");
return0;​
}​
}
throw new Exception("не удалось кликнуть на кнопку Get Started");
немного прокомментирую код:

первая строка присваивает переменной tab объект, который есть ни что иное, как активный таб (вкладка) в инстансе (окне браузера) проекта. После это операции в переменной tab будут храниться все объекты и свойства со страницы.

Вторая строка это поиск функцией FindElementByAttribute той самой формы «community_form». Как видим содержание параметров функции такие же как и в конструкторе действий, то есть:

form – это тэг в котором мы ищем нужные атрибуты
id – это название атрибута по которому ищем форму
community_form – это значение атрибута id
text – тип поиска элемента
0 – это номер нужного совпадения. Стоит отметить, что в зеннопостере нумерация объектов начинается с нуля, поэтому первое совпадение имеет номер 0.

Следующим условием мы проверяем нашлась ли наша форма на странице. После выполнения предыдущей инструкции, если объект не нашелся, то значение свойства IsVoidпеременной community_form будет равно истине, а восклицательный знак, означает логическую инструкцию НЕ. То есть дословно этот оператор можно проговорить так «если community_form.IsVoidНЕ пустой». Если это так, то выполнение переходит к следующему действию идущему внутри фигурных скобок. Если условие не соблюдается, то ыесь код внутри скобок пропускается и выполняется то, что идет за ними.

Допустим у нас нашлась форма, и нужно искать кнопку внутри нее, для этого заведем еще одну инструкцию

var button = community_form.FindChildByAttribute("button", "fulltag", "button", "text", 0);
она очень похожа на предыдущую конструкцию, но вместо того чтобы искать элемент в табе, мы его ищем как вложенный в форму (FindChildByAttribute). Значение парометров функции такое же как и при поиске в табе.
Далее опять проверяем нашлась ли кнопка, и если это так, вызываем клик по ней
button.RiseEvent("click", "Full");
функция RiseEvent означет выов события, а параметры указывают, что нужно выполнить клик по кнопке, с полной эмуляцией.
После выполнения клика выходим из экшена без ошибки (return 0;-) но если по каким то причинам элемент не нашелся (например страница не успела загрузиться), то последней строчкой
thrownew Exception("не удалось кликнуть на кнопку Get Started");
мы принудительно вызываем ошибку выполнения экшена, так как без клика по кнопке вообще нет никакого смысла продолжать выполнение, и весь шаблон в этом случае перейдет на ветку «BADEND». А чтобы было понятно что случилось, то добавим еще и сообщение, которое будет выведено в логе выполнения.

Надеюсь всем все понятно, на всякий случай полная справка по командам C# для Зеннопостера находится по ссылке http://help.zennolab.com/en/v5/zennoposter/5.0.4/webframe.html правда на английском языке...

Хорошо, название заполнили, на кнопку кликнули, не мешало бы теперь проверить, что страница создалась без ошибок. Намеренно допустим ошибку: не заполним название страницы и кликнем кнопку. Увидим такую неприятную шутку



Появляется подозрение, что в такую красную рамочку оформляются все ошибки. Чтож, поищем ее… и находим что эта рамочка имеется idэлемента равный «create_error»

Собираем действие поиска такого элемента. На скриншоте видно как и что нужно настроить. Тестируем конструктор, добавляем действие в проект. Видим такую картину, что в переменной {-Variable.Variable0-} значение будет пустым, если рамочка не появилась


А дальше дело техники: проверяем, пустое ли значение переменной или нет. Если пустое, то все в порядке, а если нет, то тут можно включить фантазию и сделать огромную ветку реакции на эту ошибку, но я, пожалуй, сэкономлю немного времени, и просто пусть проект завершается с ошибкой.

Предположим, в нашем случае ошибки никакой не произошло, и мы продолжаем дальше
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
ШАГ 2.2

После клика по кнопке «GetStarted» видим следующую страницу


Здесь видим, что нужно произвести следующие манипуляции:

1. вставить ссылку на лендинг
2. заполнить описание
3. вставить название фанпейджа
4. сообщить, что наша страница не является общественной организацией
5. кликнуть кнопу «Save Info»

1. Думаю хорошим делом будет сократить ссылку на лендинг. Для этого будем использовать всем известный сервис bit.ly. Можно конечно открывать веб-страницу сервиса, работать там элементами и формами, и в итоге получить сокращенную ссылку, но сервис предоставляет простой и удобный API, его и будем использовать. Потому что через него и проще и быстрее все сделать. Прочитать о сокращении ссылок через API, опять же на английском языке можно по этой ссылке http://dev.bitly.com/links.html#v3_shorten. Самым долгим будет регистрация в сервисе. Допустим у нас уже есть аккаунт, от него нам потребуется логин и APIKEY. Заходим в аккаунт и из настроек сохраняем куда-нибудь.

Из описания API понимаем, что запрос нужно делать так, что сокращаемая ссылка закодирована методом URLEncode. Чтобы нам это сделать средствами Зеннопостера вставляем и настраиваем два экшена согласно скриншоту

Первый экшен, это «Обработка текста» с функцией «Подготовка JavaScript» так мы делаем для того, чтобы подготовить ссылку к обработке Java-скриптом, ведь в ней могут содержаться служебные символы, которые приведут к ошибочному срабатыванию следующего экшена. Вторым действием мы пишем короткий код на Java, который приводит ссылку к виду закодированному в URLEncode. Теперь все готово к совершению запроса к APIсервиса bit.ly.


Следующим действием мы собственно это и делаем.


Формируем строку запроса, в которую вставляем в нужную позицию подготовленную ссылку, и наши данные от API. Ответ сервиса будет сохраняться в переменную {-Variable.bitly_resp-}. Но так как читая описание мы видим, что в ответе содержится много ненужной нам информации, то нужно выпарсить из него лишь то, что нам нужно.

Первым делом будем парсить хеш-код нашей ссылки в сервисе bit.ly. для этого добавим в поле экшен текстового процессора, настроим его на функцию Regex. Он будет из содержимого ответа выбирать только хеш ссылки. Составить регулярное выражение нам поможет конструктор, которым пользоваться очень просто. Для примера возьмем текст ответа, который приведен на сайте bit.ly
{
"data": {
"global_hash": "900913",
"hash": "ze6poY",
"long_url": "http://google.com/",
"new_hash": 0,
"url": "http://bit.ly/ze6poY"
},
"status_code": 200,
"status_txt": "OK"
}
Нас интересует содержание поля «global_hash». Открываем консруктор регулярных выражений, и вставляем в поле «текст для обработки» наш пример.

Так как структура ответа всегда одинакова, то нужное нам значение содержится в одной строке и расположено между "global_hash": " и символом кавычек. Значит мы заполняем поля конструктора «перед искомым текстом всегда есть:» и «Это идет после искомого текста», так же устанавливаем «птичку» напротив «самое короткое совпадение» и снимаем ее у «разрешить переносы».


Затем кликаем по кнопке «Тест» и в поле «результат обработки» видим наше нужное значение. Если все получилось, то копируем регулярное выражение в буфер обмена и вставляем его в экшен текстового процессора.
Следующим экшеном мы собираем полностью сокращенную ссылку, так как из ответа bit.lyмы спарсили только хеш. То есть мы переменной
Ну и естественно весь результат нужно вставить в соответствующее поле, как его искать объяснялось раньше, я лишь приведу скриншот действия.


2. Следующим шагом будет вставка описания, получать мы его будем и сниппета поисковика google.comна английском языке. Что нам для этого необходимо? Нам нужно открыть новую вкладку в инстансе, активировать ее и совершить в ней переход на страницу поисковика



Увидим страницу поиска гугла, дальше нам нужно в строку поиска вписать наше ключевое слово, и кликнуть кнопку поиска.


В итоге в браузере получим то, что нам необходимо:



Теперь будем использовать прием как спарсить все сниппеты со страницы одним махом J для этого нужно заглянуть в исходный код страницы, а сделать это легко и просто. Нужно лишь кликнуть по значку около адресной строки, отмеченному стрелкой. В просмотрщике кода выбираем вкладку «DOM-модель» и результат просмотра копируем в конструктор регулярнх выражений. Дальше ищем-роем код и определяем между каких тэгов находятся сниппеты. Находим их формируем регулярное выражение для поиска текстов сниппетов

Глядя на результаты откладываем в памяти, что парсятся сниппеты с html-тэгами и бывают какие-то совсем короткие, не похожие на описание. Чтож… придется побороться с этим, но позже. А пока что вставим в проект экшен «Данные» и настроим его следующим образом

Нам не хватает еще хранилища сниппетов. Лучше всего для этого подойдет список. Просто добавим его в проект, привязывать к каким-то файлам его не будем, так как он формируется в процессе работы шаблона, просто переименуем его в «Snippets»

Так, «сырые» сниппет спарсили удачно, теперь нужно выбрать подходящий под описание, как помним у нас могут быть короткие сниппеты, зададим минимальную длину, ну скажем 30 символов. И соберем следующую конструкцию из экшенов:


Первое действие берет из списка «Snippets» строчку с удалением, так как если сниппет не подойдет нам, то его нужно удалить все равно, а если подойдет, то мы прекратим наши поиски. Вот такой получился цикл :-)

Следующий экшен определяет длину взятой строки. Использовать собственный код тут пришлось в силу того, что стандартными средствами Зеннопостера это невозможно реализовать. Но в коде так же все просто, думаю понятно все из комментариев

Код:
string s; //определяем переменную s типа "строка"
s = project.Variables["snippet"].Value; //связываем переменную s с переменной из проекта snippet
if (s.Length < 30) returnfalse; elsereturntrue; //анализируем длину строки, если короче 30 символов то возвращаем false
последним действием мы проверяем что же получилось. Если экшен проверки длинны вернул false (строка короче 30 символов) то такой экшен нам не подходит, и мы возвращаемся на шаг получения сниппета из списка, а если вернул true, то мы продолжаем работу шаблона. Вот такой вот получился цикл J Можно было сэкономить немного времени и написать один экшен на c# который бы по исходному списку возвращал бы сразу пригодный сниппет, но я решил немного растянуть шаблон, чтобы было понятнее.


Еще добавим небольшое улучшение для шаблона
. Предположим, что при поиске в гугле, он выдал нам капчу, да бывает и такое. Давайте сделаем проверку на ее наличие и в случае присутствия разгадаем. Предлагаю всю процедуру сделать в автоматическом режиме записи. Просто так, для примера. Заранее прошу прощения, но с гуглом что-то случилось и я не смог сделать так чтоб он показал мне капчу, поэтому на снимках будет просто случайная картинка из выдачи поисковика, но с капчей тоже самое.

Признаком наличия капчи от гугла может служить, например, текст содержащийся на странице «type the characters below». Проверку текста на странице делать очень просто, нужно лишь выделить нужный фрагмент и в меню, которое доступно по правому клику мыши выбрать пункт «создать проверку наличия выделенного текста». Далее появится окно с подтверждением, котором будет отображен нужный нам текст, там так же нужно согласиться, или отредактировть текст. После чего Зеннопостер автоматически сформирует действия и добавит их в шаблон. Выглядеть это будет примерно вот так


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

Сразу после обозначения картинки капчей появится окно для ее распознавания. Вводим для начала руками то, что изображено на картинке
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Так же нам нужно найти поле, куда нужно вводить результат распознавания. Определившись с ним, кликаем на него правой кнопкой и отмечаем его «поле для результата распознавания капчи». Так же автоматически будет создано действие для ввода резултата распознавания. Остается лишь кликнуть по кнопке отправки формы с капчей, но это мы уже умеем делать :-) и проверить результат.



В итоге мы должны получить примерно такой набор действий:


Надеюсь из картинки все понятно. Логика действия такая, что если на странице встретился текст «type the characters below» (проверка осуществляется верхними тремя дейтсвиями), то переходим к поиску картинки, отправляем ее на разгадывание, после чего вводим в соответствующее поле и кликаем на кнопку отправки. А Потом снова проверяем, есть ли на странице капча. Выход будет осуществлен, когда текста «type the characters below» не будет на странице. Сходу я вижу в этом решении несколько возможных проблем, но предлагаю подумать над ними самостоятельно. В общем то проблемы видны невооруженным взглядом J
Остается лишь добавить то, чтобы не вводить капчу руками, а предоставить эту честь наемным работникам, нужно выбрать модуль распознавания капчи.

У каждого свои предпочтения, поэтому команда Зеннопостера написала несколько модулей от разных сервисов, остается лишь выбрать свой и прописать для него данные в настройках программы.
Еще стоит отметить, что вход в эту ветки нужно осуществлять после клика на кнопку «поиск» во вкладке с гуглом, а выход из ветки сделать сразу после этой кнопки.
Теперь нужно экшеном «Управление табом» нужно активировать предыдущую вкладку

И заполнить все поля подготовленными данными. Ах да! Совсем забыли почистить сниппет от ненужного содержания. Это очень просто сделать регулярными выражениями, за два дейсвтия. Первый будет чистить от тэгов, а второй от ссылок (бывает так, что в сниппете содержатся ссылки). Все это делать мы уже умеем, стоит лишь привести снимок с настройками действий.

Все, теперь точно все готово!

Ищем и заполняем все поля, подготовленными данными. В поле «краткое описание» вставляем короткую ссылку и сниппет. В поле «ссылка» вставляем сокращенную ссылку, в поле «имя страницы» вставляем ключ, предварительно почистив его от пробелов, выбираем радиокнопку, говорящую о том, что страница не является существующей организацией. И кликаем по кнопке «SaveInfo». Все это мы уже научились делать ранее. Значит переходим к следующему шагу
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Шаг 2.3. Загрузка фото.

Видим в браузере следующую страницу:


Здесь нам нужно найти аватар для фанпейджа и загрузить его на фейсбук. Картинку будем брать из поиска гугла, сохранять к себе на компьютер и загружать на сайт, несмотря на то, что есть возможность импорта картинки по ссылке.

Снова создадим дополнительную вкладку «google_image», активируем ее и добавим действия перехода по ссылке:



Как видно в действии перехода мы уже используем запрос к поисковику в виде прямой ссылки. И следующим действием мы собираем все ссылки на картинки в спискок «img_list», который не привязываем к файлу, а он нужен лишь для хранения ссылок на картинки. После этих действий можно закрыть вкладку. Все, ссылки на картинки у нас имеются.
Теперь опять открываем новую вкладку, берем из списка в переменную с ссылкой на картинку, добавляем действие перехода на страницу, а в нем указываем ссылку на эту самую картинку. Получится так, что у нас в отдельной вкладке откроется только картинка по ссылке, а теперь чтобы ее сохранить нужно проделать следующее. Добавим экшен распознавания капчи, но в настройках где указываем модуль распознавания укажем библиотеку CaptchaSaver.dll, а в дополнительных настройках укажем путь и имя файла, в который будет сохраняться картинка.

А вот чтобы сделать имена файлов уникальными, не будем слишком сильно размышлять над этим, а просто соберем вот такую переменную:

С макросом {-Project.Directory-} я думаю все понятно. Помните в самом начале привязывали списки и таблицы? Здесь он выполняет ту же самую функцию, указывает на путь к директории проекта. А вот дальше видим часть пути «pic» это всего лишь директория, которую нужно создать рядом с файлом шаблона, чтобы сохраняемые картинки не засоряли нам пространство, а спокойно хранились в своей собственной папке. {-Environment.TickCount-} эту конструкцию мы используем в качестве имени файла. Сама переменная представляет из себя очень большое число, которое есть ни что иное как Возвращает время, истекшее с момента загрузки системы (в миллисекундах), таким образом мы получим уникальное имя файла. Остается лишь добавить расширение файла «.jpg» и вставить этот экшен перед сохранением катринки.

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


Этим самым мы говорим, что когда возникнет необходимость загрузить что то на сервер, то будет использован файл, указанный в этом экшене. После этого достаточно лишь кликнуть по кнопке загрузки и немного подождать. Картинка загрузиться на сервер.

Нам лишь остается кликнуть по кнопке «Next», но это мы уже умеем делать ;-)

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

Что это значит? Это значит то, что если элемент (в нашем случае кнопка) не найден на странице, то есть предложение от фейсбука не поступило, то шаблон не завершится с ошибкой. В лог будет выдано предупреждение, а шаблон будет выполняться как ни в чем не бывало.
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
Этап 3. Сохранение ссылки на страницу

После этих двух кликов ура! Наша страница создана! Остается лишь сохранить ссылку на нее где то в надежном месте :-)
Создадим такой набор действий:


Первое берет ссылку на страницу из браузера. Так как ссылка на вновь созданную страницу немного отличается от прямой ссылки, то вторым действием мы ее немного корректируем с помощью регулярного выражения. И третьим действием проверяем, не пустой ли результат? Вдруг фейсбук нас куда-нибудь средиректил, и вообще страница не подгрузилась…. Как раз для этого мы и используем вместо обычного удаления символов регулярное выражение, потому что если что то пошло не так, то замена вернет нам исходный результат, даже если замены не произошло, а воздействие регулярным выражением в случае, если данные некорректные вернет пустой результат, так мы избавляемся от парочки лишних действий. Такой вот небольшой лайфхак :-)

Так ссылку мы получили, а теперь просто сохраняем ее в список, который привязан к файлу. Все просто.


Наконец то открою страшную тайну о рейтинге аккаунта :-) эту фишку я решил добавить по следующим соображениям. Нет-нет, да бывает так, что фейсбук блокирует наши аккаунты. Бывает так, что его возможно разблокировать вручную, введя капчу, а бывает и навечно. Так вот если нам удалось в аккаунте создать фанпейдж, то мы увеличиваем рейтинг аккаунта, а если не удалось, то соответственно уменьшаем. В забаненом аккаунте естественно, ничего создать нельзя, и поэтому через какое то время забаненый аккаунт приобретет отрицательный рейтинг. Поэтому следует через какие то промежутки времени просто проверять список аккаунтов, и что то делать с теми, кто набрал плохой рейтинг. Вот и все :-)

Напоследок мне хотелось бы пожелать всем успехов в освоении прекрасного инструмента, как Зеннопстер, а его разработчикам побольше светлых идей. Так как нет предела совершенствованию :-) А вообще о Зеннопостере можно написать целую книгу, жаль что некоторые инструменты и фишки не попали в поле зрение этой статьи, но будем надеяться это не последний конкурс и все еще как обычно, впереди!

PS в связи с жутким цейтнотом не хочется выкладывать полусырой шаблон на всеобщее обозрение, так что, пожалуй, я его выложу после окончания конкурса, за это время надеюсь успею все подготовить.
 

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 645
Благодарностей
455
Баллы
83
Главное не спалил)
лимиты на создание)
паузы и тд)

а так конечно хорошая статья для новичков)
 

despro

Client
Регистрация
18.09.2009
Сообщения
55
Благодарностей
8
Баллы
8
Интересная статья, спасибо.
Вопрос по партнерке. Здесь _http://www.perinstallcash.com/rates у них указаны страны с оплатой от 1 цента (много стран) до 1 доллара (США).
Мне не совсем понятно, как в данной схеме будет таргетироваться трафик под определенную страну?
Т.е. на различных ФБ акках создаются ФанПаги (кстати есть лимиты на количество создаваемых Паг с одного акка?).
Трафик подразумевается будет идти с Гугла с проиндексированных Паг, так?
Так ведь разные страны с Гугла в таком случае будут сливаться на лендинг. Поэтому и возникает вопрос, можно лить трафик на их лендиг микс-страны? (т.е. как там с этим Гугль распорядится..)
В партнерке интерес наблюдаю только по первым шести странам
USUnited States$1.00
GBUnited Kingdom$0.50
FRFrance$0.40
AUAustralia$0.40
CACanada$0.30
DEGermany$0.30
[TBODY] [/TBODY]

Канеш США самый предпочтительный вариант. Поэтому для США можно "подливать" трафик на лендинг используя ФБ Адс.
Трудно предугадать какой будет профит, надо пробовать.

Зы: ждемс рабочий шаблон, тогда можно будет попробовать регнуться по рефке.
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
хорошие вопросы:-)
я использовал порядка 100 аккаунтов. работал в 3 потока без прокси, без пауз. были баны, но достаточно редко.
трафик как с гугла, так и из внутреннего поиска по фейсбуку.
таргетировать трафик я думаю можно через ТДС, но я не использовал ее. лил микс по странам, ничего страшного.
еще я думаю, что принадлежность стране определяется по аккаунту. у меня аккаунты были американские, индусские и несколько китайских и непонятных национальностей:-) но весь контент был на английском языке. американского и индиского трафика при этом больше всего.
при этом у меня еще есть шаблон, который наполняет страницы контентом. комменты там ставит, фотографии и прочее. некоторые страницы стали похожи на блоги. люди их лайкают, обсуждают, постят к себе на стену записи. некоторые набрали по 500-600 лайков, живут самостоятельно. траик с них порядка 100 уников идет до сих пор :-)
 
  • Спасибо
Реакции: money4honey

despro

Client
Регистрация
18.09.2009
Сообщения
55
Благодарностей
8
Баллы
8
SCHNAPS, спасибо за ответ.
остался неотвеченным вопрос, сколько ФанПаг можно будет вешать на один акк?
И еще ньюанс интересует. Ты написал, что работал без прокси. Т.е. скажем акки были зареганы как амерские, ну а создавал то ты Паги, как пишешь без прокси, значит явно не с амерского АйПи, и с этим никаких проблем? Вот это для меня странно. Фейсбук не так просто омануть имхо.

Спасибо.
 

despro

Client
Регистрация
18.09.2009
Сообщения
55
Благодарностей
8
Баллы
8
а в индекс как загонял?
alekwuy, написано же, что "трафик как с гугла, так и из внутреннего поиска по фейсбуку."
Т.е. на автомате, естественным путем, т.е. как я понимаю без "загона в Гугл", он сам туда загоняеца :-).
А если хош как я написал подливать чисто Амерский траф, то наиболее удачные паги можно крутить с помощью ФБ Адс.

Удачи
 
Последнее редактирование:
  • Спасибо
Реакции: alekwuy

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
писал про лимиты в ответе, но видать стер случайно :-) лимитов я не обнаружил. вот.
загонялость само, автоматом. проблем с IP адресами не было, был суспенд аккаунтов, прошелся руками, подтвердил что это я заходил из непонятного места и все. проблема решилась.
ненадо просто вдувать разом миллион страниц и потом недоумевать за что же бан то... Открою страшную тайну успеха ботоводства 2014 - "будь человеком"
 
  • Спасибо
Реакции: money4honey и alekwuy

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
шаблон я выложу скоро :-) как доберусь. но думаю чтоб никому обидно не было после окончания конкурса. а так конечно да! лучше написать свой, потому что никакая статья тебя не научит, только практика
 
  • Спасибо
Реакции: ipetrov, izubr и alekwuy

Vasar

Client
Регистрация
08.04.2010
Сообщения
150
Благодарностей
72
Баллы
28
Спасибо за сниппет.
 

SadisT_UA

Client
Регистрация
14.12.2012
Сообщения
37
Благодарностей
8
Баллы
8
Спасибо за отличную статью, на днях буду разбирать =)
 

Evgeny

Client
Регистрация
01.03.2012
Сообщения
118
Благодарностей
9
Баллы
18
Побольше бы таких статей. Некоторые моменты не знал вообще:-)
 

smarchenko

Client
Регистрация
18.01.2014
Сообщения
92
Благодарностей
7
Баллы
8
Да, статья действительно просто замечательная. Все разжевано до мелочей. Спасибо за труды =)
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 188
Благодарностей
76
Баллы
48
В партнерке этой что написать чтобы акк заапрувили? С фейсбука принимают трафик?
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 188
Благодарностей
76
Баллы
48
При выполнения своего кода С# такая ошибка: http://imageshack.us/a/img838/8063/yqzq.png
притом даже не дает начать делать шаблон если этот экшен с кодом присутствует. Что делать?
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
потому что закралась ошибка. статья была написана в MSWord а потом просто переносилась сюда. видать вознкли "труднсти перевода"

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

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 188
Благодарностей
76
Баллы
48
А как должен выглядеть код без ошибки?
 

schnaps

Client
Регистрация
07.02.2010
Сообщения
834
Благодарностей
149
Баллы
43
судя по твоему скриншоту то между return и 0 должен стоять пробел :-)
 
  • Спасибо
Реакции: Porosenok

Sotastroy

Пользователь
Регистрация
29.10.2011
Сообщения
31
Благодарностей
1
Баллы
8
Судя по названию, зашел увидеть, как "готовится" контент. Сбор, перемешивание и подготовка текста, картинок, видео. А здесь только сниппеты, и то я не понял(или невнимательно читал), как из них получается готовый текст. Я пробовал делать свой вариант, в котором после ввода ключевого слова, открывается каждая страница из результатов поиска и с нее берется текст, разбивается на предложения, чистится и перемешивается. Но на выходе качество текста не очень. До применения в дорвеях дело так и не дошло...

Статья хорошая, читается легко. Ждем готовый шаб, заглянуть внутрь=) Спасибо за труд!
 

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