Değerli yorumunuz için öncelikle teşekkürler hocam.
Öncelikle mavi hapla devam edicem hocam.
Sebebi de oyun güvenlik korumasından dolayı dışarıdan bağlantılara izin vermiyor.
Yapılabilir mi evet yapılabilir.
Ama yıllarını vermiş insanlar yapabiliyor bunu.
Baya zor ve uğraşlı bir koruması var.
O yüzden ben oyun farketmeden bir makro gibi kullanmaya devam etmek zorundayım.
Dediklerinizin aynısını bende düşünüyorum şu şekilde olacak diye kafamdan ama dil bilmediğim için bunu kodlara dökmekte zorlanıyorum.
Bu konuyu açmamın sebebi de bu.
Zorlanmam ve yardım istemem.
Google da bu kodlar çıkıyor.
Resim bulma,koordinatını belirleme,o koordinata click yapma vs.
Fakat ben bu kodları birleştirmekte sıkıntı yaşıyorum.
Googleye yazınca hepsini tek tek kodlar bulunabiliyor ama birleştirmeye gelince burada dil bilgisi devreye giriyor.
Bende de dil bilgisi amatörün daha altında olduğu için zorlanıyorum hocam. Şimdiden teşekkürler.
Değerli yorumunuz için öncelikle size de teşekkürler hocam.
Dediğiniz gibi bunu basit bir şekilde pyAutogui modülü ile yapılabiliyor.
Fakat ben kodları birleştiremiyorum.
Kodları googleden buluyorum birleştirmeye gelince beceremiyorum.
Bot kontrol ekranında 6 adet resim var.
2 adet resim birbirine benziyor fakat birinin üstünde mavi çizgi daha çok.
Bot kontrolün bizden istediği ise mavi çizgisi fazla olana tıklamak.
Ben çizgi için uğraşmıyorum bile.
İlk tıkladığında tutmasa bile 2 veya 3. tıklamasında illaki tutturur.
“Bana kalırsa 30 dakikada bir oyunu baştan başlatıp oyunu oynatan bot yazman daha kolay olacak”
Bu dediğinizi nasıl yapacağımı gerçekten bilmiyorum. Bunu yapsam tabi daha iyi ama dediğim gibi dil bilgim amatörün daha altı
Naçizane fikrimi belirtmek istiyorum. Bunu söylemek bana düşmez çünkü bu işte gerçekten senior olan adamlar var bu forumda.
Neden bot yapmadan önce dili öğrenme çabası içerisine girmiyorsunuz ?
Neden koşmak ?
Neden emeklememek ?
Sitenizdeki projeleri de inceledim. Onlarda mı böyle sorunlar sonucunda çıkmış projeler ?
Onları da mı birileri tarafından yazılıp hazır kullanılan kodlar(kod) ?
Bu forumun bana öğrettiği yegane şey; şahıs olarak birine sormadan önce herkesin görüşünü almak(araştırmak) ve bu dili "tamam ya kendimi ifade edebiliyorum " diyebilene kadar öğrenmeme vesile olan insanlarla dolu. Sizce bu insanlar sizin hakkınızda ne düşünüyordur ?
(Hazır konusu açılmışken de hepsine teker teker teşekkür ediyorum )
Hocam Öncelikle kodlar benim değil.
Saygıdeğer ve paylaşımcı bir hocamız yazmış ve github da paylaşmış.
Buradan teşekkürler kendisine.
“Neden bot yapmadan önce dili öğrenme çabası içerisine girmiyorsunuz ?”
Benim bu platforma girerken de ilk duyduğum şey sevdiğin şeyi yap ki sıkılmayasın.
Bende oyunda ki botu hiç yazmadım belki ama içinde birkaç değişiklik yaparak kullanmak bile bi zevk veriyor insana.
Önce botu çalıştırıcam sonra yine öğrenmeye devam edicem.
Koşmak yada emeklememek değil niyetim.
Bu botu çalıştırmaya çalışırken bile bir sürü bilgi öğreniyorum python hakkında.
Hazır kodlarla çalışmakta belki ezbere öğrenmek gibi birşey ama bu az bile olsa birşeyler katıyor insana.
Çok az bir miktar da olsa python fonksiyonlarını öğrenmeye başlıyorsun.
Belki dediğiniz gibi yapmak daha doğru ama o zaman da bu bot çalışmaz ve insanın morali bozulur.
Bende bu yüzden önce botumu çalıştırıcam o zevki tatıcam ama yine farklı konulara da yönelerek, ders videoları izleyerek, bir şekilde pythonın tamamını öğrenip kendim bot yazıcam.
Değerli yorumunuz için de teşekkürler hocam.
Eğer temeliniz yoksa hazır kodları inceleyerek ilerlemek çok uzun zaman alıyor. Paylaşmış olduğunuz kod 200 satırdan fazla. Ek olarak içinde arayüz, otomasyon ve görsel işleme vb. kütüphanelerin kullanımını da barındırıyor. “ekranyakala.py” isimli dosyada neler olduğunu bilmiyoruz bile.
Bu şekilde ilerlemek istiyorsanız, bu sizin tercihiniz fakat yerinizde olsam bir kaç gün Python’ın temellerini kurcalar, süreci hızlandırırdım.
Ben de öğrenmeye Python ile yapılan çeşitli 2D oyunların kodunu inceleyerek başlamıştım. “Köşeli parantezler ile yapılan şeyler ne ola ki?” diye sorgularken, Python’da listelerin var olduğunu ancak 4 gün sonra kavrayabilmiştim. Demem o ki, öncesinde biraz hazırlık yaparsanız, çok daha hızlı ve iyi bir şekilde ilerleyebilirsiniz.
Hocam değerli yorumunuz için öncellikle teşekkürler.
Evet biraz daha zaman alabilir.
Ama ben bunu iş olarak değil hobi olarak yapıyorum.
Yine botum çalışsın ben diğer bilgisayarımda yine dil bilgisine çalışabilirim.
ekranYakala.py içeriği de yukarıda semtex hocamın paylaştığı win32gui modülü kodları var.
import numpy as np
import win32gui, win32ui, win32con
from threading import Thread, Lock
class ekranYakala:
stopped = True
lock = None
screenshot = None
w = 0
h = 0
hwnd = None
cropped_x = 0
cropped_y = 0
offset_x = 0
offset_y = 0
def __init__(self, window_name=None):
# create a thread lock object
self.lock = Lock()
# find the handle for the window we want to capture.
# if no window name is given, capture the entire screen
if window_name is None:
self.hwnd = win32gui.GetDesktopWindow()
else:
self.hwnd = win32gui.FindWindow(None, window_name)
if not self.hwnd:
raise Exception('Window not found: {}'.format(window_name))
# get the window size
window_rect = win32gui.GetWindowRect(self.hwnd)
self.w = window_rect[2] - window_rect[0]
self.h = window_rect[3] - window_rect[1]
# account for the window border and titlebar and cut them off
# border_pixels = 8
# titlebar_pixels = 30
# self.w = self.w - (border_pixels * 2)
border_pixels = 1
titlebar_pixels = 10
self.w = self.w - border_pixels
self.h = self.h - titlebar_pixels - border_pixels
self.cropped_x = border_pixels
self.cropped_y = titlebar_pixels
# set the cropped coordinates offset so we can translate screenshot
# images into actual screen positions
self.offset_x = window_rect[0] + self.cropped_x
self.offset_y = window_rect[1] + self.cropped_y
def get_screenshot(self):
# get the window image data
wDC = win32gui.GetWindowDC(self.hwnd)
dcObj = win32ui.CreateDCFromHandle(wDC)
cDC = dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, self.w, self.h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (self.w, self.h), dcObj, (self.cropped_x, self.cropped_y), win32con.SRCCOPY)
# convert the raw data into a format opencv can read
#dataBitMap.SaveBitmapFile(cDC, 'debug.bmp')
signedIntsArray = dataBitMap.GetBitmapBits(True)
img = np.fromstring(signedIntsArray, dtype='uint8')
img.shape = (self.h, self.w, 4)
# free resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(self.hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
# drop the alpha channel, or cv.matchTemplate() will throw an error like:
# error: (-215:Assertion failed) (depth == CV_8U || depth == CV_32F) && type == _templ.type()
# && _img.dims() <= 2 in function 'cv::matchTemplate'
img = img[...,:3]
# make image C_CONTIGUOUS to avoid errors that look like:
# File ... in draw_rectangles
# TypeError: an integer is required (got type tuple)
# see the discussion here:
# https://github.com/opencv/opencv/issues/14866#issuecomment-580207109
img = np.ascontiguousarray(img)
return img
@staticmethod
def list_windowname():
def winEnumHandler(hwnd, ctx): #açık pencere isimlerini listeler
if win32gui.IsWindowVisible(hwnd):
print(hex(hwnd), win32gui.GetWindowText(hwnd))
win32gui.EnumWindows(winEnumHandler, None)
def get_screen_position(self, pos):
return (pos[0] + self.offset_x, pos[1] + self.offset_y)
def start(self):
self.stopped = False
t = Thread(target=self.run)
t.start()
def stop(self):
self.stopped = True
def run(self):
while not self.stopped:
screenshot = self.get_screenshot()
self.lock.acquire()
self.screenshot = screenshot
self.lock.release()
Biraz başlangıç kodu ekleyeyim.
#import the necessary packages
import numpy as np
import pyautogui
import imutils
import cv2
img_rgb = cv2.imread("c:\\Deneme2\\main.jpeg")
template = cv2.imread("c:\\Deneme2\\find.jpg")
dimensions = img_rgb.shape
height = img_rgb.shape[0]
width = img_rgb.shape[1]
List = []
w,h = template.shape[0], template.shape[1]
res = cv2.matchTemplate(img_rgb,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.95
loc = np.where( res >= threshold)
for i in zip(*loc[::-1]):
location = (i[0] + w, i[1] + h)
x = i[0] + w
y = i[1] + h
List.append([i, location])
cv2.rectangle(img_rgb, i, location, (0,255,0), 3)
cv2.imshow("result",img_rgb)
print(x,y)
pyautogui.moveTo(x,y, 2)
pyautogui.click(button='right')
pyautogui.click(x, y)
cv2.waitKey(10000)
Basitten zora doğru.
Bana gönderdiğin resim
Bunu main.jpeg olarak kullandım.
Resmin içinden varsayılan bir resmi seçtim.
Bunu da içinden kesip find.jpg olarak kullandım.
Dikkat et uzantıların biri jpg diğeri jpeg neden öyle yaptım bilmiyorum. Ramazanda canım istedi.
Sonra c:\ üzerinde Deneme2 klasörü içinde hepsini çalıştırdım.
Resmin üzerine gidip tıklıyor.
Tabi verilen resim çözünürlüğü düşük olduğundan küçük bir resme tıklıyor.
Tam ekran almak için.
image = pyautogui.screenshot()
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
cv2.imwrite("desktop.png", image)
cv2.imshow("Deneme", image)
cv2.waitKey(0)
Gibi bir kod yapıştırarak tam ekran masa üstü görüntünü alabilirsin. Onun üzerinde keseceğin resmi aramak için kullanırsan. Büyük ihtimalle şöyle olacak.
Ve mouse üzerine gidecek.
Resme sağ tıklattım ama bir şey olmasını beklememek lazım.
Buradan özetle.
Tam periyotla tam ekran masa üstü resmi alıp,
seçilmesini istediğin resimleri kesip şablon olarak tutup, ana ekranda atatıp çerçeve içine aldırdım.
Bunun yerine resmi oluşturmayıp, çerçeveye de almadan sadece mouse u yürütüp tıkladığın kodu kullanabilirsin.
Resimle görünmesi sadece paterni yakaladığına dair görsel amaçlı.
Kolay gelsin.
Faydalandığım bazı kaynakların linkini de buraya bırakayım. Milletin kodunun üstüne çökmüş olmayalım.
python - How do I find an image contained within an image? - Stack Overflow
Taking screenshots with OpenCV and Python - PyImageSearch
Mouse Control Functions — PyAutoGUI documentation
Object Detection — OpenCV 2.4.13.7 documentation
En faydalandığımı da en sona ekleyeyim.
OpenCV matchTemplate finds same shapen multiple times - Python - Stack Overflow
Çok saolun hocam. Nasil teşekkür etsem azdır.
merhabalar hatanızı çözdünüz mü bende boyle bişey almaktayım import keyboard, threading, os, webbrowser, ctypes
Ortada bir kod var mı? Bir de hata mesajının ekran resmi falan?
yukarıda paylaştım @semtex
Modüller yüklü değilse kullanamazsın.
pip ile modülleri yüklemeyi biliyor musun?
Yada Pycharm ile modül yüklemeyi?
Pycharm Kütüphane Nasıl Eklenir? - TeknoDestek
Bu şekilde olmayan kütüphaneleri eklemekle başlayabilirsin.
teşekkürler ben buna bi ugrasayım <3
@semtex
modüller yüklenmeyince bulunamadı hatası vermiş. Üzerine tıkla orada yükleyim der. Yüklersin ilgili modülü.
Takılırsan haber ver bakalım ne yapabiliriz.
ben pip ve eksik modülleri pycharm yardımı ile indirdim ama yine aynı hata müsaitseniz discorddan yardım alabilirmiyim sizden dc: muhamed799#4071 @semtex
kütüphanede bunlar var @semtex
ve çalıştı suan kendi kendine eline saglıkn dostum simdi oyun içi çalıstırmakta
@semtex