web-dev-qa-db-ja.com

プログラムは別のプログラムをどのように制御できますか?

ボット、彼らはどのように機能しますか?ビデオゲームにキーが押された、またはマウスがクリックされたと伝えますか?

そうでない場合は、プログラムにキーが押されたことを別のプログラムに伝える方法はありますか?いくつかのゲームに勝つためのプログラムを作りたいです。そのため、リソースや例を歓迎します。

更新:では、1つの方法はキーストロークをエミュレートすることです。

39
Anton

私は一度に(Pogoゲームから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 ++またはその派生物を使用して、KeyPressとマウスの動きをウィンドウに送信する方法を「リバースエンジニアリング」することです。

Java

Javaには驚くほど移植性の高いRobotクラスがあり、次のことが可能です。

  1. 画面からピクセルを読み取ります。
  2. マウスを制御します。
  3. キーを送信します。

あなたが迅速かつ簡単に探しているなら、私はそのショットを与えます。

基本的なロジック

これはインターネット上の他の場所で詳しく説明されていますが、ほとんどのボットは単純なステートマシンプログラムのフローに従います。画面(またはパケット、またはメモリ)を読み取り、読み取り値と過去のデータに基づいて現在の「状態」を見つけ、計算を行い、結果をプログラムに送り返します。

画面の読み取りは難しい場合がありますが、多くの場合、プログラムがどの状態にあるのかを知るためのウィンドウに相対的な「幸運な」ピクセルがいくつかあると考えると、簡単になります。これらのピクセルの検出は自動化できます。

50
Stefan Mai

いくつかの種類のボットがあります。私がCSをプレイしていたときに覚えていることから(ずっと前)

一部のボットは、アプリケーション(ライブラリ、プレイヤーのいる場所など)の検査にアプリケーション自体のライブラリを使用します。ボットは、ライブラリを使用して移動を制御します。マウスのメッセージを呼び出してゲームの移動方法などを伝えるボットの実装が多いとは思えません...

一部のボットは、アプリケーションレベルのプロトコルをエミュレートします(マルチプレイヤーの場合)。つまり、ゲームを実行する必要さえありません。ボットは仮想ゲームで実行できます。

他のポスターが示唆していることとは反対になります。ゲームボットを書くことは、おそらく実際にゲームをプレイするよりも価値のある運動であり、彼らがどのように機能するのか興味があるのは良い兆候です。 :)

5
cgp

一部のプログラム(MMORPGでGrindを実行するプログラムなど)は、単にキーストロークをエミュレートしています。これを行うツールは AutoIt です。

実際にゲームを実際にプレイするボットに関しては、私は実際にゲームで何もしていませんが、ヒューリスティックですが、おそらく事前定義されたアクションのセットを使用すると想定しています。

4
samoz

このコンセプトの最大の欠点は入力ではなく、ゲームの出力です。ボットはランダムにキーを押すだけではなく、「発生」しているものを知る必要があります。このデータをクエリできるゲームはほとんどありません。これにより、ボットが非常に厄介な問題を解決できます。1秒あたり60フレームの2Dビジュアルデータを仮想空間に変換します。

実際にボットプレーヤーを許可するだけでなく、それらを奨励するゲームがあります。 Open RTS はそれらの1つですが、 GUN-TACTYXcrobots のような簡単なものもあり、これらは良い出発点です。

4
SpliFF

あなたのようなボットは、キーの押下とマウスの動き/クリックをエミュレートするだけなので、ゲームは人間がプレイしているか他のプログラムかを判断できません。ゲームと連動する必要はまったくありません。

2
AlbertoPL

ボットは、ゲーム(サーバー)のクライアントとして機能します。その後、ユーザーが手動で送信するのと同じように、適切なデータを送信できます。ボット(クライアント)は、サーバーからのデータを分析します(「誰かが左から攻撃しようとしています」など)。クライアントは、最適な移動を計算し、適切なデータをサーバーに送信して実行できる必要があります。

これがすべてのゲームで機能するかどうかはわかりません。

2

ゲームに大きく依存します。たとえば、インターネットエクスプローラー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を使用するゲームではうまくいきますが)

AutoIT は、この種のソフトウェアを実行するのに最適な言語だと思います。ボットの構築には使用していませんが、クリックとキーの送信は非常に簡単でした。

1
Geo

私の理解では、ほとんどのハイエンドゲームボットはシステムコールを使用して、ゲームクライアントのメモリスペースにマップし、レイアウトをリバースエンジニアリングし、クライアントプログラムの内部変数を直接操作します。それは私がただ楽しみのために起きているよりもはるかに多くの仕事です。

1
T.E.D.

「プログラムを制御する」と言うときは、プログラムがどのように制御されるかを考えてください。ほとんどはキーボード/マウス入力を受け入れます。

キーボード/マウス入力をシミュレートするプログラムを作成したら、そこに行きます。

その結果、プログラムが入力ボックスを介して渡された引数を受け入れた場合、入力ボックスを介して送信されたかのように引数を送信するプログラムを作成します。

これがすべてのボットの仕組みです。それがあなたのためにいくつかの光を放つことを願っています!

編集:これが大多数ボットの仕組みです:-)

1
Travis

Javaで Robot クラスを使用して、マウスの動き/クリックおよびキーボード入力をエミュレートできます。スクリーンショットを撮ることもできます。

1
Bill the Lizard