4 место Управление любыми Android приложениями на смартфоне из ZP

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
Всем привет! В связи с успехом прошлой статьи я решил и дальше пойти по линии автоматизации того что стандартными средствами ZP не предусмотрено. Сегодня мы с вами займемся автоматизацией приложения Instagram'a прямо на вашем смартфоне через USB !

Начинаем

Для того чтобы это все заработало нам понадобится:
Скачиваем и устанавливаем все это добро. Рекомендую ставить Android SDK по стандартному пути который предложит установочник, если вы по привычке его изменили как это сделал я, то эта инструкция для вас

После того как все установлено, вам нужно открыть Android SDK и установить внутри него вот эти пакеты:






Теперь, когда все готово можем приступить к созданию проекта, сначала берем USB, телефон и все это подключаем к ПК, в телефоне в настройках нужно включить опции разработчика и отладку по USB


Первое что нам понадобится это запустить appium с нужными параметрами чтобы на пк поднялся сервер для перенаправления команд на телефон, делаем:

Создадим два bat файла
1)
Code:
"C:/Program Files (x86)/Appium/node.exe" "C:/Program Files (x86)/Appium/node_modules/appium/bin/Appium.js" --address 127.0.0.1 --chromedriver-port 9516 --bootstrap-port 4725 --selendroid-port 8082 --no-reset --local-timezone
и назовем его AppiumStart.bat

2)
Code:
taskkill /F /IM node.exe
это пусть будет AppiumStop.bat

Теперь первым экшеном в нашем проекте будет запуск программы с указанием пути до файла AppiumStart:



Следующим шагом плавно переходим к кодингу, для работы сего приложения нам понадобятся библиотеки от Appium и Selenium а также Newtonsoft.Json ибо они без него не работают, добавляем их в ссылки GAC:


Все нужные dll во вложении

Теперь добавляем необходимые using:
Code:
using System.Linq;
using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;



Для того чтобы мы управляли конкретным приложением и при старте на телефоне открылось именно оно, нам нужно указать параметры инициализации экземпляра класса драйвера управления, не думаю что в это нужно вникать, можно просто все сделать по инструкции =)

Создаем экшен Код С# и начинаем кодить:

Code:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "4.0.3");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "com.instagram.android"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".activity.MainTabActivity"); // активное окно

AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap); // инициализируем экземпляр класса драйвера с настроечками
Как вы заметили в настройках фигурируют два непонятных параметра это appPackage и аppActivity
Для любого приложения их можно получить следующим образом:
  • Открываем на телефоне приложение для которого хотим получить данные (исходим из условия что телефон уже подключен к ПК и на нем включен режим отладки)
  • Запускаем cmd от имени администратора
  • пишем adb devices


  • Дальше adb shell
  • И теперь dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’
Если все верно вы должны получить данные о запущенном приложении:



Именно они и указывались в наших настройках.
Теперь если запустить проект, то на экшене c кодом на телефоне уже должно само открыться приложение Instagram.

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

Начнем с 1 пункта

Исследование элементов на андроид приложениях

На самом деле тут не нужно изобретать велосипед, Google сам уже все сделал для этого, вам достаточно открыть папку с android- sdk, перейти в папку tools и открыть файл uiautomatorviewer.bat

Мой полный путь до него: "C:\android-sdk\tools\uiautomatorviewer.bat"

Он немного потупит и откроет нам вот такое окно:


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



Наша задача нажать на самолетик, чтобы отправить сообщение, выделяем его и смотрим по каким параметрам его можно найти. Больше всего мне понравилось искать по XPath

Давайте сразу в коде добавим нажатие на этот элемент, выглядеть это будет вот так:
Code:
driver.FindElementByXPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]").Click();
Если разбирать по букофкам то мы обратились к нашему драйверу driver, вызвали в нем функцию поиска элемента на экране по XPath- FindElementByXPath, соотеветственно в него передали наше имя класса, взятое из uiautomatorviewer, внутри полученной коллекции элементов с этим классом вычленили элемент у которого resource-id равен тому id что показал нам инспектор (id начинает после :id/) и кликнули по нему Click()

По идее если сейчас запустить наш проект, то уже должно раскрыться приложение инсты и там должен нажаться самолетик, НО такое исполнение может вызывать ошибку "Элемент не найден" ибо телефон может затупить и долго открывать окно приложения, поэтому сразу зацепим следующий пункт

Ожидание появления элементов на экране телефона

В этом тоже нет ничего сложного, для того чтобы дождаться когда на нашем телефоне появится этот самолетик мы будем использовать следующий способ:
Сначала подключим необходимый using для этого:
Code:
using OpenQA.Selenium.Support.UI;


Далее объявим экземпляр класса который будет отвечать за ожидание:
Code:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
При его объявлении мы указали для какого объекта драйвера он будет использоваться и в течении какого времени производить ожидание, в нашем случае это 60 секунд

Непосредственно само ожидание:
Code:
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]")));
Разбираем, мы сказали объекту что должны выполнить ожидание появления элемента на экране по заданному XPath, следовательно программа будет стоять на строке этого кода пока не появится этот элемент либо не пройдет наши заданные 60с, если они пройдут то строка выдаст исключение с текстом об истечении таймаута, как только он появится мы сразу нажимаем на него

В экшене все это выглядит уже так:
Code:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "4.0.3");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "com.instagram.android"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".activity.MainTabActivity"); // активное окно

AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap); // инициализируем экземпляр класса драйвера с настроечками
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60)); //экземпляр класса для ожидания
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]"))); //ожидаем
driver.FindElementByXPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]").Click(); //жмем
Итого, теперь мы умеем смотреть все элементы на экране тлф, программно их находить и ожидать, осталось дело за малым - допилить нашего спамера по директу инсты, погнали:

Алгоритм примерно такой:
Нажать новое сообщение



Ввести никнейм получателя



Дождаться результата, выбрать первого, ввести текст и нажать отправить



Жмем на "Новое сообщение"
driver.FindElementsByClassName("android.widget.TextView").Where(f=> f.Text == "Новое сообщение").First().Click();



Я исследовал элемент, выяснил что значение его класса не уникально и у него отсутствует resource-id, поэтому сделал поиск по классу и свой- ву Text, к первому элементу применил метод Click();

Вводим никнейм
Любые нажатия в приложения отправляются при помощи метода SendKeys("тут текст");

Code:
driver.FindElementsByClassName("android.widget.EditText").First(f=> f.Text == "Поиск").SendKeys("test");
Дальше ожидаем появления результатов поиска и делаем Click() на первый результат выдачи:
Code:
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.LinearLayout[contains(@resource-id, 'user_row_background')]")));
driver.FindElementsByXPath("//android.widget.LinearLayout[contains(@resource-id, 'user_row_background')]").First().Click();
Вводим текст сообщения
Code:
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'row_thread_composer_edittext')]").SendKeys("Привееееет");
исходил из данных от инспектора


Нажимаем на кнопку отправить и не забываем предварительно ожидать ее появления:
Code:
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.ImageView[contains(@resource-id, 'row_thread_composer_button_send')]")));
driver.FindElementByXPath("//android.widget.ImageView[contains(@resource-id, 'row_thread_composer_button_send')]").Click();
Но тут у меня всплыл такой момент, когда я пытаюсь отправить нажатия русских символов, то ничего не вводится, а английские работают, проблема решилась добавлением в начальные настройки инициализации драйвера строки
Code:
cap.SetCapability("unicodeKeyboard", "true");


ВУАЛЯ, все круто, все работает, вот демонстрация того как это происходит у меня:


Для трансляции видео на экран ПК через инет использовал Screen Stream Mirroring

P.S: По секрету говоря абсолютно не важно будете ли вы использовать свой телефон подключенный через USB или любой эмулятор андроида, например bluestacks или NOX, данная инструкция подойдет для применения к любому из них, только заместо подключенного по USB телефона у вас на пк должен быть открыт эмулятор андроида и все =)

Получившийся проект прикрепил!

Мои контакты для обратной связи:

Почта: info@itlabs.top
Skype: Serkser70
Telegram: Serkser
Whatsapp/Viber: +79511929402


Спасибо за внимание! Всех с наступающим! =)
 
Тема статьи
Нестандартные хаки
Номер конкурса статей
Шестой конкурс статей

Attachments

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

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

Last edited:

hostcredit

Client
Joined
May 3, 2015
Messages
167
Reaction score
32
Points
28
Вот это труды! спасибо за статью, думаю будет очень полезно, учитывая что ЗенноДроид еще сыроват к сожалению
 
  • Thank you
Reactions: vovain and Serkser

alekwuy

Client
Joined
Apr 6, 2013
Messages
1,632
Reaction score
461
Points
83
Вот это действительно интересно)
 
  • Thank you
Reactions: Serkser

DenisK

Client
Joined
Jun 28, 2016
Messages
591
Reaction score
289
Points
63
Спасибо, интересное решение.

Пожалуй лучшая из всего, что пока есть статья.

И такого точно еще не было тут. :ay:
 
  • Thank you
Reactions: GeGold and Serkser

AgentRassilok

Известная личность
Joined
Nov 8, 2016
Messages
1,272
Reaction score
466
Points
83
молодец крутяк )
 
  • Thank you
Reactions: Serkser

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
А прокси подружить с этой схемой можно?
 

Sergodjan

Administrator
Staff member
Joined
Sep 5, 2012
Messages
20,936
Reaction score
9,330
Points
113
статья круть!
опять буду голосовать за этого автора! :-)
 
  • Thank you
Reactions: Serkser

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
А прокси подружить с этой схемой можно?
Никто не запрещает поставить на тлф. ProxyDroid и в нем менять прокси на всем телефоне.

Но правильней было бы использовать эмулятор андрюши и так же управлять им, а прокси менять в
Proxyfier при помощи WinApi =)
 

Sanekk

Client
Joined
Jun 24, 2016
Messages
999
Reaction score
390
Points
63
Автору респект за труды, ТС занимается уникальным направлением для использования зеннопостера. Предполагаю что это будет одна из лидирующих статей в этом году! Буду голосовать полюбому!!!
 
  • Thank you
Reactions: GeGold and Serkser

Adigen

Client
Joined
Jul 28, 2014
Messages
825
Reaction score
654
Points
93
Отличная статья на очень актуальную тему, автору респект!
 
  • Thank you
Reactions: Serkser
Joined
Jul 8, 2015
Messages
2,848
Reaction score
712
Points
113
ждал темку от Serkser как всегда круто!

Serkser ну интригу конечно развел телефон провода юсби )))
P.S: По секрету говоря абсолютно не важно будете ли вы использовать свой телефон подключенный через USB или любой эмулятор андроида, например bluestacks или NOX, данная инструкция подойдет для применения к любому из них, только заместо подключенного по USB телефона у вас на пк должен быть открыт эмулятор андроида и все =)
зы: ну все хана инстаграму походу!
 
  • Thank you
Reactions: Serkser

Lite

Client
Joined
Oct 17, 2013
Messages
294
Reaction score
103
Points
43
Пока лучшая статья на этом конкурсе)
 
  • Thank you
Reactions: Serkser

AlisaZ

Client
Joined
Sep 17, 2014
Messages
160
Reaction score
174
Points
43
мобилы сейчас актуальны, как никогда, особенно в свете перспектив привлечения и конверта мобильного трафика, благодарствую за уникальную подачу конкурсного материала!!! :cw:
 
  • Thank you
Reactions: Serkser

Nord

Client
Joined
Mar 22, 2012
Messages
2,414
Reaction score
1,481
Points
113
+1 от меня. Если в Зеннодроид ничего не изменят, то ему капут
 
  • Thank you
Reactions: Eldario and Serkser

bumer

Client
Joined
Mar 15, 2015
Messages
227
Reaction score
82
Points
28
статья хорошая, но это что тока для ватцап, инстаграм и вайбер нужно это? Что еще бы придумать, как на этом срубить бабло?
 

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
статья хорошая, но это что тока для ватцап, инстаграм и вайбер нужно это? Что еще бы придумать, как на этом срубить бабло?
Не в деньгах смысл, а в знаниях :-)
 

bumer

Client
Joined
Mar 15, 2015
Messages
227
Reaction score
82
Points
28
Понятное дело кто умней тот и богаче, полностью согласен с ТС. Но понимаешь такая штука, у меня в субботу умер друг, и чтобы его похоронить нужно минимум 130 000 рублей, я дал его семье столько сколько было в моей семье, а именно все 50 000р, сижу на галиках. А ты говоришь не в деньгах счастье, дальше будет еще дороже. Зачем деньги, можно и воздухом подышать. Жду зарплаты и пойду искать клиентов.
 

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
Понятное дело кто умней тот и богаче, полностью согласен с ТС. Но понимаешь такая штука, у меня в субботу умер друг, и чтобы его похоронить нужно минимум 130 000 рублей, я дал его семье столько сколько было в моей семье, а именно все 50 000р, сижу на галиках. А ты говоришь не в деньгах счастье, дальше будет еще дороже. Зачем деньги, можно и воздухом подышать. Жду зарплаты и пойду искать клиентов.
Мои искренние соболезнования :(
 
  • Thank you
Reactions: bumer

lokiys

Moderator
Joined
Feb 1, 2012
Messages
4,858
Reaction score
1,193
Points
113
@Serkser http://zennolab.com/discussion/threads/shestoj-konkurs-statej.32104/

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

spir1t

Новичок
Joined
Dec 7, 2016
Messages
4
Reaction score
0
Points
1
Никто не запрещает поставить на тлф. ProxyDroid и в нем менять прокси на всем телефоне.

Но правильней было бы использовать эмулятор андрюши и так же управлять им, а прокси менять в
Proxyfier при помощи WinApi =)
Добрый день, есть предложение как можно круто допилить шаблончик) Напиши пожалуйста в лс, или ответь в скайп ( я тебе там написал)
 

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
@Serkser http://zennolab.com/discussion/threads/shestoj-konkurs-statej.32104/

  • Публиковать статьи нужно будет на нашем форуме, чтобы их можно было обсудить и проголосовать за понравившиеся. Все файлы и картинки, входящие в статью, должны хоститься на форуме в сообщении, а не на сторонних image и file хостингах.
Я думал если вставлять картинки из конструктора, то они сами сгружаются на ваш хостинг
 

daymos

Client
Joined
Nov 11, 2009
Messages
807
Reaction score
241
Points
43
Еще ждем статьи от самизнаетекого о том какпосчитатьчужиеденьги и можно роздавать призы.
ТС - отличная статья, спасибо!
 
  • Thank you
Reactions: AZANIR and Radzhab

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,858
Reaction score
1,580
Points
113

nvmds

Client
Joined
May 4, 2016
Messages
91
Reaction score
7
Points
8
Спасибо за статью, то что нужно) А может кто-то подсказать, как из прилажения на андроиде вытянуть гугл капчу для разгадывания?
 

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
Спасибо за статью, то что нужно) А может кто-то подсказать, как из прилажения на андроиде вытянуть гугл капчу для разгадывания?
При помощи Appium можно работать с html элементами на экране андрюши, при условии если она загружена в webview, а она в любом случае будет туда загружена, так что думаю можно организовать работу даже без эмуляции кликов по каптче, а решать ее способом описанным на рукаптче, т.е. через чистые запросы
 
  • Thank you
Reactions: VerBin and nvmds

nvmds

Client
Joined
May 4, 2016
Messages
91
Reaction score
7
Points
8
Иду по шагам и возникла проблемка. Не выполнялась команда adb devices. Выдавало, что команда не известна. Добавил adb в переменные среды, path. Все заработало, и я увидел данные о запущенном прилажении на телефоне. Но при попытке выполнения самого проекта error: Logcat capture failed: spawn ENOENT
 

nvmds

Client
Joined
May 4, 2016
Messages
91
Reaction score
7
Points
8
Разобрался, все ок. Не установил android sdk build tools.
 
  • Thank you
Reactions: Skrine

Serkser

Client
Joined
Jan 26, 2015
Messages
90
Reaction score
344
Points
53
Супер!=)
 

samsonnn

Client
Joined
Jun 2, 2015
Messages
1,858
Reaction score
1,580
Points
113
Serkser пока тема горячая запили пожалуйста видео, как делать все тоже самое только с андроид эмуляторами.
 

alexpost

Client
Joined
Jun 15, 2016
Messages
173
Reaction score
60
Points
28
Ништяк! С selenium webdriver 2 работал до зенно, интересно будет пощупать щаблон) Победы на конкурсе!
 

Users Who Are Viewing This Thread (Total: 3, Members: 1, Guests: 2)