Создаем чекер аккаунтов VK.com

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
Всем привет! Думаю, многие, как и я, работают/работали с такой сетью как Вконтакте, и думаю сталкивались с такой задачей как проверка аккаунтов на работоспособность (В простонародье – чек акков на валидность).

В данной статье я бы хотел показать свой опыт для решения поставленной задачи на примере соц. сети vk.com и конечно программного комплекса ZennoPoster (ZP). При решения задачи, я хочу разобрать основы работы в ZP, т.к. у многих она вызывает затруднения, да и я тоже не сразу в ней разобрался. Когда я начинал изучать ZP, конкретные примеры применения я не находил, либо то что находил – не понимал. А что уж говорить о примерах применения, в которых рассказывают подробно для чего нужна та или иная функция. Читать теорию это одно, а применять её на практике - другое. Я решил написать такой небольшой мануал в первую очередь для новичков, поэтому если кто-то откладывал изучение ProjectMaker (PM), самое время попробовать начать с этой статьи :-)

Итак, что если аккаунтов тысячи, а нужной софтины нет под рукой? Не руками же их вбивать в браузер?

Я хочу донести и разобрать реализацию как можно подробнее, чтобы даже человек, который впервые открыл PM - смог повторить мои действия, и на примере моих шагов – создать свой чекер аккаунтов для любой соц.сети, любого сервиса, да всего любого где используются аккаунты! Это не важно, как говорится - главное уловить суть ;-)
 
Тема статьи
Соц. сети
Номер конкурса статей
Второй конкурс статей

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

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

  • Спасибо
Реакции: SocialShop

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
Часть 1. Создаём примитивный однопоточный чекер аккаунтов, без использования прокси и прочих сложностей.


Первое, с чего мы начнем, это с составления технического задания (ТЗ). На этапе составления ТЗ мы определимся так же с входными и выходными данными. Для начала, нам необходимо расписать порядок действий для работы в 1 поток.


Примечание

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

Считаю, что однопоточную программу отладить намного проще, и после отладки сделать её уже многопоточной не так уж сложно.

Насколько это правильно - не знаю и на истину опять же не претендую. Мне так удобнее.


Продолжим с нашим ТЗ.

Сначала определимся с тем что у нас есть (входные данные). А есть у нас некий TXT файлик, который я обозвал как loginpass.txt

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


Примечание

Обычно я работаю с покупными аккаунтами и все они продаются в таком виде:

Login(1): Password(1)

Login(2): Password(2)



Login(n): Password(n)

То есть, каждый акк с новой строки, а вкачестве разделителя используется двоеточие – “:”

По сути, формат может быть любой, но такой я думаю уже можно считать общепринятым стандартом.

Кому интересно, аккаунты я покупаю обычно в этих магазинах:

http://djekxa.com

http://crymore.biz

И беру именно те аккаунты, у которых в логине номер телефона (Страна чаще всего СНГ/Казахстан), а не почта. Почему именно их? У них есть своя пара плюсов:

- Они дешевле

- Мы можем зайти в этот аккаунт хоть откуда (можем использовать прокси любой страны/города).

Пример разницы в стоимости аккаунтов (Скриншот 1)

Скриншот 1

Самые дешевые аккаунты – нам хорошо подойдут.

Теперь определимся с тем, что мы хотим получить в результате работы программы (выходными данными). На выходе, как правило, получают отчет о проделанной работе.

В нашем случае нас интересуют рабочие аккаунты (т.е. те аккаунты в которые мы залогинились без ошибок). Значит на выходе мы получим текстовый файл с валидными акками (я назвал его goodaccs.txt)

Примечание

В своих проектах я использую обычно следующую структуру каталогов (Скриншот 2)

Скриншот 2


То есть - входные файлы, данные, картинки и т.д. я храню в папке «in»

Выходные данные соответственно в папке «out». Ну а сам проект – в корне папки.

Файл loginpass.txt будет лежать в папке «in», а файл goodaccs.txt в папке «out»

С входными и выходными данными мы определились. Теперь давайте распишем по шагам, как будет работать наша программа. Помимо основных пунктов, пронумерованных по возрастанию, у меня будет один дополнительный. Это пункт будет дополнительным, т.к. в проекте он будет повторяться несколько раз. Пункт, где мы удаляем первую строку их файла goodaccs.txt, я назвал его п. X (икс)

Такой вот нарисовался алгоритм:

X) Удаляем первую строку их файла goodaccs.txt и завершаем проект (End)

1) Начинаем выполнение проекта (Start), чистим куки.

2) Берем первую строку из файла с аккаунтами loginpass.txt

3) Переходим на главную страницу Вконтакте

4) Заполняем данные для авторизации (логин и пароль)

5) Нажимаем на кнопку «Войти»

6) Анализируем на наличие каптчи. Тут два варианта:

6.1) Каптча есть, разгадываем её и переходим снова к п. 6

6.2) Каптчи нет, переходим сразу к п. 7

7) Проверяем, подходят ли пара пара логин/пароль. Тут два варианта:

7.1) Логин/пароль не правильные, аккаунт НЕ валидный. Переходим к п. Х

7.2) Логин/пароль правильные! Переходим к п.8

8 ) Проверяем, страница заморожена? Тут два варианта:

8.1) Страница заморожена, аккаунт НЕ валидный. Переходим к п. Х

8.2) Страница не заморожена! Переходим к п. 9

9) Проверяем, нужен ли ввод недостающих цифр номера телефона? Варианты:

9.1) Ввод требуется.

9.1.1) Анализируем какие цифры необходимо ввести и заполняем их.

9.1.2) Проверяем, подходят ли цифры, которые мы ввели. Варианты:

9.1.2.1) Цифры подходят. Переходим к п. 9.2

9.1.2.2) Цифры не верные, а значит аккаунт равнозначен не валидному. Переходим к п. Х

9.2) Цифры уже введены верно или ввод НЕ требуется. Значит мы пришли к цели и получили валидный аккаунт!

9.2.1) Добавляем аккаунт в файл goodaccs.txt, переходим к п. X

Примечание

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

Так же, прошу заметить, что найдя валдиный/НЕ валидиный аккаунт, мы при любом раскладе удаляем первую строку из файла loginpass.txt (пункт X). Это делается для того, чтобы при следующем запуске проекта, чекер переходил в следующему аккаунту. Это как цикл, только внешний. Именно так рекомендуют делать разработчики - заменять внутренние циклы, на выполнения шаблона. То есть 1 выполнение шаблона = 1 текущий цикл внутренний. После этого проект завершается и стартует заново. Почему именно так? Потому что, в рамках выполнения шаблона ресурсы не высвобождаются, а шаблоны с большими внутренними циклами обречены на провал. Поэтому, не нужно проверять 1000 аккаунтов в рамках одного выполнения проекта, т.к. рано или поздно ZPвылетит с ошибкой о нехватке ресурсов.

Итог – 1 проверка аккаунта = 1 выполнение проекта.

Ну что ж, с «теорией» мы вроде бы как и определились. Определили, что мы будем «давать» ZennoPoster’у и что будет от него «получать». Разобрали, что будет делать по шагам наш робот, так что пора перейти к практике, а значит и реализации всего намеченного в PM.
 
  • Спасибо
Реакции: gluckbahr

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 1 Начало проекта и очистка cookies

Запускаем ProjectMaker, создаем новый проект и понимаем, что п. 1 из нашего алгоритма уж частично выполнен (Start) (Скриншот 3)

Скриншот 3

Хорошее начало работы! Нажимаем «Сохранить как», пишем имя нашего проекта (на скриншоте 2 видно, я назвал его vk_checker.xmlz). Остается только добавить экшн «Настройки» браузера (A), в котором выбрать действие «Очистить куки» и экшн «Оповещение» (B), в котором написать п. 1, чтобы не запутаться. Всё это соединить с экшеном «Start» и можно переходить к следующему пункту.
 
  • Спасибо
Реакции: SocialShop и 5nizza

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 2 Взятие первой строки из файла с аккаунтами

Итак, второй пункт нам гласит что мы должны взять первую строку из файла loginpass.txt Как же нам это сделать? Наш файл с аккаунтами – это, по сути, список. Но! Это только на первый взгляд. Так как у нас есть в нем разделитель (в начале я упоминал о двоеточии «:»), то мы можем работать с этим файлом как с таблицей. Что это нам даёт? Мы можем обращаться к отдельным полям данных и соответственно сразу раскладывать взятую строку на переменные, в частности на две – это логин и пароль. Соответственно и в PMмы будем работать с таблицей.

Для того чтобы создать новую таблицу в ProjectMaker, необходимо перетащить экшн «Таблица» (Скриншот 4)

Скриншот 4

Теперь нам необходимо привязать эту некую «виртуальную» таблицу, к нашей «реальной» таблице, то есть к нашему файлу loginpass.txt Так же в настройках необходимо показать, что в качестве разделителя мы используем в таблице двоеточие «:». Для этого, кликаем двойным щелчком мыши по только что созданной таблице, и привязываем её к файлу с аккаунтами, с такими вот настройками. Если вы все сделали правильно, и файл loginpass.txt у Вас корректный, то в колонке «А» будут отображаться Логины (Номера телефонов) а в колонке «В» Пароли построчно (Скриншот 5)

Скриншот 5


Примечание

Рекомендую ознакомиться с основами таблиц в справке для более глубокого понимания как «оно» работает. Материал в справке https://wiki.zennolab.com/doku.php?id=ru:tables

Про переменную {-Project.Directory-} могу сказать, что это переменная окружения, и хранит она в себе значение полного пути до папки с проектом. В моём случае, можно представить, что вместо переменной {-Project.Directory-} у меня там написано «С:\ZennoProjects|vk_checker», а далее уже идет путь до файла «in\loginpass.txt» внутри этой директории. Про переменные можно почитать здесь https://wiki.zennolab.com/doku.php?id=ru:variables

Так же, рекомендую для начала не забивать в файл loginpass.txt настоящие аккаунты. Потренируемся лучше на «фантиках». На таких аккаунтах (Скриншот 5), мы можем протестировать и отладить наш проект до п. 8


В принципе, с таблицей мы практически разобрались, единственное что я сделал дополнительно, это переименовал нашу таблицу в такое же имя, как и файл «loginpass.txt» добавив «table_»в начале

Таким образом, таблица получила название - «table_loginpass»

Возвращаясь к реализации п. 2 нашего алгоритма, напомню, что нам необходимо взять первую строку. Что мы собственно и делаем с помощью экшена «Операции над таблицей» (A), перетащив и настроив его. Дополнительно добавляю экшн «Оповещение» - п. 2 (B) (Скриншот 6)

Скриншот 6


Примечание

Галочку «Удалить после взятия» (C) я не ставлю, т.к. в однопоточных проектах делаю удаление дополнительным экшеном, в самом конце после получения необходимых данных, и в случае сбоя, например в середине выполнения, файл с аккаунтами будет не тронут. В многопоточных проектах делаю взятие с удалением, чтобы когда несколько потоков берут первую строку, не могли взять одинаковые строки.

По переменным, могу пояснить, что Логин у меня будет в переменной «login», а Пароль в переменной «password».


Осталось только соединить новые экшены. Теперь мы можем закрыть редактор и запустить проект с начала, проверить все ли правильно. В результате правильного выполнения проекта, в переменной «login» у нас будет Логин а в переменной «password» будет Пароль (Скриншот 7)

Скриншот 7

Ну что же, п. 2 алгоритма можно считать выполненным. Думаю, можно переходить к следующему пункту.
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 3 Переход на главную страницу Вконтакте

Третий пункт гласит, что нам нужно перейти на главную страницу в ВК, для того чтобы заполнить данные авторизации. Делается это, при помощи экшена «Переход на страницу» (A). Перетаскиваем и настраиваем его следующим образом (B) и не забываем про оповещение (C) (Скриншот 8-)

Скриншот 8


Примечание

Если Вы заметили, то URL для перехода указан - m.vk.com Это адрес мобильной версии ВК.

Почему я работаю с ней, а не с полной версией сайта vk.com ? Да потому что она проще чем полная версия, и написать проект под мобильную версию сайта чаще всего намного легче. Поэтому, при написании проекта для какого-либо сайта, рекомендую для начала ознакомиться с его мобильной версией. Возможно, что в ней уже есть все то, что Вам нужно.

Так же, для работы с мобильными версиями сайтов, рекомендую выставлять настройки так, как будто бы мы заходим с мобильных устройств (D)


Пробуем запустить проект сначала. В результате работы проекта, мы получим данные в переменных (п. 2) и перейдем на главную ВК (п. 3)

И снова поздравляю нас - очередной пункт нашего алгоритма выполнен! Переходим к реализации следующего пункта.
 
  • Спасибо
Реакции: SocialShop и 5nizza

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 4 Заполнение данных для авторизации – логин и пароль

В четвертом пункте нам необходимо заполнить данные для авторизации на главной ВК, то есть Логин и Пароль, которые мы получили, реализовав п. 2.

Взаимодействие с элементами на странице, я буду реализовывать при помощи конструктора действий. Итак, нас интересуют эти два элемента для ввода данных (Скриншот 9)

Скриншот 9


Для начала займемся полем, куда будем вводить Логин. Давайте посмотрим, какими атрибутами обладает этот элемент (предварительно написав что-то в него, например «Hello!») Для этого, щелкаем правой кнопки мыши на элементе, и выбираем «Исследовать элемент» (Скриншот 10)

Скриншот 10

Элемент называется «email», т.к. именно это значение указано в атрибуте «name». Из скриншота видно - слово «Hello!» написанное на странице и то же самое слово в атрибуте «value». То есть, изменяя атрибут «value», мы можем влиять на заполнение элемента «Phoneoremail» на странице. Нам нужно, чтобы в значении атрибута «value» оказался Логин, а именно значение переменной «login». Как это сделать?

Щелкаем правой кнопкой мыши по элементу «Phoneoremail» на странице (так же как на скриншоте 10), только теперь выбираем пункт «В конструктор действий». В результате, должно открыться вот такое окошко (Скриншот 11)

Скриншот 11

Здесь мы видим, что ищем на странице именно тот элемент, у которого в атрибуте «name», указано значение «email». Так же я красным выделил, количество совпадений (нумеруется с 0, а не с единицы). Количество совпадений показывает, сколько элементов на странице подходят под заданные нами условия, то есть, сколько элементов на странице, имеют значения «email» в атрибуте «name». В нашем случае – это один элемент.

Нужный элемент мы «поймали», теперь нужно его заполнить значением переменной «login». Для этого мы будем использовать действие «Set».


Примечание

Практически любой проект, не обходится без применения конструктора действий. Поэтому рекомендую прочитать пояснение по этому поводу здесь https://wiki.zennolab.com/doku.php?id=ru:action_constructor


Как мы выяснили, для заполнения элемента на странице, нужно изменить атрибут «value». Настраиваем конструктор действий следующим образом. (Скриншот 12)

Выбираем его из выпадающего списка атрибут «value» (1), щелкаем ПКМ и устанавливаем значение из переменной «login» (2), далее нажимаем кнопку «Тестировать» (3). И если все делано правильно, то значение из переменной «login» будет заполнено на странице (4). Действие протестировали и убедились, что все нормально работает, теперь самое время, добавить это действие в проект (5)

Скриншот 12


С заполнением пароля, проблем возникнуть не должно. Делаем всё точно так же, по аналогии. Вот мои настройки конструктора действий, перед тем как я нажал кнопку «Добавить в проект» (Скриншот 13)

Скриншот 13

Единственное отличие, которое можно заметить на этом скриншоте, от настроек заполнения логина - это то, что здесь заполнен комментарий «Вводим пароль» (a), там мы его не заполняли. Этот текст отображается в редакторе как (b). Если хотим изменить комментарий на блоке с заполнением логина, то надо нажать ПКМ на нужном «кубике», затем выбрать «Комментарий» (с) (Скриншот 13)


Примечание

Рекомендую в дальнейшем писать комментарии для блоков, т.к. в очень больших проектах, в них очень легко запутаться!


Пробуем запустить наш проект сначала (а), в результате правильного выполнения получим переход на главную ВК (b), заполненные логин (c) и пароль (d) (Скриншот 14)

Скриншот 14

Пункт 4 алгоритма можно считать выполненным! Переходим к следующему пункту.
 
  • Спасибо
Реакции: SocialShop и 5nizza

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 5 Нажатие кнопки «Войти/Login»

Пятый пункт гласит о том, что нам надо нажать на кнопку «Войти» («Login»). Опираясь на предыдущий опыт, сделаем нажатие на эту кнопку по аналогии с помощью конструктора действий. Вот мои настройки конструктора действий, для нажатия на кнопку «Login». (Скриншот 15)

Скриншот 15

Здесь все так же, как и с предыдущими элементами. Только для нажатия на кнопку, мы будем использовать действие «Rise» для установки события взаимодействия с элементом. Событие, которое нажимает (кликает) на элемент называется «Click». Тестируем, и если все работает, так как нам надо (а нам надо, чтобы нажималась кнопка «Login»), то нажимаем «Добавить в проект». Так же добавляем экшн «Оповещение»

Теперь можем запустить проект с начала, и проверить корректность работы. Пункт 5 можно считать выполненным!
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 6 Анализ наличия каптчи

Как же нам проверить наличие каптчи? Для начала нужно вызвать её появление. Как спровоцировать появление каптчи? Можно вводить много раз подряд неверную пару логин/пароль, тогда появление каптчи не заставит себя долго ждать. Чтобы не делать это руками много раз, предлагаю «зациклить» пункты 4 и 5, и запустить проект на выполнение с начала (Скриншот 16)

Скриншот 16

После ввода пароля, будет нажата кнопка «Login». Так как пароль не верный, ВК будет выдавать ошибку. То есть цикл такой:

Вводим пароль

Нажимаем «Login»

Вводим пароль

Нажимаем «Login»

Повторяем до появления каптчи. (Скриншот 17)

Скриншот 17

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

Итак, в п. 6 алгоритма, нам необходимо проанализировать, есть каптча на странице или нет? Сейчас она есть, но как это проверить программно? Если присмотреться, то можно заметить, что при появлении каптчи, на странице появляется два новых элемента – картинка с каптчей и поле для ввода результата распознавания каптчи «Entercode:». Значит, мы может справедливо мыслить, что при появлении одного из этих элементов – требуется ввод каптчи. Как это реализовать в ZP? Опять c помощью конструктора действий.

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

Мы захотим взять значение одного из атрибутов элемента «Entercode:» (в которое вводится результат распознавания каптчи)

Этот элемент содержит следующие атрибуты (ПКМ – «Исследовать элемент») (Скриншот 18-)


Скриншот 18

Если мы захотим получить значение атрибута «OuterHtml» (можно любого атрибута), а этого элемента не окажется, то у нас будет выход по «красной» ветке, а если мы получим значение атрибута, то значит элемент есть на странице – выходим по «зеленой» ветке. Вот что означает выход по зеленой и красной ветке (Скриншот 19)

Скриншот 19


Итак, чтобы добавить такое же действие по взятию значения атрибута «OuterHtml», нужно добавить элемент «Entercode:» в конструктор действий. Здесь будем использовать действие «Get», для получения значения атрибута и сохранение его в переменную. Выбрать можно значение любого атрибута, я выбрал «OuterHtml». Вот настройки конструктора действий (Скриншот 20)

Скриншот 20

Добавляем действие в проект, и делаем выход по зеленой и красной веткам, в п. 6.1 и 6.2 соответственно. Можно протестировать наш проект, и проверить, по какой ветке уходит действие при наличии каптчи, и по какой при её отсутствии. Это означает, что с шестым пунктом мы вроде бы как разобрались, переходим к его подпунктам.

п. 6.1 Разгадываем каптчу

Встретилась каптча, необходимо разгадать её. Делается в пару действий (Скриншот 21)

Щелкаем ПКМ на картинке с каптчей и выбираем «Это каптча!» (a). Выйдет форма ручного ввода, можно её закрыть, т.к. все равно будем настраивать через сервис распознавания. После, в проекте добавится новый экшн (b)

Скриншот 21


Чтобы настроить разгадывание каптчи через сервис распознавания (Скриншот 22), необходимо открыть свойства экшена и выбрать модуль распознования (a). Я выбрал модуль распознования «Anti-Captcha.dll» который предназначен для работы с http://anti-captcha.com Так же необходимо в настройках ProjectMaker указать KEY для модуля распознавания (b), который выдают при регистрации. Больше я ничего не менял.

Скриншот 22

Тут мы можем увидеть, что результат распознавания каптчи сохраняется в переменную RecognitionResult0 (c). Значит одним экшеном, мы задачу не выполнили. Каптчу мы разгадаем, но нам же еще нужно заполнить результат на странице - в поле ввода «Entercode:». Поэтому, нам нужен дополнительный экшн который выполняет это действие.

Делаем по аналогии с п. 4 и добавляем элемент «Entercode:» в конструктор действий. Чтобы заполнить результат распознавания каптчи на странице, нам необходимо изменить значение атрибута «value» (все атрибуты есть на скриншоте 18-). Чтобы изменить значение атрибута, будем использовать действие «Set». Будем заполнять значение атрибута «value» значением переменной RecognitionResult0 (тут хранится результата распознавания каптчи). Я настроил конструктор действий следующим образом (Скриншот 23)

Скриншот 23

Тестируем, добавляем в проект.

Фактически мы пункт 6.1 доделали, осталось тока нажать «Login», но если вы внимательно тестировали проект, то могли заметить, что при появлении каптчи у нас стирается введенный пароль. Поэтому, после такого как мы заполнили результат распознавания каптчи, необходимо дополнительно повторить еще одно действие – это заполнение пароля. Так как в переменной значение пароля уже хранится, то необходимо просто повторить заполнение. У нас уже есть аналогичное действие, просто перекидываем ветку на заполнение пароля в п. 4 после заполнения каптчи. Всё вместе у меня получилось так (Скриншот 24)

Скриншот 24

Получается, мы будем уходить по ветке (A) в п. 6.1 до тех пор, пока экшн (C) будет получать значение атрибута «OuterHtml». Как только значение не удастся получить (значит каптчи нет), выходим по ветке (B) в п. 6.2. Считаю п. 6.1 выполненным.

п. 6.2 Переход к п. 7.
 
  • Спасибо
Реакции: Papa777

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 7 Проверка корректности ввода логина/пароля

Когда Вы зацикливали пункты 4 и 5 (Скриншот 16), то могли заметить, как выглядит сообщение о том, что логин или пароль введены неверно. Для того чтобы вызвать такое сообщение на странице, просто введите наши «фальшивые» логин и пароль. Вот как это выглядит (Скриншот 25)

Сразу же показал, какие атрибуты содержит этот элемент если «Исследовать» его.

Скриншот 25

Назовем это сообщение «Loginfailed». Реализовывать проверку, будем так же, как и в п. 6 с каптчей. Будем пытаться взять значение любого из этих атрибутов, и если значение берется, то значит сообщение «Loginfailed» присутствует на странице (выходим по зеленой ветке, переходим к п. 7.1). Если значение атрибута не берется, то сообщения «Loginfailed» нет на странице, а, следовательно, введены верные данные авторизации (выходим по красной ветке и переходим к п. 7.2)

Добавил сообщение «Login failed» в конструктор действий, и настроил на взятие атрибута «OuterHtml» следующим образом (Скриншот 26)


Скриншот 26

Добавляем новый экшн в проект. Перед тем как двигаться дальше, хотел бы пояснить по п. X

В примечании, к алгоритму, я писал, что найдя валидный/НЕ валидный аккаунт, нам в любом случае нужно удалить его из файла loginpass.txt Можно копировать каждый раз экшн, в котором удаляем первую строку. Но что если при окончании проекта надо выполнить, например, 20-30 действий? На помощь приходит экшн из раздела логика «GoodEnd», который при условии успешного выполнения всей серии экшенов из основной серии – Start, выполняет экшены идущие с ним в связке. То есть, если любой экшн выполнен без ошибок, то после его выполнения, делается переход к «GoodEnd». Я настроил экшен «Операции над таблицей» (A), в котором удаляем первую строку из файла с аккаунтами. Далее соединил экшеном «GoodEnd» (B).

Выход по зеленой ветке (C), из экшена проверки «Login failed» я настроил на переход в п. 7.1, из которого переходим в п. X.

Выход по красной ветке (D), настроил на переход к п. 7.2, а из него в п. 8 (Скриншот 27)

Скриншот 27


п. 7.1 это просто переход к п. X, его мы реализовали.


п. 7.2 это переход к п. 8, его мы тоже сделали.
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 8 Проверка, заморожена страница или нет

Для понимания п. 8 нам не помешал бы забаненый аккаунт, например 79611219091:gmnUCebZ

Пробуем закинуть этот аккаунт в файл loginpass.txt первой строкой (Скриншот 28-)

Скриншот 28

Запускаем наш проект сначала, и ждем пока наш бот залогинится. Если все нормально, в итоге наш бот окажется на п. 8, а картина в браузере перед нами, будет следующая (Скриншот 29)

Скриншот 29

Аккаунт не валидный, но как это определить программно? Можно сделать так же, как и в предыдущих пунктах, опираясь на значения атрибутов существующих/не существующих элементов. Можно сделать немного по-другому – обычно для решения одной задачи существует несколько решений. По предыдущим примерам с конструктором действий, можно сделать такую проверку опираясь, например, на элемент (a). Вторым решением, можно сделать анализ адресной строки браузера и обнаружить там параметр «blocked» (b). Сделаем по второму методу. Получается, если мы возьмём значение из адресной строки и обнаружим в этой строке слово «blocked», то можно считать аккаунт не валидным, и переходить к п. X

Если в адресной строке нет слова «blocked», то значит страница не заморожена, а это значит можно переходим к п. 8.2, а из него в п. 9

Итак, чтобы проанализировать адресную строку, нам необходимо обратиться к переменной окружения «Page.Url», которая хранит в себе текущее значение URL адреса (Скриншот 30)

Скриншот 30

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

http://m.vk.com/login?act=blocked

Если закинуть эту строку в «Конструктор регулярных выражений» (a) и регулярное выражение взять «blocked» (b), то в результате обработки строки (a) выражением (b), мы получим результат (c). Если в адресной строке окажется любой URL, в котором нет слова «blocked» (d), то в результате обработки строки (a), мы получим пустое значение (е). (Скриншот 31)

Скриншот 31

Примечание

Про конструктор регулярных выражений, советую почитать здесь:

https://wiki.zennolab.com/doku.php?id=ru:creating-a-regular-expressions

https://help.zennolab.com/ru/v3/zennoposter/index.html?regexp_builder_interface.htm

Спасибо за очень удобный инструмент разработчикам! Так же, есть онлайн тестеры регулярных выражений, вот некоторые из них:

http://www.regexr.com/ онлайн тестер

http://www.regexper.com/ помогает разобрать рег. выражение

https://www.debuggex.com/ отладка рег. выражения

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

Например, почитать для начала можно в той же википедии https://ru.wikipedia.org/wiki/Регулярные_выражения


Что это означает, и как это нам поможет? Мы забьём наше регулярное выражение «blocked» в экшн «Данные», и будем парсить результат в переменную. В результате обработки URL регулярным выражением, у нас будет два результата:

1) Переменная окажется пустой, значит в URL нет слова «blocked». Значит страница НЕ заморожена, переходим к п. 9

2) Переменная окажется НЕ пустой, в ней будет слово «blocked». Значит страница заморожена, переходим в п. X

Вот как я реализовал это в PM следуя алгоритму (Скриншот 32)

Добавляем экшн «Данные» (A) в п. 7.2, и настраиваем его свойства (B). Результат обработки кладем в переменную TMP1 (C). Далее анализируем эту переменную экшеном условия «If» (D), забиваем в экшн «If» тождество

'{-Variable.TMP1-}' == '' (см. (E) на скриншоте)

Если тождество верное, мы переходим к п. 8.2 (F)

Если тождество НЕ верное, то переходим к п. X (G)

Скриншот 32

Примечание

По экшену «If», хочу добавить, что при сравнении текста – нкжно использовать кавычки. Подробнее о нем в разделе логика https://wiki.zennolab.com/doku.php?id=ru:logic

Получается, мы сравниваем текст (значение переменной TMP1) с «пустотой» (E). Если значение пустое, переходим к п. 8.2 (F). Если НЕ пустое, то переходим к п. X (G)

По названию переменной TMP1. Обычно, я использую в своих проектах такие переменные, которые не хранят каких-то важных данных. В начале проекта создаю две-три штуки, и при создании экшенов использую их, чтобы не плодить кучу одинаковых переменных.

п. 8 мы почти доделали, остается только проверить, как он отрабатывает на рабочем аккаунте (Скриншот 33). Забиваем в файл loginpass.txt рабочий аккаунт (a) (например 380997178288:yOHaHnQX) и запускаем проект сначала (b)

Скриншот 33

В результате работы, проект должен закончить своё выполнение на п. 9 (с), а мы должны оказаться авторизованы на ВК (d).


п. 8.1 это переход к п. X, его мы выполнили


п. 8.2 это переход к п. 9, он тоже выполнен
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
п. 9 Проверка наличия «Загадки»

В нашем случае, я взял аккаунт (Украина) и авторизовался с русского IP адреса без проблем. Но если почистить куки и попробовать зайти в этот аккаунт через прокси любой другой страны (например, Китай), или взять аккаунт другой страны (например, Казахстан) и зайти с русского IP, то мы получим следующее (Скриншот 34)

Скриншот 34

Это небольшая защита ВК. То есть просто нужно ввести недостающие цифры, которые у нас в логине. Назовем это – «Загадка», которую необходимо разгадать.

Итак, нам нужно проверить, нужен ли ввод недостающих цифр? Как это сделать? Я уже показывал, как можно делать такие проверки двумя способами. Можно опираться на различные элементы страницы (Блок сообщения, кнопка, поле ввода, картинка и т.д.), а можно опираться на текущий URL (в п. 8 я показал на примере текущего URL, в котором содержится слово «blocked»).

На скриншоте 34 видно, что в текущем URLесть то, за что можно «зацепиться» J

Текущий URL - http://m.vk.com/login.php?act=security_check&to=&al_page=

Давайте сделаем по аналогии с 8 пунктом, только в этом случае возьмем из URL - «security_check». Будем брать значение из адресной строки и проверять, есть ли в этой строке слово «security_check»

Если есть, то значит перед нами «Загадка», будем переходить к п. 9.1 и далее по подпунктам.

Если нет, то значит и загадки нет, а это значит переходим к п. 9.2 и далее

В PM я так же добавил 2 экшена (Скриншот 35):

- экшн «Данные» (a), в котором мы берем текущий URL (b) и парсим результат по рег. выражению «security_check» (c) в переменную TMP1 (d). Предварительно, я проверил регулярку «security_check» в конструкторе (e)

- экшн «If» (f), в котором мы сравниваем текст (значение переменной TMP1) с «пустотой» (g)

Выход по зеленой ветке (TMP1 пусто, «security_check» в URLнет, «загадки» нет), я настроил в п. 9.2 (h)

Выход по красной ветке (TMP1 НЕ пусто, «security_check» в URLЕСТЬ, «загадка» ЕСТЬ), я настроил в п. 9.1 (i)

Скриншот 35


Итак, чтобы протестировать п. 9 на практике, пробуем запустить с экшена «Оповещение» (a). Если «загадка» обнаружена, то проект должен закончить выполнение на экшене п. 9.1 (b) т.к. требуется ввод недостающих цифр (c) (Скриншот 36)

Скриншот 36


п. 9.1 Ввод требуется


п. 9.1.1 Анализ и заполнение недостающих цифр номера телефона

Давайте бегло проанализируем каких цифр не хватает. Аккаунт, который я использую 77712021747:danil1998

Номер телефона 77712021747. Невооруженным глазом видно, что не хватает цифр «7120217», а цифры которые мы должны отсечь – это «77» слева и «47» справа. Реализуем это в PM.

Понажимав в нужных местах на странице «Исследовать элемент», выяснил что нужно выдернуть и почистить данные от мусора из элемента (a) и (b). Их свойства я показал рядом, нас интересуют значения атрибута «InnerHtml» (с) у обоих элементов (можно использовать OuterHtml, но там вроде как мусора по более будет). После, нужно из номера телефона убрать такие же цифры слева и справа. Далее остаётся заполнить недостающие цифры в поле ввода (d) изменив значение его атрибута «value» (e) и нажать кнопку «Подтвердить» (f) (Скриншот 37)

Скриншот 37

Будем использовать действие «Get» для этих целей. Добавляем по очереди в конструктор действий элементы (a) и (b) (Скриншот 38-).

Далее (Скриншот 38-) настраиваем конструктор (A) и (B) для обоих элементов, с разницей в номерах совпадений (C) и (D). Затем у экшенов (E) и (F), которые создал конструктор действий, меняем свойство «Положить в переменную» на TMP1 (G) и TMP2 (H) соответственно. Цифры, которые слева будут в TMP1, цифры справа в TMP2.

Скриншот 38

После выполнения этих новых экшенов, в переменных будут следующие значения (Скриншот 39)

{-Variable.TMP1-} = +380

{-Variable.TMP2-} =  88

Скриншот 39

Нужно почистить их от мусора. Сделать можно с помощью обычных текстовых замен, экшн «Обработка текста» (A). В переменной TMP1 (B) заменяем «+» (C) на пустоту, а во второй переменной TMP2 (D), заменяем « » (E) (Скриншот 40)

Скриншот 40

Примечание

Забегая вперед хочу сказать, что бывают случаи, когда помимо « », в цифрах могут быть еще пробелы, которые могут встречаться как слева, так и справа. Значит, текстовую замену « » нужно делать для обоих переменных (+1 экшн). Замену «+» делаем только для TMP1, т.к. в цифрах справа он не встречается. Уже 3 экшена, далее нужно почистить обе переменные от пробелов (+2 экшена). Итого 5 экшенов, для не сложной обработки текста. А если нужно будет очень много замен? Упростим.

В экшене «Обработка текста» существует замена по рег. выражению (A), используя которую, мы можем сократить число экшенов до двух (для левой части (B) и правой части (C))

Поэтому, я переделал замены используя рег. выражения (Скриншот 41)

Скриншот 41

После «зачистки» (Скриншот 42), в переменной TMP1 у меня стало значение – «380» (A), а в TMP2 – «88» (B). Теперь эти цифры нужно убрать из номера телефона (переменная {-Variable.login-}), чтобы получить недостающие цифры. Предварительно я копирую значение переменной {-Variable.login-} в переменную {-Variable.TMP3-} (C), и далее уже работаю с ней. Для этого использую экшн «Обработка переменных». Затем можем сделать опять же с помощью обычной текстовой замены, то есть «380» (TMP1) и «88» (TMP2) заменить на «» (пустоту). Но!

Если будет номер, например, «38038011212» или «3801238888», то тогда проект отработает не правильно, так как нам нужна замена для «380» именно в начале строки. Для цифр слева нам поможет настройка «Первое» (D), которая уберет только первое совпадение, и в случае с номером «38038011212», после обработки вернет нам «38011212». Для цифр справа, нам поможет настройка «Одно совпадение», в которой мы выберем значение «Последнее» (E). Поэтому, если попадется в виде исключения номер «3801238888», результат обработки правой части получится «38012388» - то, что нам и нужно. И то, и другое можно сделать через регулярные выражения. Я реализовал эти действия в PM без них, т.к. количество экшенов это бы не уменьшило (Скриншот 42)

Скриншот 42

После выполнения этих действий, в переменной TMP3 и есть нужная нам «разгадка» (F), остается только ввести её в поле ввода.

Поле ввода показано на Скриншоте 37 (d), чтобы его заполнить, нужно изменить значение атрибута «value» (e).

Делаем так же, при помощи действия «Set» в конструкторе действия (Скриншот 43), заполняем значение атрибута «value» значением переменной TMP3 (A), где хранятся недостающие цифры номера телефона.

Скриншот 43

Добавляем этот экшен в проект, тестируем – если заполняет цифры, то всё хорошо.

Теперь осталось кликнуть по кнопке «Подтвердить», для этого используем действие «Rise» и событие «click» (Скриншот 44)

Скриншот 44

Только перед там как нажать кнопку «Подтвердить», попробуем вручную изменить «отгадку» на неверную, чтобы еще кое-что «отловить». Итак, мы плавно перешли к следующему пункту


п. 9.1.2 Проверка корректности ввода недостающих цифр

Если мы введём недостающие цифры не верно (A), то мы увидим сообщение (B), которое мы можем взять за основу проверки.

(Скриншот 45)

Скриншот 45

Такую же проверку я подробно рассматривал в п. 6 с отлавливанием каптчи. Делается в 1 экшн. Добавляем сообщение в конструктор действий (С) и перед добавлением экшена в проект, настраиваем на взятие значения любого атрибута (D).

После добавления экшена в проект, я настроил выход по «зеленой» в п. 9.1.2.2 и затем в п. X

Выход по «красной» ветке в п. 9.1.2.1, а из него в п. 9.2 (Скриншот 46)


Скриншот 46

п. 9.1.2.1 Цифры подходят переходим к п. 9.2 - сделано

п. 9.1.2.2 Цифры НЕ подходят, переходим к п. X - сделано

п. 9.2 Цифры уже введены верно или ввод НЕ требуется, переходим к след. пункту

п. 9.2.1 Добавление в файл goodaccs.txt валидного аккаунта

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

Если все правильно, то должно перекинуть на п. 9.1.2.1 затем 9.2

Остается только добавить экшн, который будет закидывать валидный аккаунт в файл goodaccs.txt

Сделать можно при помощи экшена «Файлы» (A), который настраивается на добавление аккаунтов, в том же формате, в котором их взяли. То есть добавляем построчно через двоеточие переменные «login» и «password» (B) (Скриншот 47)

Скриншот 47

Теперь можно считать примитивный однопоточный чекер готовым. Проверяем, тестируем, можем использовать под свои нужды ;-)
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
Хотелось бы добавить, что при написании статьи я старался очень подробно все объяснить и показать. По сути, статья рассчитана действительно на тех, у кого совсем нет опыта работы с автоматизацией и прочим. Я постарался рассказать про основы, которых мне не хватало в своё время при освоении это замечательной программы.

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

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

Удачного и прибыльного Вам 2015 года!
 

azamat

Client
Регистрация
06.04.2014
Сообщения
16
Благодарностей
3
Баллы
3
Огромный труд, но не читабельно, в видео формате было б лучше.
 

execut0r

Client
Регистрация
12.03.2014
Сообщения
259
Благодарностей
270
Баллы
63
Многое бы отдал за это в свое время.
Разжевано все с ссылками как надо.
Хороший труд для новичков.
 

creastuff

Client
Регистрация
12.12.2013
Сообщения
5
Благодарностей
3
Баллы
3
А сам шаблон где? :bk:
 

zennoX

Client
Регистрация
05.04.2014
Сообщения
482
Благодарностей
131
Баллы
43
оооочень подробно, даже излишне, новичку нужно будет очень захотеть, чтобы осилить все это. как сказали выше - в видео файле было бы лучше, да и вам раз 10 меньше трудозатрат.


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

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
Спасибо Вам, что не пишите - "Зачем написал? Статья ни о чем!" и т.д. А то почему-то я думал, что у кого достаточно опыта в разработке, именно так и напишут :bt:
А сам шаблон где?
Закину сегодня, хотя нужен ли он... :-)
оооочень подробно, даже излишне, новичку нужно будет очень захотеть, чтобы осилить все это. как сказали выше - в видео файле было бы лучше, да и вам раз 10 меньше трудозатрат.
Думал видео сделать, но вроде как все статьи в текстах пишут, поэтому тоже так сделал :bk: А насчет видео, действительно можно было очень коротко все сделать и может даже понятнее было бы. Но так как писал вообще в первый раз, меня очень затянуло и поглотило в этот процесс, поэтому сильно не ругайте за мою первую статью :D
Кстати, проверку наличия текста в урле или где бы то ни было можно очень быстро сделать так:
выделяем любой текст на странице и делаем как обычно "создать проверку бла-бла",
после создания группы экшенов зайти в нужный и поменять место поиска на url и текст на нужный,
и не нужно будет вручную выстраивать цепочки переменных.
Конечно можно :ay:Я тоже давно заметил, что практически у любой задачи - есть как минимум два решения (о чем писал в статье)
Может просто я решил, что так будет понятнее для новичка :dz:
 

Petr Sliva

Пользователь
Регистрация
03.11.2014
Сообщения
40
Благодарностей
4
Баллы
8
зачет, огромное спасибо...очень много ответов на мои вопросы в одном:bt:
 

Petr Sliva

Пользователь
Регистрация
03.11.2014
Сообщения
40
Благодарностей
4
Баллы
8
вопрос..что то у меня в лайт версии, не распознает капчу на мобильные устройства...это ошибка или так задумано
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
зачет, огромное спасибо...очень много ответов на мои вопросы в одном:bt:
Очень приятно слышать, что кому-то помогла моя статья и труды не напрасны!
вопрос..что то у меня в лайт версии, не распознает капчу на мобильные устройства...это ошибка или так задумано
Не совсем понятен вопрос, если хочешь помощи - опиши подробнее пожалуйста, и скриншот бы не помешал...
 
  • Спасибо
Реакции: LightWood

Petr Sliva

Пользователь
Регистрация
03.11.2014
Сообщения
40
Благодарностей
4
Баллы
8
я начал писать все пошагово как ты писал...и возникла проблема с капчей...не хочет работать....
а когда я переписал для компьютерного браузера все заработало сразу.....вопрос ..может в лайт версии программы(у меня)...капча при написании бота для мобильной версии браузера не работает ..или у меня в проге баг:bc:

п.с. всю новогоднюю ночь читал и писал:ca:
 

Petr Sliva

Пользователь
Регистрация
03.11.2014
Сообщения
40
Благодарностей
4
Баллы
8
мне надо в вк ..чтоб 100 пользователей кидали рекламу по нужным группам...с парсером понятно.... с текстом все понятно, а как одну и ту же фотку кидать в рекламу...не знаю механизма..если можно объясните как для новичка..заранее спасибо:bh:
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
вопрос ..может в лайт версии программы(у меня)...капча при написании бота для мобильной версии браузера не работает ..
Исключено! Использование эмуляции мобильного браузера/ОС никак не влияет на разгадывание каптчи.
Ошибка какая в логах?
а как одну и ту же фотку кидать в рекламу...не знаю механизма..если можно объясните как для новичка..заранее спасибо:bh:
Каждый раз прикреплять фото. Картинки можно заранее размножить, хотя бы чтоб они разрешением отличались.
 

Petr Sliva

Пользователь
Регистрация
03.11.2014
Сообщения
40
Благодарностей
4
Баллы
8
Каждый раз прикреплять фото. Картинки можно заранее размножить, хотя бы чтоб они разрешением отличались.
я неправильно задал вопрос....если у меня больше ста живых акков, я же не могу загрузить в каждый по нужной мне фотке.
Вопрос. как ускорить процесс загрузки фото в нужный мне пост....и откуда лучше...если вы знаете?
 

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
если у меня больше ста живых акков, я же не могу загрузить в каждый по нужной мне фотке.
Почему не можешь, не вижу преград! Просто не понятно, о какой рассылке идет. Со ста аккаунтов рассылать сообщения на стену, правильно?
Вопрос. как ускорить процесс загрузки фото в нужный мне пост....и откуда лучше...если вы знаете?
Что значит ускорить, для чего? Если каждый раз прикреплять фото к посту, то не так уже это и долго. Либо мы друг друга совсем не понимаем...
Как второй вариант, можно загружать фоты через их API...
 

mysambir

Client
Регистрация
15.12.2014
Сообщения
32
Благодарностей
4
Баллы
8
Отличная статья. Несколько моментов новых узнал. Спасибо автору за труд!
 
  • Спасибо
Реакции: goblin2oo8

dreamlant

Client
Регистрация
05.01.2015
Сообщения
117
Благодарностей
20
Баллы
18
Спасибо автору огромное!
но если выполнить готовый проект, то в goodaccs.txt валидные не записываються
 
  • Спасибо
Реакции: goblin2oo8

goblin2oo8

Client
Регистрация
27.08.2013
Сообщения
93
Благодарностей
95
Баллы
18
  • Спасибо
Реакции: dreamlant

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