
Halo semuanya, saya adalah pengguna senang sistem operasi GNU / Linux. Dan seperti banyak orang tahu, ada lebih sedikit mainan yang masuk ke Linux tanpa tarian tambahan dengan rebana daripada di Windows.
Dan bahkan lebih sedikit game dalam genre MMORPG.
Namun, sekitar setengah tahun atau setahun yang lalu, saya mengetahui bahwa game Albion Online di-porting ke Linux.
Gim ini sangat menghibur, tetapi membutuhkan waktu yang cukup besar. Dan agar tidak menyia-nyiakan waktu hidup saya yang berharga dengan sia-sia, saya memutuskan untuk menulis bot. Siapa yang akan bertani saya sumber daya sementara saya pergi tentang bisnis saya.
Permainan ini memiliki banyak jenis kerajinan, Anda dapat memotong kayu, menggali batu, bahkan menumbuhkan kebun, tetapi pilihan saya dibuat untuk memancing.
Jadi, inti dari memancing di Albion online adalah sederhana, ambil pancing, pergi ke kolam, tahan tombol untuk melempar umpan, tunggu waktu gigitan tertentu.

Saat mematuk, Anda harus kembali menekan tombol dan memainkan mini-game.
Di sini Anda perlu menarik secara bergantian, lalu jangan menarik pancing, tergantung pada gerakan pelampung. Float selalu bergerak secara acak, dengan urutan dan kecepatan yang berbeda. Dan jika Anda melakukan segalanya dengan benar dan pelampung tidak melampaui zona yang diizinkan, maka Anda akan menangkap ikan.
Jadi, kami akan mengotomatiskan semua bisnis ini. Dengan cara python bahasa komputer. Saya memutuskan untuk memulai dari yang paling sulit, yaitu dari saat di mana permainan dimulai dengan pelampung. Di sini lagi,
perpustakaan visi komputer
OpenCV favorit saya datang untuk menyelamatkan saya. Dengan meluncurkannya, kita dapat mendeteksi objek, misalnya, dalam gambar. Namun, perpustakaan itu sendiri tidak tahu persis apa yang perlu kita temukan. Tentu saja, ada banyak pola di mana berbagai objek disajikan untuk mendefinisikannya. Namun, pasti tidak ada pelampung untuk Albion Online.
Tapi di perpustakaan ini ada fungsi pencarian yang bagus untuk template yang diberikan. Dan sebagai templat, saya hanya mengambil tangkapan layar kendaraan kami.

Dan seperti yang kita lihat semuanya dengan sempurna ditemukan dalam gambar.
Dan perbedaan antara gambar dan video streaming tidak besar, karena sebenarnya itu hanya aliran gambar dengan kecepatan yang sangat cepat, dan beberapa baris kode. Dan sekarang kita sudah dapat menemukan float di video streaming.
Kodeimport numpy as np import cv2 from mss.linux import MSS as mss from PIL import Image import time import pyautogui as pg import cv2 import mss import numpy template = cv2.imread("2019-07-02_06-55_1.png", cv2.IMREAD_GRAYSCALE) w, h = template.shape[::-1] with mss.mss() as sct: monitor = {"top": 40, "left": 0, "width": 800, "height": 640} while "Screen capturing": last_time = time.time() img = numpy.array(sct.grab(monitor)) cv2.imshow("OpenCV/Numpy normal", img) print("fps: {}".format(1 / (time.time() - last_time))) gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(gray_frame, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= 0.7) for pt in zip(*loc[::-1]): cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3) cv2.imshow("Frame", img) key = cv2.waitKey(1) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() break
Kami melangkah lebih jauh. Float itu sendiri bergerak bolak-balik dan kita juga perlu memindahkannya dengan menekan tombol pada mouse.
Dan karena itu, kita memerlukan koordinatnya. Dan untuk ini, kalimat-kalimat ini membantu kita.
for p in img: pts = (pt[0],pt[1]) x = (pt[0]) y = (pt[1]) print (x) cv2.circle(template,pts,5,(200,0,0),2) cv2.putText(img, "%d-%d" % (x,y), (x+10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2)
Kemudian kita hanya menggunakan pustaka
PyAutoGUI , yang akan menjepit tombol mouse dan menekannya dengan frekuensi tertentu.
if 100 < x < 500: pyautogui.mouseDown(button='left') time.sleep(1) pyautogui.mouseUp(button='left') x = 0
Dan mini-game itu sendiri berhasil dimenangkan.

Kami memasukkan semuanya ke dalam fungsi dan membiarkannya untuk saat ini.
Kemudian kita kembali ke bagian aslinya, di mana kita harus memonitor pelampung.
Itu semua sedikit berbeda, misalnya, kita dapat menentukan di mana float akan dilemparkan, dan mencoba untuk menganalisis bagian layar untuk keberadaan float. Namun, pelampung yang dilemparkan ke air muncul pada sudut yang berbeda dan terus-menerus bergoyang.
Dalam hal ini, kita akan menggunakan metode yang sedikit berbeda. Esensinya adalah kami menganalisis, katakanlah perbedaan piksel di dalam fragmen yang dilacak. Yang, jika tidak ada float, mendekati nol.
Akibatnya, nilai optimal ditemukan di mana, dengan hilangnya float, kita dapat melakukan tindakan.
Kode def screen_record(): sct = mss.mss() last_time = time.time() while(True): img = sct.grab(mon) print('loop took {} seconds'.format(time.time() - last_time)) last_time = time.time() img = np.array(img) processed_image = process_image(img) mean = np.mean(processed_image) print('mean = ', mean) if mean <= float(0.11): print('SSSSSSSS ') pyautogui.click(button='left') break return else: time.sleep(0.01) continue return if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break
Dan kami memproduksinya, yaitu, klik tombol mouse. Kami juga memasukkan ini ke dalam fungsi.
Dan akhirnya, sebagai kesimpulan, kita cukup menulis skrip di mana dalam loop tak terbatas kita melempar pancing dan melakukan fungsi pertama dan kedua secara bergantian.
while "": time.sleep(1) pyautogui.moveTo(431,175,duration=1) pyautogui.mouseDown(button='left') pyautogui.moveTo(450.200,duration=1) pyautogui.mouseUp(button='left') time.sleep(2) screen_record() time.sleep(0.01) ss()
Ini adalah instruksi video yang lengkap dan contoh dari pekerjaan bot ini:
Sebenarnya ada beberapa nuansa di mana Anda perlu perdukunan dengan angka, karena angka-angka ini dipilih untuk monitor saya, lokasi, karakter dan peralatan. Tapi saya pikir untuk pythonist yang kompeten ini tidak akan menjadi masalah.
Seluruh skrip:
Kode import numpy as np import cv2 from mss.linux import MSS as mss from PIL import Image import time import pyautogui as pg import imutils import mss import numpy import pyautogui template = cv2.imread("2019-07-02_06-55_1.png", cv2.IMREAD_GRAYSCALE) w, h = template.shape[::-1] color_yellow = (0,255,255) mon = {'top': 80, 'left': 350, 'width': 100, 'height': 100} def process_image(original_image): processed_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) processed_image = cv2.Canny(processed_image, threshold1=200, threshold2=300) return processed_image def ss(): op = 1 with mss.mss() as sct: monitor = {"top": 40, "left": 0, "width": 800, "height": 640} while "Screen capturing": last_time = time.time() img = numpy.array(sct.grab(monitor)) gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(gray_frame, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= 0.7) op += 1 print (op) for pt in zip(*loc[::-1]): cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3) for p in img: pts = (pt[0],pt[1]) x = (pt[0]) y = (pt[1]) print (x) if 100 < x < 490: pyautogui.mouseDown(button='left') time.sleep(2) pyautogui.mouseUp(button='left') x = 0 break else: continue break else: continue break key = cv2.waitKey(1) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() if op > 35: return def screen_record(): sct = mss.mss() last_time = time.time() while(True): img = sct.grab(mon) print('loop took {} seconds'.format(time.time() - last_time)) last_time = time.time() img = np.array(img) processed_image = process_image(img) mean = np.mean(processed_image) print('mean = ', mean) if mean <= float(0.11): print('SSSSSSSS ') pyautogui.click(button='left') break return else: time.sleep(0.01) continue return if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break while "": time.sleep(1) pyautogui.moveTo(431,175,duration=1) pyautogui.mouseDown(button='left') pyautogui.moveTo(450.200,duration=1) pyautogui.mouseUp(button='left') time.sleep(2) screen_record() time.sleep(0.01) ss()
Mereka yang suka mengatakan bahwa ini buang-buang waktu, saya akan perhatikan bahwa ini hanya alat, Anda dapat menggunakan perpustakaan ini di proyek lain. Visi komputer itu sendiri digunakan baik dalam melayang-layang misil balistik dan dalam program untuk membantu orang-orang cacat. Di mana Anda memutuskan untuk menerapkannya, hanya keinginan Anda.
Terima kasih atas perhatiannya.