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

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
Всем привет! В связи с успехом прошлой статьи я решил и дальше пойти по линии автоматизации того что стандартными средствами ZP не предусмотрено. Сегодня мы с вами займемся автоматизацией приложения Instagram'a прямо на вашем смартфоне через USB !

Начинаем

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

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






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


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

Создадим два bat файла
1)
Код:
"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)
Код:
taskkill /F /IM node.exe
это пусть будет AppiumStop.bat

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



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


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

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



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

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

Код:
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

Давайте сразу в коде добавим нажатие на этот элемент, выглядеть это будет вот так:
Код:
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 для этого:
Код:
using OpenQA.Selenium.Support.UI;


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

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

В экшене все это выглядит уже так:
Код:
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("тут текст");

Код:
driver.FindElementsByClassName("android.widget.EditText").First(f=> f.Text == "Поиск").SendKeys("test");
Дальше ожидаем появления результатов поиска и делаем Click() на первый результат выдачи:
Код:
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();
Вводим текст сообщения
Код:
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'row_thread_composer_edittext')]").SendKeys("Привееееет");
исходил из данных от инспектора


Нажимаем на кнопку отправить и не забываем предварительно ожидать ее появления:
Код:
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();
Но тут у меня всплыл такой момент, когда я пытаюсь отправить нажатия русских символов, то ничего не вводится, а английские работают, проблема решилась добавлением в начальные настройки инициализации драйвера строки
Код:
cap.SetCapability("unicodeKeyboard", "true");


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


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

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

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

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

Почта: [email protected]
Skype: Serkser70
Telegram: Serkser
Whatsapp/Viber: +79511929402


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

Вложения

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

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

Последнее редактирование:

hostcredit

Client
Регистрация
03.05.2015
Сообщения
167
Благодарностей
32
Баллы
28
Вот это труды! спасибо за статью, думаю будет очень полезно, учитывая что ЗенноДроид еще сыроват к сожалению
 
  • Спасибо
Реакции: vovain и Serkser

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 631
Благодарностей
461
Баллы
83
Вот это действительно интересно)
 
  • Спасибо
Реакции: Serkser

DenisK

Client
Регистрация
28.06.2016
Сообщения
591
Благодарностей
288
Баллы
63
Спасибо, интересное решение.

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

И такого точно еще не было тут. :ay:
 
  • Спасибо
Реакции: GeGold и Serkser

AgentRassilok

Известная личность
Регистрация
08.11.2016
Сообщения
1 272
Благодарностей
466
Баллы
83
молодец крутяк )
 
  • Спасибо
Реакции: Serkser

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 278
Благодарностей
96
Баллы
48
А прокси подружить с этой схемой можно?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 361
Благодарностей
8 647
Баллы
113
статья круть!
опять буду голосовать за этого автора! :-)
 
  • Спасибо
Реакции: Serkser

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
А прокси подружить с этой схемой можно?
Никто не запрещает поставить на тлф. ProxyDroid и в нем менять прокси на всем телефоне.

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

Sanekk

Client
Регистрация
24.06.2016
Сообщения
987
Благодарностей
388
Баллы
63
Автору респект за труды, ТС занимается уникальным направлением для использования зеннопостера. Предполагаю что это будет одна из лидирующих статей в этом году! Буду голосовать полюбому!!!
 
  • Спасибо
Реакции: GeGold и Serkser

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
Отличная статья на очень актуальную тему, автору респект!
 
  • Спасибо
Реакции: Serkser
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
ждал темку от Serkser как всегда круто!

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

Lite

Client
Регистрация
17.10.2013
Сообщения
282
Благодарностей
89
Баллы
28
Пока лучшая статья на этом конкурсе)
 
  • Спасибо
Реакции: Serkser

AlisaZ

Client
Регистрация
17.09.2014
Сообщения
159
Благодарностей
173
Баллы
43
мобилы сейчас актуальны, как никогда, особенно в свете перспектив привлечения и конверта мобильного трафика, благодарствую за уникальную подачу конкурсного материала!!! :cw:
 
  • Спасибо
Реакции: Serkser

Nord

Client
Регистрация
22.03.2012
Сообщения
2 358
Благодарностей
1 419
Баллы
113
+1 от меня. Если в Зеннодроид ничего не изменят, то ему капут
 
  • Спасибо
Реакции: Eldario и Serkser

bumer

Client
Регистрация
15.03.2015
Сообщения
221
Благодарностей
80
Баллы
28
статья хорошая, но это что тока для ватцап, инстаграм и вайбер нужно это? Что еще бы придумать, как на этом срубить бабло?
 

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
статья хорошая, но это что тока для ватцап, инстаграм и вайбер нужно это? Что еще бы придумать, как на этом срубить бабло?
Не в деньгах смысл, а в знаниях :-)
 

bumer

Client
Регистрация
15.03.2015
Сообщения
221
Благодарностей
80
Баллы
28
Понятное дело кто умней тот и богаче, полностью согласен с ТС. Но понимаешь такая штука, у меня в субботу умер друг, и чтобы его похоронить нужно минимум 130 000 рублей, я дал его семье столько сколько было в моей семье, а именно все 50 000р, сижу на галиках. А ты говоришь не в деньгах счастье, дальше будет еще дороже. Зачем деньги, можно и воздухом подышать. Жду зарплаты и пойду искать клиентов.
 

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
Понятное дело кто умней тот и богаче, полностью согласен с ТС. Но понимаешь такая штука, у меня в субботу умер друг, и чтобы его похоронить нужно минимум 130 000 рублей, я дал его семье столько сколько было в моей семье, а именно все 50 000р, сижу на галиках. А ты говоришь не в деньгах счастье, дальше будет еще дороже. Зачем деньги, можно и воздухом подышать. Жду зарплаты и пойду искать клиентов.
Мои искренние соболезнования :(
 
  • Спасибо
Реакции: bumer

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 768
Благодарностей
1 179
Баллы
113
@Serkser http://zennolab.com/discussion/threads/shestoj-konkurs-statej.32104/

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

spir1t

Новичок
Регистрация
07.12.2016
Сообщения
4
Благодарностей
0
Баллы
1
Никто не запрещает поставить на тлф. ProxyDroid и в нем менять прокси на всем телефоне.

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

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
@Serkser http://zennolab.com/discussion/threads/shestoj-konkurs-statej.32104/

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

daymos

Client
Регистрация
11.11.2009
Сообщения
805
Благодарностей
239
Баллы
43
Еще ждем статьи от самизнаетекого о том какпосчитатьчужиеденьги и можно роздавать призы.
ТС - отличная статья, спасибо!
 
  • Спасибо
Реакции: AZANIR и Radzhab

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 628
Благодарностей
1 303
Баллы
113

nvmds

Client
Регистрация
04.05.2016
Сообщения
91
Благодарностей
7
Баллы
8
Спасибо за статью, то что нужно) А может кто-то подсказать, как из прилажения на андроиде вытянуть гугл капчу для разгадывания?
 

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
Спасибо за статью, то что нужно) А может кто-то подсказать, как из прилажения на андроиде вытянуть гугл капчу для разгадывания?
При помощи Appium можно работать с html элементами на экране андрюши, при условии если она загружена в webview, а она в любом случае будет туда загружена, так что думаю можно организовать работу даже без эмуляции кликов по каптче, а решать ее способом описанным на рукаптче, т.е. через чистые запросы
 
  • Спасибо
Реакции: VerBin и nvmds

nvmds

Client
Регистрация
04.05.2016
Сообщения
91
Благодарностей
7
Баллы
8
Иду по шагам и возникла проблемка. Не выполнялась команда adb devices. Выдавало, что команда не известна. Добавил adb в переменные среды, path. Все заработало, и я увидел данные о запущенном прилажении на телефоне. Но при попытке выполнения самого проекта error: Logcat capture failed: spawn ENOENT
 

nvmds

Client
Регистрация
04.05.2016
Сообщения
91
Благодарностей
7
Баллы
8
Разобрался, все ок. Не установил android sdk build tools.
 
  • Спасибо
Реакции: Skrine

Serkser

Client
Регистрация
26.01.2015
Сообщения
90
Благодарностей
343
Баллы
53
Супер!=)
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 628
Благодарностей
1 303
Баллы
113
Serkser пока тема горячая запили пожалуйста видео, как делать все тоже самое только с андроид эмуляторами.
 

alexpost

Client
Регистрация
15.06.2016
Сообщения
173
Благодарностей
60
Баллы
28
Ништяк! С selenium webdriver 2 работал до зенно, интересно будет пощупать щаблон) Победы на конкурсе!
 

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