2 место Автоматизация Android без посредников. Часть 1.

Kinomanius

Активный пользователь
Регистрация
20.01.2020
Сообщения
184
Благодарностей
26
Баллы
28
cmd команды для зеннопостера такие же как или для всех других. Главное правильно указывать параметры (синтаксис самой команды, и т.п. ). Есть только различия, если использовать полные команды (которые сами можете ввести в консоли) и если использовать команды через dll библиотеки, тогда возможны отличия в тексте команд. В интернете есть справочники по adb командам.
Вы случаем не разбираетесь в способах уникализации андроид? Смены EMEI и прочей системной мишуры?
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
855
Благодарностей
246
Баллы
43

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Сниппет для долгого удержания "Backspace".
Long Backspace:
var a = project.Context["ADB"];
string evnt = project.Variables["event"].Value; //номер event'а получить с помощью специального кубика из шаблона
a.Command(String.Format("sendevent /dev/input/event{0} 1 14 1", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 0 0", evnt), false);
Thread.Sleep(3000); //удерживать 3 секунды
a.Command(String.Format("sendevent /dev/input/event{0} 1 14 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 0 0", evnt), false);
Получение event - исправленный сниппет.
Get Event:
var a = project.Context["ADB"];
a.Command("cat /proc/bus/input/devices", true);

project.Variables["event"].Value = Regex.Match(Regex.Match(project.Variables["receiver"].Value, "(?<=Android_Input\")[\\w\\W]*?(?=B)").ToString().Trim(), "(?<=event).*").ToString(); //получение № ивэнта
 
  • Спасибо
Реакции: Anton312

Anton312

Новичок
Регистрация
10.12.2019
Сообщения
20
Благодарностей
0
Баллы
1
Получение event - исправленный сниппет.
Get Event:
var a = project.Context["ADB"];
a.Command("cat /proc/bus/input/devices", true);

project.Variables["event"].Value = Regex.Match(Regex.Match(project.Variables["receiver"].Value, "(?<=Android_Input\")[\\w\\W]*?(?=B)").ToString().Trim(), "(?<=event).*").ToString(); //получение № ивэнта
Здравствуйте, чтобы использовать переменную для написания нужно использовать
a.Text("{переменная}"); ?
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
  • Спасибо
Реакции: Solomon21

Anton312

Новичок
Регистрация
10.12.2019
Сообщения
20
Благодарностей
0
Баллы
1
Посмотрев видео не совсем ясно с парсингом текста.
У меня в приложении текст находится в поле @resource-id так, что я не могу спарсить его отдельно, интересуюсь, можно ли спарсить текст используя пример с ютубом.
var a = project.Context["ADB"];
project.Lists["parse"].AddRange(a.Parse("//node[@resource-id='com.google.android.youtube:id/duration' and @class='android.widget.TextView']", "text", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды


И возможно ли заменить "text" на "number"?
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Посмотрев видео не совсем ясно с парсингом текста.
У меня в приложении текст находится в поле @resource-id так, что я не могу спарсить его отдельно, интересуюсь, можно ли спарсить текст используя пример с ютубом.
var a = project.Context["ADB"];
project.Lists["parse"].AddRange(a.Parse("//node[@resource-id='com.google.android.youtube:id/duration' and @class='android.widget.TextView']", "text", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды


И возможно ли заменить "text" на "number"?
Если он находится в атрибуте resource-id, значит нужно парсить атрибут resource-id, т.е.
C#:
var a = project.Context["ADB"];
project.Lists["parse"].AddRange(a.Parse("//node[contains(@resource-id,'com.google.android.youtube:id/duration') and @class='android.widget.TextView']", "resource-id", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
Если в полученных значениях остаётся текст "com.google.android.youtube:id/duration", то его можно убрать с помощью регулярного выражения.

text - название атрибута.
Если в дереве имеется атрибут number, то можно. Не припомню, чтобы я встречал подобного атрибута.
 
Последнее редактирование:

MAKCUW

Новичок
Регистрация
08.07.2020
Сообщения
4
Благодарностей
0
Баллы
1
Если мне требуется взять данные из буфера обмена в переменную проекта могу ли я применить данный код на C#

System.Windows.Forms.Clipboard.GetText();
project.Variables["text"].Value = System.Windows.Forms.Clipboard.GetText()
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Если мне требуется взять данные из буфера обмена в переменную проекта могу ли я применить данный код на C#

System.Windows.Forms.Clipboard.GetText();
project.Variables["text"].Value = System.Windows.Forms.Clipboard.GetText()
Если речь идет о буфере обмена Windows - да.
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43

MAKCUW

Новичок
Регистрация
08.07.2020
Сообщения
4
Благодарностей
0
Баллы
1

MAKCUW

Новичок
Регистрация
08.07.2020
Сообщения
4
Благодарностей
0
Баллы
1

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Можно ли такое проделать с андроид эмулятором?
Можно, но я не делал.

Копать в Google по запросу "adb clipboard".

Тестировать с помощью командной строки.
Вставлять необходимые значения в a.Command();

Как вариант можно у меня заказать сниппет.
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43
  • Спасибо
Реакции: WLDN

dsertr21

Client
Регистрация
20.06.2016
Сообщения
17
Благодарностей
7
Баллы
3
Подскажите люди добрые, если нужный элемент появляется через раз и кубик с C# стоит у меня как необязательное действие - долго задерживается на этом кубике(секунд 30), потом переходит на следующий, как ускорить переход на другой кубик?)
 
Последнее редактирование:

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Подскажите люди добрые, если нужный элемент появляется через раз и кубик с C# стоит у меня как необязательное действие - долго задерживается на этом кубике(секунд 30), потом переходит на следующий, как ускорить переход на другой кубик?)
Один из вариантов сделать проверку с помощью Wait и цикла.
Check Element:
var a = project.Context["ADB"];
int z = int.Parse(project.Variables["settings_pause_wait"].Value)/2;
for (int i=0;i<z;i++){
    try {
 a.Wait("//node[@resource-id='com.instagram.android:id/next_button' and @class='android.widget.FrameLayout']", 0, 1); //XPath, Index, Секунды
        return "next";
    } catch (Exception e) {}
        try {
a.Wait("//node[@resource-id='com.instagram.android:id/skip_button' and @class='android.widget.TextView']", 0, 1); //XPath, Index, Секунды
            return "skip";
    } catch (Exception e) {}
}
throw new Exception("Can't load Element");
Положить результат в переменную Check, и направить бота в нужное русло через Switch.

59628
 
  • Спасибо
Реакции: Dorian_Gray и dsertr21

dsertr21

Client
Регистрация
20.06.2016
Сообщения
17
Благодарностей
7
Баллы
3
Один из вариантов сделать проверку с помощью Wait и цикла.
Check Element:
var a = project.Context["ADB"];
int z = int.Parse(project.Variables["settings_pause_wait"].Value)/2;
for (int i=0;i<z;i++){
    try {
a.Wait("//node[@resource-id='com.instagram.android:id/next_button' and @class='android.widget.FrameLayout']", 0, 1); //XPath, Index, Секунды
        return "next";
    } catch (Exception e) {}
        try {
a.Wait("//node[@resource-id='com.instagram.android:id/skip_button' and @class='android.widget.TextView']", 0, 1); //XPath, Index, Секунды
            return "skip";
    } catch (Exception e) {}
}
throw new Exception("Can't load Element");
Положить результат в переменную Check, и направить бота в нужное русло через Switch.

Посмотреть вложение 59628
Благодарю вас за ответ, подскажите как можно победить то что adb перестаёт работать на анкетах, где есть динамический контент (например бежит строка с названием музыки вверху)? там где статика, всё работает.
 
  • Спасибо
Реакции: WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Благодарю вас за ответ, подскажите как можно победить то что adb перестаёт работать на анкетах, где есть динамический контент (например бежит строка с названием музыки вверху)? там где статика, всё работает.
Вариантов несколько и они все не совсем простые.
1. Удалить динамический контент из кода в apk (нужно декомпилировать, отредактировать и компилировать)
2. Заменить UIAutomator на что-то более совершенное
3. MITM - вырубить подгрузку ненужных элементов.

Я делал MITM, но это худший из вариантов и , возможно, не везде сработает.
 
  • Спасибо
Реакции: dsertr21

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
Теперь команда будет выглядеть так:
cmd.exe:
adb shell uiautomator dump /dev/tty
При работе через либу в ответе получаю вместо русских букв кракозябры типа text="ÐгноÑиÑоваÑÑ Ð°Ð´ÑеÑа"
При этом если выполняю эту команду вручную через консоль, то получаю ответ в читаемом виде с русскими буквами.

Может какие то настройки нужно задать?

Пробовал задавать разную кодировку через параметр
AdbClient.Instance.ExecuteRemoteCommand(command, device, receiver, Encoding.GetEncoding(1251));
Русские буквы все равно не читаются.
В чем может быть причина?
 
Последнее редактирование:

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
При работе через либу в ответе получаю вместо русских букв кракозябры типа text="ÐгноÑиÑоваÑÑ Ð°Ð´ÑеÑа"
При этом если выполняю эту команду вручную через консоль, то получаю ответ в читаемом виде с русскими буквами.

Может какие то настройки нужно задать?

Пробовал задавать разную кодировку через параметр
AdbClient.Instance.ExecuteRemoteCommand(command, device, receiver, Encoding.GetEncoding(1251));
Русские буквы все равно не читаются.
В чем может быть причина?
Проблема в кодировке библиотеки, я не решал этот вопрос, но знаю что один из форумчан решил этот вопрос с помощью использования cmd. Получал ответ в нужной кодировке. В теории можно добавить к библиотеке выбор кодировки и компилировать заново.
 
  • Спасибо
Реакции: radv

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
790
Благодарностей
136
Баллы
43
@WLDN привет! Обнаружил проблему - когда пытаюсь установить приложение в блюстаксе, то команда завершает выполнение ошибкой. Всегда. Удаляет приложение верно, а установить не может. Пробовал без библиотеки SharpAdbClient выполнить команду в cmd, и приложение установилось. Выполнял такую команду:
adb -s 127.0.0.1:5555 install "путь до.apk"
Я так понимаю, такая же команда выполняется и с использованием SharpAdbClient, но возможно часть неё уже заложена в саму либу. В общем вопрос, как всё таки выполнить установку приложения с использованием либы? Как убрать ошибку? Пишет "неизвестная ошибка", поэтому инфы особой по ошибке нету. А использовать выполнение через cmd - ну, во-первых, удобнее конечно же с либой и если эта команда не выполняется, высока вероятность что и другие не будут выполняться. А во-вторых, установить удалось приложение если руками в консоли работал. Через зенку - устанавливает, но не скрывает окно консоли, не ждёт завершения процесса, не закрывает окно консоли. Если скрыть - не устанавливает.
И если пишу p.WaitForExit(); - зависает намертво, если только не указать время точное.
 
Последнее редактирование:

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN привет! Обнаружил проблему - когда пытаюсь установить приложение в блюстаксе, то команда завершает выполнение ошибкой. Всегда. Удаляет приложение верно, а установить не может. Пробовал без библиотеки SharpAdbClient выполнить команду в cmd, и приложение установилось. Выполнял такую команду:
adb -s 127.0.0.1:5555 install "путь до.apk"
Я так понимаю, такая же команда выполняется и с использованием SharpAdbClient, но возможно часть неё уже заложена в саму либу. В общем вопрос, как всё таки выполнить установку приложения с использованием либы? Как убрать ошибку? Пишет "неизвестная ошибка", поэтому инфы особой по ошибке нету. А использовать выполнение через cmd - ну, во-первых, удобнее конечно же с либой и если эта команда не выполняется, высока вероятность что и другие не будут выполняться. А во-вторых, установить удалось приложение если руками в консоли работал. Через зенку - устанавливает, но не скрывает окно консоли, не ждёт завершения процесса, не закрывает окно консоли. Если скрыть - не устанавливает.
И если пишу p.WaitForExit(); - зависает намертво, если только не указать время точное.
Привет. Не работал с Bluestacks. Проверь работает ли на Nox установка приложения с этим же кодом. Если это проблема с Bluestacks, то не смогу подсказать.
Как вариант я бы попробовал закинуть apk на эмулятор и с эмулятора уже делать установку, второй вариант использовать SharpAdbClient.AdbClient.Instance.Install();
Обрати внимание там вместо apk, stream. Скорее всего его можно получить также как и в моём методе UploadFromVar.

Надеюсь всё получится. Перепроверь ещё раз пути, мало ли.

По поводу консоли - где-то в шаблоне есть вариант работы с cmd без окон. Поищи.
 
  • Спасибо
Реакции: avtostopshik

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
790
Благодарностей
136
Баллы
43
@WLDN привет! Скажи пожалуйста, а как можно спарсить значение атрибута, но не в список, а в строковую переменную?
Смотрел, что ты в общем коде написал для метода парсинга, но так и не понял, как без списка парсить.

Также, подскажи пожалуйста, если спарсил русский текст, но получил его в неизвестной кодировке:
Результат: иÑл.
Как сделать или парсить, чтобы текст был кириллицей?
 
Последнее редактирование:

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN привет! Скажи пожалуйста, а как можно спарсить значение атрибута, но не в список, а в строковую переменную?
Смотрел, что ты в общем коде написал для метода парсинга, но так и не понял, как без списка парсить.

Также, подскажи пожалуйста, если спарсил русский текст, но получил его в неизвестной кодировке:
Результат: иÑл.
Как сделать или парсить, чтобы текст был кириллицей?
Из списка берешь нужное значение. Работает абсолютно также как и в обычных кубиках зенки. project.Variables["peremennaya"] = word[0]; - где word это элемент из списка после цикла foreach, а 0 - индекс в списке, то есть первое совпадение.

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

Szerzs

Client
Регистрация
15.06.2019
Сообщения
259
Благодарностей
68
Баллы
28
Добрый день.
Не подскажете,в чём может быть проблема (на скрине - ошибка).Всё установил,настроил- и вот-застрял.

Screenshot_2.jpg
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93

Szerzs

Client
Регистрация
15.06.2019
Сообщения
259
Благодарностей
68
Баллы
28

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Извините,может нубский вопрос). А как-где удалить эту переменную с портом?
59923


Надеюсь у тебя порт определялся изначально. Вообще я бы перезагрузил зенку и попробовал заново запустить.
 

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