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

cmd команды для зеннопостера такие же как или для всех других. Главное правильно указывать параметры (синтаксис самой команды, и т.п. ). Есть только различия, если использовать полные команды (которые сами можете ввести в консоли) и если использовать команды через dll библиотеки, тогда возможны отличия в тексте команд. В интернете есть справочники по adb командам.
Вы случаем не разбираетесь в способах уникализации андроид? Смены EMEI и прочей системной мишуры?
 
Сниппет для долгого удержания "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
Получение 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("{переменная}"); ?
 
  • Спасибо
Реакции: Solomon21
Посмотрев видео не совсем ясно с парсингом текста.
У меня в приложении текст находится в поле @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 так, что я не могу спарсить его отдельно, интересуюсь, можно ли спарсить текст используя пример с ютубом.
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, то можно. Не припомню, чтобы я встречал подобного атрибута.
 
Последнее редактирование:
Если мне требуется взять данные из буфера обмена в переменную проекта могу ли я применить данный код на C#

System.Windows.Forms.Clipboard.GetText();
project.Variables["text"].Value = System.Windows.Forms.Clipboard.GetText()
 
Если мне требуется взять данные из буфера обмена в переменную проекта могу ли я применить данный код на C#

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

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

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

Как вариант можно у меня заказать сниппет.
 
  • Спасибо
Реакции: WLDN
Подскажите люди добрые, если нужный элемент появляется через раз и кубик с C# стоит у меня как необязательное действие - долго задерживается на этом кубике(секунд 30), потом переходит на следующий, как ускорить переход на другой кубик?)
 
Последнее редактирование:
Подскажите люди добрые, если нужный элемент появляется через раз и кубик с 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
Один из вариантов сделать проверку с помощью 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
Благодарю вас за ответ, подскажите как можно победить то что adb перестаёт работать на анкетах, где есть динамический контент (например бежит строка с названием музыки вверху)? там где статика, всё работает.
Вариантов несколько и они все не совсем простые.
1. Удалить динамический контент из кода в apk (нужно декомпилировать, отредактировать и компилировать)
2. Заменить UIAutomator на что-то более совершенное
3. MITM - вырубить подгрузку ненужных элементов.

Я делал MITM, но это худший из вариантов и , возможно, не везде сработает.
 
  • Спасибо
Реакции: dsertr21
Теперь команда будет выглядеть так:
cmd.exe:
Развернуть Свернуть Копировать
adb shell uiautomator dump /dev/tty
При работе через либу в ответе получаю вместо русских букв кракозябры типа text="ÐгноÑиÑоваÑÑ Ð°Ð´ÑеÑа"
При этом если выполняю эту команду вручную через консоль, то получаю ответ в читаемом виде с русскими буквами.

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

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

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

Пробовал задавать разную кодировку через параметр
AdbClient.Instance.ExecuteRemoteCommand(command, device, receiver, Encoding.GetEncoding(1251));
Русские буквы все равно не читаются.
В чем может быть причина?
Проблема в кодировке библиотеки, я не решал этот вопрос, но знаю что один из форумчан решил этот вопрос с помощью использования cmd. Получал ответ в нужной кодировке. В теории можно добавить к библиотеке выбор кодировки и компилировать заново.
 
  • Спасибо
Реакции: radv
@WLDN привет! Обнаружил проблему - когда пытаюсь установить приложение в блюстаксе, то команда завершает выполнение ошибкой. Всегда. Удаляет приложение верно, а установить не может. Пробовал без библиотеки SharpAdbClient выполнить команду в cmd, и приложение установилось. Выполнял такую команду:
adb -s 127.0.0.1:5555 install "путь до.apk"
Я так понимаю, такая же команда выполняется и с использованием SharpAdbClient, но возможно часть неё уже заложена в саму либу. В общем вопрос, как всё таки выполнить установку приложения с использованием либы? Как убрать ошибку? Пишет "неизвестная ошибка", поэтому инфы особой по ошибке нету. А использовать выполнение через cmd - ну, во-первых, удобнее конечно же с либой и если эта команда не выполняется, высока вероятность что и другие не будут выполняться. А во-вторых, установить удалось приложение если руками в консоли работал. Через зенку - устанавливает, но не скрывает окно консоли, не ждёт завершения процесса, не закрывает окно консоли. Если скрыть - не устанавливает.
И если пишу p.WaitForExit(); - зависает намертво, если только не указать время точное.
 
Последнее редактирование:
@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
@WLDN привет! Скажи пожалуйста, а как можно спарсить значение атрибута, но не в список, а в строковую переменную?
Смотрел, что ты в общем коде написал для метода парсинга, но так и не понял, как без списка парсить.

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

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

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

Screenshot_2.jpg
 
Извините,может нубский вопрос). А как-где удалить эту переменную с портом?
59923


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

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