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

goblin2oo8

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

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

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

Я хочу донести и разобрать реализацию как можно подробнее, чтобы даже человек, который впервые открыл PM - смог повторить мои действия, и на примере моих шагов – создать свой чекер аккаунтов для любой соц.сети, любого сервиса, да всего любого где используются аккаунты! Это не важно, как говорится - главное уловить суть ;-)
 
Номер конкурса статей
  1. Второй конкурс статей
Тема статьи
  1. Соц. сети
  • Спасибо
Реакции: SocialShop
Часть 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)
pc6JUP6icUk.jpg

Скриншот 1

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

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

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

Примечание

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

Скриншот 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
п. 1 Начало проекта и очистка cookies

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

Скриншот 3

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

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

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

Скриншот 4

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

Скриншот 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)
7bfRgCpbDgk.jpg

Скриншот 6


Примечание

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

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


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

Скриншот 7

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

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

Скриншот 8


Примечание

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

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

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


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

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

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

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

Скриншот 9


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

Скриншот 10

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

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

Скриншот 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)
GmhnydqyHDU.jpg

Скриншот 12


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

Скриншот 13

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


Примечание

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


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

Скриншот 14

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

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

Скриншот 15

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

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

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

Скриншот 16

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

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

Нажимаем «Login»

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

Нажимаем «Login»

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

Скриншот 17

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

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

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

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

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


Скриншот 18

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

Скриншот 19


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

Скриншот 20

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

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

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

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

Скриншот 21


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

Скриншот 22

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

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

Скриншот 23

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

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

Скриншот 24

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

п. 6.2 Переход к п. 7.
 
  • Спасибо
Реакции: Papa777
п. 7 Проверка корректности ввода логина/пароля

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

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

Скриншот 25

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

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

KwqFVsvyhqw.jpg

Скриншот 26

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

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

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

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

Скриншот 27


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


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

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

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

Скриншот 28

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

Скриншот 29

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

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

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

Скриншот 30

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

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

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

Скриншот 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)
6fOZx_xzUHg.jpg

Скриншот 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)
p0zWxHhxVyA.jpg

Скриншот 33

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


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


п. 8.2 это переход к п. 9, он тоже выполнен
 
п. 9 Проверка наличия «Загадки»

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

Скриншот 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)
Wljfhk4MtVI.jpg

Скриншот 35


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

Скриншот 36


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


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

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

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

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

Скриншот 37

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

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

Скриншот 38

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

{-Variable.TMP1-} = +380

{-Variable.TMP2-} =  88
QfaXKJBuh4A.jpg

Скриншот 39

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

Скриншот 40

Примечание

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

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

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

Скриншот 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)
X3cGU-YBChM.jpg

Скриншот 42

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

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

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

Скриншот 43

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

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

Скриншот 44

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


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

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

(Скриншот 45)
_oX17d0p5mY.jpg

Скриншот 45

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

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

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

PEoL0C6IS4E.jpg

Скриншот 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)
7-O1p2Kt30Q.jpg

Скриншот 47

Теперь можно считать примитивный однопоточный чекер готовым. Проверяем, тестируем, можем использовать под свои нужды ;-)
 
Хотелось бы добавить, что при написании статьи я старался очень подробно все объяснить и показать. По сути, статья рассчитана действительно на тех, у кого совсем нет опыта работы с автоматизацией и прочим. Я постарался рассказать про основы, которых мне не хватало в своё время при освоении это замечательной программы.

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

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

Удачного и прибыльного Вам 2015 года!
 
Огромный труд, но не читабельно, в видео формате было б лучше.
 
Многое бы отдал за это в свое время.
Разжевано все с ссылками как надо.
Хороший труд для новичков.
 
оооочень подробно, даже излишне, новичку нужно будет очень захотеть, чтобы осилить все это. как сказали выше - в видео файле было бы лучше, да и вам раз 10 меньше трудозатрат.


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

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

я неправильно задал вопрос....если у меня больше ста живых акков, я же не могу загрузить в каждый по нужной мне фотке.
Вопрос. как ускорить процесс загрузки фото в нужный мне пост....и откуда лучше...если вы знаете?
 
если у меня больше ста живых акков, я же не могу загрузить в каждый по нужной мне фотке.
Почему не можешь, не вижу преград! Просто не понятно, о какой рассылке идет. Со ста аккаунтов рассылать сообщения на стену, правильно?
Вопрос. как ускорить процесс загрузки фото в нужный мне пост....и откуда лучше...если вы знаете?
Что значит ускорить, для чего? Если каждый раз прикреплять фото к посту, то не так уже это и долго. Либо мы друг друга совсем не понимаем...
Как второй вариант, можно загружать фоты через их API...
 
Отличная статья. Несколько моментов новых узнал. Спасибо автору за труд!
 
  • Спасибо
Реакции: goblin2oo8
Спасибо автору огромное!
но если выполнить готовый проект, то в goodaccs.txt валидные не записываються
 
  • Спасибо
Реакции: goblin2oo8
  • Спасибо
Реакции: dreamlant

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