- Регистрация
- 01.05.2014
- Сообщения
- 228
- Благодарностей
- 220
- Баллы
- 43
Эгэй!! Всем КУ Пацаки )))).
Вот и я решил отметится в конкурсе. Тут не будет истории успеха, палево тем и всякой чепухи. Только хардкор, только жесткий и брутальный технический мануал.
Итак, к делу!! Я бы хотел с вами обсудить такой момент:
- Где вы держите зенопостер? на своем ПК/Ноутбуке? На ВДС с виндовс?
- Как часто зенка требует вашего внимания? Как часто вы можете себе позволить отлучится от компа и почему?
- Вы вообще контролируете работу, особенно баги в шаблонах и как вы это делаете?
- У всех ваших шаблонов однотипная структура файлов, или все валяется как попало?
- Если вы продаете свои шаблоны: А вы знаете какой шаблон запускается чаще всего?
- Зачем вам отчеты о работе шаблонов, вы их как-то анализируете?
Сейчас все мои шаблоны выглядят так:
Как писать в таком стиле полнофункциональный шаблон это целая наука а именно изучение C#, но вот с чего начинается мой шаблон и чем он заканчивается читайте далее.
Держите логичный порядок в своих рабочих файлах.
У меня все шаблоны создают директорию с названием шаблона в том каталоге, в котором находится сам шаблон. Еще я использую 2 переменные (текущая дата, проект), для систематизации и рабочих, и выходных файлов шаблона. Для разных проектов и задач я использую свою иерархию(в разрезе проектов, в разрезе дат, в разрезе дата-проект). Все мои шаблоны содержат входные настройки с текстовым полем "Проект" ОБЯЗАТЕЛЬНО!
Но думаю не стоит тут разводить демагогию на предмет как правильно и как не правильно делать, я просто показываю как это делаю я.
Вот кусок кода с комментариями, отвечающий за эту часть:
C#:
//чистим куки и кешь
instance.ClearCookie();
instance.ClearCache();
//получаем текущую дату
string dt = DateTime.Now.ToShortDateString();
project.Variables["data"].Value = dt;//Дату передаем в переменную проекта, я ее использую для формирования отчетов, названий файлов.
// end
//переменные шаблона
string prnam = project.Name; //имя проекта это то как назвается фаил шаблона например test.xmlz
string prdir = project.Directory; //директория проекта, не путайте с папкой шаблона, она на уровень выше. это тот коталог в котором лежит шаблон.
string path = "";//путь, используем для создания директорий
// end
//создаем папку с названием шаблона в директории проекта
string prnam1 = Regex.Match(prnam, @".*?(?=\.)").ToString();
project.Variables["prtName"].Value = prnam1.ToString();// название шаблона отправляем в переменную проекта, она нам пригодится, допустим для составление лога-отчета
path = prdir + @"\" + prnam1 + @"\" + project.Variables["projectName"].Value;//это путь до папки с названием проекта указанным в настройках
DirectoryInfo dir = new DirectoryInfo(path);
dir.Create();//Создаем директорию
project.Variables["projectDir"].Value = path.ToString();// полный путь до папки проекта переносим в переменную проекта, по этому пути мы будем записывать разные файлы косающиеся работы шаблона.
project.Variables["shabDir"].Value = prdir + @"\" + prnam1+@"\"; // директория самого шаблона тоже переносим в переменную проекта. Я допустим в какихто проектах веду черные списки в разрезе проектов указанных в настройках, а в какихто сквозной чс.
//------------------------------------------------------------------------------------------------------//
// Проверки входных настроек и содержания файлов, для разных шаблонов проверки будут разные
// это делается для исключения рукожопости пользователя, или когда вы решите намайнить бабло в пьяном угаре и накосячите :)
/*
if (!File.Exists(project.Variables["listUsers"].Value))
{
throw new Exception(":: Фаил с ИД не указан или не существует! Исправте настройки!"); // сообщим юзеру о проблеме и завершим работу выход по красной
}
if (Convert.ToInt32(Macros.FileSystem.FileCountOfLines(project.Variables["listUsers"].Value))<100){
throw new Exception(":: Фаил с ИД кого отмечать содержит менее 100 строк, добавте строки!!!"); // сообщим юзеру о проблеме и завершим работу выход по красной
}
if (!File.Exists(project.Variables["filePic"].Value))
{
throw new Exception(":: Фаил с фотками не указан или не существует! Исправте настройки!"); // сообщим юзеру о проблеме и завершим работу выход по красной
}
if (Convert.ToInt32(Macros.FileSystem.FileCountOfLines(project.Variables["filePic"].Value))<2){
throw new Exception(":: Фаил с фотками содержит 1 строку, добавте строки!!!"); // сообщим юзеру о проблеме и завершим работу выход по красной
}*/
// конец проверкам
// возмем прокси если есть
var proxylist = project.Lists["proxy"]; // запихаем содержание списка прокси в переменную
if (proxylist.Count>0){
lock(SyncObjects.ListSyncer){//всегда блокируйте списки при работе во много потоке
string proxy = proxylist[0];//берем прокси
proxylist.RemoveAt(0);//удалям
proxylist.Add(proxy);//вернем в конец
project.Variables["proxy"].Value = proxy.ToString();//отправим прокси в проект, чтоб использовать в других кубиках
}
}
else
{
project.SendInfoToLog("Работаем без прокси!!!", true);//из содержания понятно что мы пишем в лог окно зенопостера
project.Variables["proxy"].Value = "127.0.0."+new Random().Next(1,5).ToString();// удалите эту строку Если будите использовать этот сниппет в своих шаблонах
}
// поработаем с аккаунтом
string account = "";// тут будет лежать текст вида ЛОГИН:ПАРОЛЬ
string pass = ""; //Сюда положим пароль
string login = "";//Сюда положим логин
var accountList = project.Lists["akk"];//подцепим список аккаунтов
if (accountList.Count>0){//проверим чтоб там были строки
lock(SyncObjects.ListSyncer){//всегда блокируйте списки при работе во много потоке
account = accountList[0];//берем аккаунт
accountList.RemoveAt(0);//удалям
accountList.Add(account);// удалите эту строку Если будите использовать этот сниппет в своих шаблонах
//тут аккаунт не возвращается обратно в список, если он не валидный мы его записываем в другом файле
login = Macros.TextProcessing.Split(account,":","0").First();//разделяем строчку получая логин
pass = Macros.TextProcessing.Split(account,":","1").First();//разделяем строчку получая пароль
}
}
else throw new Exception(" :: Не указан фаил аккаунтов, или он не содержит ни одной строки.");//вызываем исключение, полная остановка шаблона.return "OK";
project.Variables["login"].Value = login.ToString();//тут логин передается в переменную проекта
project.Variables["pass"].Value = pass.ToString();//тут пароль передается в переменную проекта
/*
ВАЖНО!!!! не забудьте записать логин и пароль от аккаунта обратно в файл или в файл с невалидными аккаунтами
Я записываю логины и пароли одной строкой
Macros.FileSystem.FileAppendString(shabDir+proverka+".txt", login+":"+pass, true);//запишем логин пароль в соответсвующий файл
переменная proverka это результат работы функции проверки после авторизации на сайте, на разных сайтах она принимает разные значения,
но я стараюсь использовать всего 4 значения
VALID - рабочий аккаунт
noValid - не рабочий аккаунт не верный логин пароль
SMS - аккаунт требующий подтверждения по СМС
BAN - аккаунт забанен сайтом
*/
ЛАЙФХАК: Оценивайте на сколько популярен ваш шаблон!!!
Когда продажи моих шаблонов перевалили за первую сотню, я решил, что нужно распределить мои шаблоны по приоритету поддержки, т.е. шаблоны, которыми чаще пользуются, имеют более высокий приоритет на устранение багов, соответственно, чем реже шаблон используется, тем ниже приоритет. Вы думаете количество продаж покажет реальную картину использования шаблонов? Конечно нет. У меня был клиент который скупил все мои шаблоны, пачкой, а это было 12 шт * 1800 рублей(среднее) и он не пользовался ими, запустил пару раз и все. Ну а потом, как я и предположил, на рынке появились клоны моих шаблонов ))).... Но сейчас не об этом. Хотите себе такую же картинку в метрике (или любом другом веб счетчике)?
C#:
string url ="http://counter111.blogspot.ru/";//замените на свой сайт
instance.ActiveTab.Navigate(url+"?from="+project.Variables["prtName"].Value,""); // этой строкой мы открываем вкладку и переходим на сайт содержащий метрику
- Заводим блогспот, ну или любой другой сервис создания сайтов с возможностью редактировать HTML или подключать счетчики статистики типа Я.Метрика. Главное условие чтобы выбранный сервис смог удержать трафик, который вы сгенерите со своих шаблонов. (Кстати, этот трафик можно использовать как бот траф для прокачки статы ))))). Еще вариант иметь свой хостинг или ВПС/ВДС.
- В блогспот вставляем код счетчика.
- В шаблон вставляем снипет.
Счетчики мониторят с каких УРЛ заходят на ваш сайт, а вы в шаблоне открываете ТАБ с УРЛ содержащим метку from. Ну и, в итоге, посмотрев отчет по меткам вы получите реальную статистику работы своих шаблонов. Я думаю, вы будете удивлены )))))). Если вам необходимо собирать более детальную статистику, то можно использовать УТМ метки
Вот вам и 300к ботов на ваш сайт
Анализируйте отчеты по работе шаблонов!
Все мои шаблоны пишут логи в txt/csv файлы локально, но еще .......
ГТ - на столько мощный инструмент, что ими можно вообще заменить базу данных, правда есть ограничения на 50к строк в одной таблице, меня это ограничение вполне устаревает ))), ну а если вам оно не подходит, то в предыдущих конкурсах, да уже и в этом, есть пара статей как работать с базами данных типа MySQL.
Сразу вам пример таблички, чтобы вы могли посмотреть в живую. ПРИМЕР ТАБЛИЦИ
Скачайте шаблон прикрепленный к этой статье и просто его запустите, увидите как меняются данные.
Ну расскажу как сделать себе такой же отчет.
Перво наперво нам понадобится сама гугло табличка, можете скопировать пример, можете создать новую (я уверен, что все читатели уже умеют создавать гугло таблички и у всех есть гуглоАКК, да не один )
Затем вам нужно создать форму привязную к этой табличке, писать буквы не буду, смотрите картинку:
Далее в самой форме нужно создать нужное вам количество текстовых полей, смотрите картинку:
Как только ваша форма будет готова, вам нужно будет нажать кнопку "Просмотр" - это газ на верху справа. И скопировать полный УРЛ адрес вашей формы.
Этот УРЛ нужно будет указать в настройках шаблона, и вы получите лог файл работы шаблона, который доступен с любого устройства в любом месте, где бы вы не находились .
А что нужно писать в шаблоне? Спросите вы! Вот вам два куска кода (в приложенном шаблоне они оба находятся в одном C# сниппете)
1. Первая часть кода делает ГЕТ запрос на вашу форму и разбирает ответ для составления следующего запроса:
C#:
string GASurlForm = project.Variables["GASurlForm"].Value; // возмем полный урл формы из настроек
string proxy = project.Variables["proxy"].Value; // возмем прокси из проекта, прокси может быть и пустой )))
string[] heders = {};// тут можно прописать заголовки которые отправляются при запросе, в данном конкретном случае можно обойтись без них.
// получим тело формы, что бы его разобрать, и сформировать тело пост запроса на эту форму
// данное действие позволяет отправлять данные на любую гуглоформу без редактирования кода шаблона ну и поиска нужных соотвествий в форме. Автоматизация епта!
if (GASurlForm !=""){//обязательно проверим, есть ли ссылка на форму, а то мало ли че :)
string response = ZennoPoster.HttpGet(GASurlForm,proxy,"UTF-8",InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"","",true,3, heders ,"",true);
// начинается магия, разбираем полученую форму на кусочки
string GASurlPostForm = Regex.Match(response,"(?<=action=\")htt.*?(?=\")").ToString();//тут получаем УРЛ для пост запроса
//теперь получим поля формы
List<string> list = new List<string>(); // тут создадим лист в который потом запихаем наши поля entry которые нужны для отправки запроса
list.AddRange(Regex.Matches(response,@"(?<=name="")entry\..*?(?="")").Cast<Match>().Select(x=>x.Value).ToList()); // данная строчка добовляет в наш список, то что нашли регуляркой
//ну вот , все что нам нада получили теперь готовим пост запрос.
C#:
/*а можно по другому*/
List<string> listdata = new List<string>();
/*это тестовые данные для примера*/
listdata.Add(project.Profile.Login);
listdata.Add(project.Profile.Password);
listdata.Add(project.Variables["proxy"].Value);
listdata.Add("ЗАДАНИЕ "+ new Random().Next(1,5).ToString());
listdata.Add(new Random().Next(0,3).ToString());
listdata.Add(project.Variables["projectName"].Value);
listdata.Add(project.Variables["prtName"].Value);
/*конец тестовым данным*/
int[] b = {list.Count,listdata.Count};//создаем масив чисел чтобы выбрать минимальное b.Min();
string data = "";
if (list.Count>0){//если в форме есть поля для заполнения делаем
for(int i=0; i< b.Min(); i++){
//b.Min() берем то самое минимальное значение данных которое отправляем в гугл, если
//в форме не будет хватать полей то заполним только то что имеем
//в этом цикле мы проверяем чтобы у формы были поля и чтобы не добавить лишних данных
//А так же кодируем в урленкодинг данные, потому что гугл капризный ска
data += list[i]+"="+HttpUtility.UrlEncode(listdata[i])+"&";
}
data = data.Substring(0,data.Length-1);//убрать последний знак &
response = ZennoPoster.HttpPost(GASurlPostForm,data,"application/x-www-form-urlencoded",proxy,"UTF-8",InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"","",true,3,heders,"",true);
}
//все, данные отправили. По идеи после каждого запроса нужно проверять ответ, на удачное выполнение действия. Но исходя из моей практики в конкретном месте такой необходимости нет.
//я еще записываю отчет в лог .csv фаил и делаю это вот так
Macros.FileSystem.FileAppendString(project.Variables["projectDir"].Value+@"\"+project.Variables["data"].Value+"отчет.csv",string.Join(";",listdata), true);
//project.Variables["projectDir"].Value+@"\"+project.Variables["data"].Value+"отчет.csv" - это мы составили путь к файлу отчета,
//string.Join(";",listdata) - это мы обеденили все элементы списка listdata в одну строку и разделили знаком ";",
//true - сказали что нужно добавить перенос строки в фаил
}
Подбираемся к самому концу! Собирайте ЛОГИ ошибок!
Об этом уже писали в предыдущих конкурсах, но у меня свое решение, которое позволяет отслеживать ошибки работы шаблона в режиме реального времени. Догадайтесь где я собираю лог ошибок в шаблонах? ..... Правильно в гугл таблице, для примера я не стал делать отдельную табличку, так что вы можете посмотреть на соседних листах как я собираю ошибки. Ну а сниппет вот:
C#:
string GASurlForm = @"https://docs.google.com/forms/d/e/1FAIpQLSeBqnQgdDWflIhhurO-PZws_jxJNryQyWVMYfhZOsoHuYTXEQ/viewform"; // возмем полный урл формы для записи ошибок
string proxy = ""; // возмем прокси из проекта, прокси может быть и пустой )))
string[] heders = {};// тут можно прописать заголовки которые отправляются при запросе, в данном конкретном случае можно обойтись без них.
// получим тело формы, что бы его разобрать, и сформировать тело пост запроса на эту форму
// данное действие позволяет отправлять данные на любую гуглоформу без редактирования кода шаблона ну и поиска нужных соотвествий в форме. Автоматизация епта!
if (GASurlForm !=""){//обязательно проверим, есть ли ссылка на форму, а то мало ли че :)
string response = ZennoPoster.HttpGet(GASurlForm,proxy,"UTF-8",InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"","",true,3, heders ,"",true);
// начинается магия, разбираем полученую форму на кусочки
string GASurlPostForm = Regex.Match(response,"(?<=action=\")htt.*?(?=\")").ToString();//тут получаем УРЛ для пост запроса
//теперь получим поля формы
List<string> list = new List<string>(); // тут создадим лист в который потом запихаем наши поля entry которые нужны для отправки запроса
list.AddRange(Regex.Matches(response,@"(?<=name="")entry\..*?(?="")").Cast<Match>().Select(x=>x.Value).ToList()); // данная строчка добовляет в наш список, то что нашли регуляркой
//ну вот , все что нам нада получили теперь готовим пост запрос.
//укажим случайные данные дляотправки в ГУГЛ форму, вот вам та как раз и нужно тут указать те переменные проекта которые вы хотите отправить в гугл.
List<string> listdata = new List<string>();
listdata.Add(project.GetLastError().ActionId+new Random().Next(0,4).ToString());
listdata.Add(project.Variables["prtName"].Value+new Random().Next(0,2).ToString());
int[] b = {list.Count,listdata.Count};//создаем масив чисел чтобы выбрать минимальное b.Min();
string data = "";
if (list.Count>0){//если в форме есть поля для заполнения делаем
for(int i=0; i< b.Min(); i++){ // b.Min() берем то самое минимальное значение данных которое отправляем в гугл, если в форме не будет хватать полей то заполним только то что имеем
//в этом цикле мы проверяем чтобы у формы были поля и чтобы не добавить лишних данных
//А так же кодируем в урленкодинг данные, потому что гугл капризный ска
data += list[i]+"="+HttpUtility.UrlEncode(listdata[i])+"&";
}
data = data.Substring(0,data.Length-1);//убрать последний знак &
response = ZennoPoster.HttpPost(GASurlPostForm,data,"application/x-www-form-urlencoded",proxy,"UTF-8",InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"","",true,3,heders,"",true);
}
//все, данные отправили. По идеи после каждого запроса нужно проверять ответ, на удачное выполнение действия. Но исходя из моей практики в конкретном месте такой необходимости нет.
}
Я почти закончил, осталось рассказать как делать красивые отчеты.
Я уже говорил, что гугол таблици мощный инструмент. У них есть такая функция называется QWERY, вот как раз ее использование и дает возможность делать красивые отчеты.
Более подробно о QWERY можно почитать ТУТ, ТУТ, и ТУТ.
Что мы имеем в итоге?
Ребятки, у меня реально не хватает времени на личные дела, даже сейчас, потому что, освободившееся время я направляю на новые теории эксперименты и т.п. Все те вопросы которые я задавал в начале топика, возникают у каждого кто работает в СММ арбитраже, или иных онлайн сферах. Используя знания и шаблон из этой статьи вы снимите с себя как минимум 50% гемороя, это мое ИМХО.
ПС: Диман держи алаверды: Как раз Димка Юниор, в свое время заставил меня купить ЗеноСтандарт, чтобы продать ему, точнее его конторе Шаблон по Постингу на АВИТО. Диман СПАСИБ!
ППС: Говорил что палить темы не буду, но сам спалился, править топик уже не буду, самые внимательные поймут. Остальные лесом.
ПППС: За ошибки прошу простить, у меня всегда были проблемы с русским языком.
- Тема статьи
- Другое
- Номер конкурса статей
- Шестой конкурс статей
Вложения
-
79,3 КБ Просмотры: 6 682
-
28,3 КБ Просмотры: 7 586
-
41,9 КБ Просмотры: 572
-
36,2 КБ Просмотры: 6 647
-
27,5 КБ Просмотры: 6 513
-
54,6 КБ Просмотры: 6 798
-
147,6 КБ Просмотры: 6 939
-
990,7 КБ Просмотры: 9 351
Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование: