昔、MsDOSがパソコンに住んでいた当時、私はゲームSettlers IIをプレイしました。 ゲームは私を感動させ、私は数日間彼女と一人で過ごすのを楽しんだ。 ずっと後に、それが繰り返され、そして再び、そして毎回、このゲームの古さにもかかわらず、私はそれをするのに時間を費やすのを楽しんだ。 少し前に、オンラインゲームThe Settlers Onlineの広告を見たが、懐かしさに屈して登録した。 第一印象は喜びだったので、すべてが私が好きな開拓者IIのようでした。 しかし、虹色の陶酔感はすぐに過ぎ去った。 この記事では、すべての長所と短所については説明しませんが、マイナスについては1つだけ説明します-貿易。 ゲームの詳細については、
The Settlers:Now Onlineの記事をご覧ください。
理由
ゲームでの取引は、一定の存在を必要とするような方法で実装されます。 取引ロットは10分間しか公開されず、他のプレイヤーにはアクセスできなくなります。 その結果、取引が少なくとも有形の利益をもたらすためには、取引インターフェースで1時間以上を費やす必要があります。
結果
そのため、ロットを自動的に公開するボットを作成するというアイデアが生まれました。
ボットを書く
Linuxがデスクトップにインストールされているため、開発ツールとしてPerlプログラミング言語とxdotoolマウスカーソル管理ユーティリティが選択されました。
それでは始めましょう。
ボットは2つのファイルで構成されます。
- simple.trade.bot.pl-ボット自体。
- trade.guns.pl-ボタンの座標と選択した製品を取引するための追加データを含むファイル(私の場合、これらはサッカーボール用に売られた銃でした)。
ファイル
trade.guns.plから始めましょう。 このファイルには、ロットを設定するためにクリックする必要があるボタンの座標とその他の追加情報を含むHASH(名前付き)配列のリストが含まれています。
( { x=>'288', y=>'852'},
コメントに記載されている内容に加えて、このファイルには詳細な説明は必要ありません。 したがって、
simple.trade.bot.plの検討を開始します。 これはボットそのものです。
#!/usr/bin/perl # 20 sleep 20; # my @g_trade = do "trade.guns.pl"; # . . # [Ctrl]+c. while(){ # . print "NEXT TRADE\n"; # . for my $l_cur ( @g_trade ){ sleep(1); if( defined $l_cur->{dx} ){ # dx - # . # ($l_count). # . my $l_count=$l_cur->{inc}{inc}; # . №2 - . my @l_curtime=localtime(time); # x, y . move($l_cur); # . my $l_inc=0; # . for my $l_timer ( @{$l_cur->{inc}{timer}} ){ # , . $l_inc=$l_timer->{inc} if $l_curtime[2] >= $l_timer->{sh} && $l_curtime[2] <= $l_timer->{eh}; } # . my $l_rnd=int(rand($l_cur->{inc}{rnd})); # . $l_count+=$l_inc; $l_count+=$l_rnd; # . print "\tSET: [$l_count] [$l_cur->{inc}{inc} + $l_up + $l_rnd\($l_cur->{inc}{rnd})]\n"; # . while ($l_count){ $l_count--; clicktoxy($l_cur->{inc}); usleep(80); } }else{ # dx - . clicktoxy($l_cur); } } # . 11 + 0 4 ( ). my $l_time=11+int(rand(4)); my $count=0; # . for($count=0;$count<$l_time;$count++){ sleep 60; mousemove(400,500); sleep 1; mousemove(1400,500); sleep 1; } # 0 60 sleep(int(rand(60))); # } sub usleep{ # ( Ms Windows). my $l_ptr=shift; $l_ptr*=1000; `usleep $l_ptr`; } sub move{ # . my $l_coord=shift; mousemove($l_coord->{x},$l_coord->{y}); mousedown(1); usleep(600); mousemove($l_coord->{dx},$l_coord->{dy}); mouseup(1); } sub click{ # . mousedown(1); mouseup(1); } sub clicktoxy{ # , # . my $l_coord=shift; mousemove($l_coord->{x},$l_coord->{y}); mousedown(1); mouseup(1); usleep(300); } sub mousedown{ # xdotool . # : # 1 - () # 2 - () my $l_key = shift; if( $l_key ){ `xdotool mousedown $l_key`; } } sub mouseup{ # xdotool . # : # 1 - () # 2 - () my $l_key = shift; if( $l_key ){ `xdotool mouseup $l_key`; } } sub mousemove{ # xdotool x, y. my $l_x = shift; my $l_y = shift; my $l_com='xdotool mousemove'; $l_com.=" $l_x $l_y"; `$l_com`; }
ボットの準備ができました。
結論として
このボットは非常にシンプルです。 まだ多くの必要な機能がありません。 ボットをより完璧にする方法に関するアイデアの短いリストを以下に示します。
- 画面から見るためにボットを教えます。 これにはImageMagickを使用できます。
- さまざまな画面解像度とさまざまなブラウザ用に設定するようにボットに教えます。 ImageMagickの比較ユーティリティを使用した境界線とボタンの検索。
- ボットに画面から読み取るように指示します。 これには、ImageMagick + gocrを使用できます。
- トランザクションを受け入れるようにボットに教える。 ただし、ゲームは不正なトランザクションの転送を行うため、ボットはトランザクションを受け入れる前にそれを確認する必要があります。 これには、ImageMagick + gocrを使用できます。
- ボットにトレーディングインターフェースで設定されたすべてのロットを事前に知るように教えます。 多くは、プレーンテキストでXMLとしてブラウザに送信されます。 傍受には、perlモジュールNet :: Pcapを使用できます。 ImageMagick + gocrは、商品パッケージの傍受の段階で選択された製品の取引インターフェースを検索するために使用できます。
考慮すべき
- このボットはLinuxで書かれています。 Ms Windowsで動作させるには、xdotoolの代わりにMs Windowsのアナログを使用する必要があります。 たぶん、 autoitユーティリティはそうするでしょう 。 Ms WindowsでもPerlをインストールする必要があります。
- 座標trade.guns.plのファイルは 、特定の製品( 20〜34個のボールに100個の大砲を交換)、画面解像度、およびブラウザー用に設計されています。 ボットを使用するには、ボタンの座標を計算する必要があります。
- このような単純なボットでさえ使用するためにゲームで確立されたルールによると、罰は回復する権利なしで禁止されています。 6.4節