Как может программное управление другая программа?

Я не вижу здесь упомянутого, но разделение ваших аргументов является полезной альтернативой и становится особенно полезным, если вы строите аргументы для команды динамически (в отличие от использования Invoke-Expression ). Вы можете использовать массивы для позиционных аргументов и хеш-таблицы для именованных аргументов. Вот несколько примеров:

Splat с массивами (позиционные аргументы)

Тест-соединение с позиционными аргументами

Test-Connection www.google.com localhost

с разбрызгиванием массива

$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentArray

Обратите внимание, что при сплаттинге мы ссылаемся на сплаттинговую переменную как @ вместо $. То же самое и при использовании Hashtable для сплата.

Splat с хэш-таблицей (именованные аргументы)

Тест-соединение с именованными аргументами

Test-Connection -ComputerName www.google.com -Source localhost

с хэш-таблицей Splatting

$argumentHash = @{
  ComputerName = 'www.google.com'
  Source = 'localhost'
}
Test-Connection @argumentHash

Splat Позиционные и именованные Аргументы одновременно

Тест-соединение с позиционными и именованными аргументами

Test-Connection www.google.com localhost -Count 1

Splatting Array и Hashtables вместе

$argumentHash = @{
  Count = 1
}
$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentHash @argumentArray
40
задан user4157124 24 September 2017 в 02:01
поделиться

11 ответов

Я когда-то писал кучу ботов (от Pogo games до Yohoho Puzzle Pirates). Для окон вы обычно собираетесь либо отправлять события Win32 для имитации движений мыши, либо подделывать фактически низкоуровневые сообщения, отправляемые между окнами при фактическом нажатии мыши. Во многом это действительно зависит от того, как программа отреагирует (приняв сообщение с координатами или, в случае Java, сразу прочитав координаты мыши). Часть «автоматизации» обычно включает в себя чтение экрана и запись эвристик или алгоритмов для определения состояния, но также может быть столь же приятной, как перехват пакетов (много информации там в плохих реализациях покера), или такой же хакерской, как прямое чтение ячеек памяти. Довольно большое "поле" и плохо задокументировано довольно выгодно и не сложно.

Отправка ввода

C / C ++ (в Windows)

Для ключей попробуйте CodeProject:

http://www.codeproject.com/KB/cpp /sendkeys_cpp_Article.aspx

И сообщения:

http://www.codeproject.com/KB/threads/sendmsg.aspx

Лучше всего научиться отправлять сообщения с помощью Win32 API, а затем использовать что-нибудь как Spy ++ или его производные для «обратного проектирования» того, как нажатия клавиш и движения мыши отправляются в окно.

Java

В Java есть удивительно портативный класс Robot, который может:

  1. Считывать пиксели с экрана.
  2. Управляйте мышью.
  3. Отправляйте ключи.

Я бы попробовал, если вам нужно быстро и легко.

Базовая логика

Это подробно описано в другом месте в Интернете, но большинство ботов следуют простому потоку программы конечного автомата. Вы читаете экран (или пакеты, или память),

50
ответ дан 27 November 2019 в 01:36
поделиться

Некоторые программы (например, те, которые работают для вас в MMORPG) просто имитируют нажатия клавиш. Инструмент для этого - AutoIt .

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

4
ответ дан 27 November 2019 в 01:36
поделиться

Есть несколько видов ботов. Из того, что я помню, когда я играл в CS (очень, очень давно)

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

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

Я собираюсь пойти вразрез с тем, что предложил один другой автор: написание игрового бота, вероятно, более ценное упражнение, чем сама игра, и любопытство к тому, как они работают, - хороший знак. :)

5
ответ дан 27 November 2019 в 01:36
поделиться

Самым большим недостатком этой концепции является не ввод, а вывод игры. Ваш бот не может просто случайным образом нажимать клавиши, он должен знать, что «происходит». Очень немногие игры позволяют вам запрашивать эти данные, что заставит вашего бота решить очень сложную задачу - преобразование 60 кадров в секунду 2D-визуальных данных в виртуальное пространство.

На самом деле существуют игры, которые позволяют не только игрокам-ботам , но поощряйте их. Открытая RTS - одна из таких, но есть и более простые, такие как GUN-TACTYX и кроботы , которые являются хорошей отправной точкой.

4
ответ дан 27 November 2019 в 01:36
поделиться

Боты будут действовать как клиенты игры (сервера). Затем они могут отправлять соответствующие данные так же, как пользователь может отправлять вручную. Бот (клиент) будет анализировать данные с сервера («кто-то собирается атаковать слева») и так далее. Затем клиент сможет вычислить лучший ход и отправить соответствующие данные на сервер для его выполнения.

Я не уверен, будет ли это работать со всеми играми.

2
ответ дан 27 November 2019 в 01:36
поделиться

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

2
ответ дан 27 November 2019 в 01:36
поделиться

Очень многое зависит от игры. Например, я сделал бота для Travian (это онлайн-игра), который использовал Internet Explorer activeX для автоматизации движений. Я написал приложение на C #, и на то, чтобы заставить его работать, ушло около 30 минут. Вызвать методы ActiveX просто и заставить его выполнять такие действия, как заполнение текстовых полей или нажатие кнопок. Например, для входа в систему я использовал следующее:

var inputs = web.Document.GetElementsByTagName("input").
                        Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];

nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");

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

2
ответ дан 27 November 2019 в 01:36
поделиться

Я думаю AutoIT - отличный язык для создания такого рода программ. Хотя я не использовал его для создания ботов, отправлять клики и ключи было очень легко.

1
ответ дан 27 November 2019 в 01:36
поделиться

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

1
ответ дан 27 November 2019 в 01:36
поделиться

Когда вы говорите «управлять программой», подумайте о том, как управляются программы. Большинство из них принимают ввод с клавиатуры / мыши.

Если вы пишете программу для имитации ввода с клавиатуры / мыши, то готово.

Следствием этого будет то, что если программа принимает аргументы, передаваемые через поле ввода, напишите программу для отправки аргументов, как если бы они были отправлены через поле ввода.

Так работают все боты. Надеюсь, это прольет вам свет!

Edit: Так работает подавляющее большинство ботов: -)

2
ответ дан 27 November 2019 в 01:36
поделиться

Вы можете эмулировать движения / щелчки мыши и ввод с клавиатуры в Java с помощью класса Robot . Он также позволяет делать снимки экрана.

1
ответ дан 27 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: