World of Warcraftの釣りの自動化

私はWorld of Warcraftに非常に長い間会って、すべてを愛していましたが、ほとんど何も私を悩ませませんでした-釣り。 これは退屈な繰り返しアクションで、釣りボタンを押すだけで、5〜15秒ごとにフロートを突くことができます。 私の開発スキルは向上しており、釣りの状況は毎年改善していませんでしたので、1石で2羽の鳥を殺すことにしました。



私は、コンピューターを制御することなく最小化モードで動作する、釣りをすることができるボットをすでに見てきました。 私はまた、不正行為の禁止に関する無慈悲なサーダードがどれほど良いかを知っています。 RAM内のデータの変更は、組み込みのアンチチートによって簡単に決定されます。 さて、最後に-ポピーでボットが見つかりませんでした。



したがって、これらの問題をすべて一度に閉じて、マウス制御をインターセプトし、フロートをスローし、必要に応じて画面上で突くボットを作成することにしました。 思ったように、pythonにはそのようなことを自動化するための幅広いツールがあり、私は間違っていませんでした。



少しグーグルで、 OpenCVを見つけました。ここでは、 簡単 なガイド付きのテンプレートが検索されています 。 それを使用して、画面上のフロートを探します。



まず、画像自体をフロートで取得する必要があります。 スクリーンショットを撮る方法のガイド付きでpyscreenshotライブラリを検索して見つけたら、少し編集します。



import pyscreenshot as ImageGrab screen_size = None screen_start_point = None screen_end_point = None #               def check_screen_size(): print "Checking screen size" img = ImageGrab.grab() # img.save('temp.png') global screen_size global screen_start_point global screen_end_point #            grab   bbox,       2.        x1=100, y1=100, x2=200, y2=200),    200200 (sic!),    2 coefficient = 2 screen_size = (img.size[0] / coefficient, img.size[1] / coefficient) #       . screen_start_point = (screen_size[0] * 0.35, screen_size[1] * 0.35) screen_end_point = (screen_size[0] * 0.65, screen_size[1] * 0.65) print ("Screen size is " + str(screen_size)) def make_screenshot(): print 'Capturing screen' screenshot = ImageGrab.grab(bbox=(screen_start_point[0], screen_start_point[1], screen_end_point[0], screen_end_point[1])) #  ,      OpenCV screenshot_name = 'var/fishing_session_' + str(int(time.time())) + '.png' screenshot.save(screenshot_name) return screenshot_name def main(): check_screensize() make_screenshot()
      
      





次の図を取得します。







次に-フロートを見つけます。 これを行うには、探しているfloatテンプレート自体が必要です。 何百もの試みの後、私はまだOpenCVが最もよく定義しているものを選択しました。 ここにあります:







上記のリンクからコードを取得し、ループとテンプレートを追加します。



 import cv2 import numpy as np from matplotlib import pyplot as plt def find_float(screenshot_name): print 'Looking for a float' for x in range(0, 7): #   template = cv2.imread('var/fishing_float_' + str(x) + '.png', 0) #        src_rgb = cv2.imread(screenshot_name) src_gray = cv2.cvtColor(src_rgb, cv2.COLOR_BGR2GRAY) #      w, h = template.shape[::-1] #  OpenCV,        res = cv2.matchTemplate(src_gray, template, cv2.TM_CCOEFF_NORMED) #       0.8  0.6,           ,     ,         threshold = 0.6 # numpy      loc = np.where( res >= threshold) #     for pt in zip(*loc[::-1]): cv2.rectangle(src_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) #      ,       if loc[0].any(): print 'Found float at ' + str(x) cv2.imwrite('var/fishing_session_' + str(int(time.time())) + '_success.png', src_rgb) return (loc[1][0] + w / 2) / 2, (loc[0][0] + h / 2) / 2 #    ,     ?      2 def main(): check_screensize() img_name = make_screenshot() find_float(img_name)
      
      





したがって、フロートの座標があり、 autopyは文字通り1行を使用してマウスカーソルを移動できます。座標を代入します。



 import autopy def move_mouse(place): x,y = place[0], place[1] print("Moving cursor to " + str(place)) autopy.mouse.smooth_move(int(screen_start_point[0]) + x , int(screen_start_point[1]) + y) def main(): check_screensize() img_name = make_screenshot() cords = find_float(img_name) move_mouse(cords)
      
      





フロート上のカーソル、そして今楽しい部分は、いつクリックするかをどのように知るのですか? 実際、ゲーム自体では、フロートは跳ね返り、何かが水に飛び込んでいるように音を出します。 画像検索でテストした後、OpenCVが結果を返す前に0.5秒を考えなければならなかったことに気付きました。フロートはさらに速くジャンプし、OpenCVを使用して画像の変更を判断することはできそうにないので、音を聞きます。 この問題については、さまざまな解決策を掘り下げて、ここで停止する必要がありました。音声認識にGoogle APIを使用する例です。そこから、音声を読み取るコードを取得します。



 import pyaudio import wave import audioop from collections import deque import time import math def listen(): print 'Listening for loud sounds...' CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 18000 #  ,     THRESHOLD = 1200 #   ,   ,        SILENCE_LIMIT = 1 #  ,       ,     #   p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, # output=True, #       output,       <a href="https://github.com/RogueAmoeba/Soundflower-Original">Soundflower</a>,     output  input,          input=True, frames_per_buffer=CHUNK) cur_data = '' rel = RATE/CHUNK slid_win = deque(maxlen=SILENCE_LIMIT * rel) #      20  (     ),   . success = False listening_start_time = time.time() while True: try: cur_data = stream.read(CHUNK) slid_win.append(math.sqrt(abs(audioop.avg(cur_data, 4)))) if(sum([x > THRESHOLD for x in slid_win]) > 0): print 'I heart something!' success = True break if time.time() - listening_start_time > 20: print 'I don\'t hear anything during 20 seconds!' break except IOError: break #    stream.close() p.terminate() return success def main(): check_screensize() img_name = make_screenshot() cords = find_float(img_name) move_mouse(cords) listen()
      
      





最後に残っているのは、魚自体を捕まえることです。音が聞こえたら、再びautopyを使用します。



 def snatch(): print('Snatching!') autopy.mouse.click(autopy.mouse.RIGHT_BUTTON) def main(): check_screensize() img_name = make_screenshot() cords = find_float(img_name) move_mouse(cords) if listen(): snatch()
      
      





私のテストによると、私は夜にボート釣りを辞め、そのような虐待の週に彼は約7000回投げ、約5000匹の魚を釣った。 30%のエラーは、フロートの点灯または回転のためにサウンドをキャッチしたり、フロートを見つけることができない場合があるために発生します。 しかし、私はその結果に満足しています-最初にpythonを試し、ボットを作成し、多くの時間を節約しました。



ここで完全なコードを見ることができますが、ゲームプロセスの自動化はユーザー契約に違反し 、禁止を取得できるため、フィッシングの悪用を使用しないことを強くお勧めします。



どんなコメントでも喜んでいます。



All Articles