Tekrar Tekrar Tıklama Gerektiren İşler İçin Otomatik Bilgisayar Kodu

Selamlar herkese,

Python öğrenmek için işime yarayacak bir proje ararken, Google Photos’un bir sıkıntısından ötürü, herkesin işine yarayabilecek bir proje keşfettim ve 1-2 saatte tamamladım. Ortaya çıkan kod, birçok kişinin çeşitli işlerde kullanabileceği bir kod olduğundan sizlerle de paylaşmak istedim.

 

Neden Bu Kodu Yazmam Gerekti?

Fotoğraflarımı yedeklemek için Google Photos kullanmaya başladım. Gelecekte muazzam olacak bir uygulama; ancak baya eksiği var şu anda. Sorunlarından birisi, her şeyi fotoğrafa işlenmiş zamana göre sort etmesi (hani dosya eğer 30 Nisan 2016’da kaydedildiyse, ona göre düzenliyor – bu tarihin, fotoğrafın çekildiği tarih olduğunu varsayarak). Ama tahmin edebileceğiniz gibi, bir fotoğraf dosyasına sağ tıklayıp Properties altında gördüğünüz, fotoğrafın çekildiği zamanın “X” olduğunu iddia eden tarih ve saat çoğu zaman hatalı oluyor. Hatta eğer benim gibi “data recovery” falan yapıp da yanmış bir harddiskten kurtardıysanız ve Google Photos’a upload ettiyseniz fotoğrafları, o zaman iyice nanay oluyor o sayılar. Dolayısıyla örneğin benim aslen 2012’den kalma fotoğraflar, Google Photos’da 2016 fotoları arasında çıkıyor. Bu da rahatsız edici, binlerce olduğu için.

Ne yazık ki Google Photos’ta başka türlü bir sort imkanı olmadığı gibi, topluca seçip tarih değiştirme imkanı da yok. Anlayacağın, atıyorum 1000 fotoğrafı eski bir tarihe almak istiyorsan, tek tek tıklayıp değiştireceksin tarihlerini. Bu da günler sürüyor.

İşte bu nedenle, fotoğrafı seç, düzenleye tıkla, tarihi değiştir, Enter’a bas, fotoğrafı kapat, diğer fotoğrafı seç ve tekrar et döngüsünü binlerce defa yapmam gerekiyordu. Elle yapılacak olsa günler, belki haftalar sürecek bir iş. Programlama sayesinde 2-3 saatte bitti (kod yazımı dahil).

 

Siz Bu Kodu Neden/Nasıl Kullanabilirsiniz?

İşte kilit nokta bu! Hatırlıyor musunuz, ODTÜ’de derslerin açıldığı anı görmek için sayfayı refresh edip durduğunuzu ve siz andaval gibi elinizle yaparken, programlamadan anlayan tayfanın sizden önce dersleri seçiverdiği günleri? Hani her dönem başında, sabahın köründe kalkıp sayfa yenilemeye ve tıklamaya başladığınız ve kimi zaman saatlerce sürebilen işkenceyi? İşte o tür şeyleri, bu kodla yenebilirsiniz.

 

Nasıl Yazdım?

Dediğim gibi, yapmam gereken iş için bilgisayar ekranımın hangi noktalarına, hangi sırayla tıkladığımı inceledim önce. Sonra bunları, Python 3.5 kullanarak koda dönüştürdüm. Böylece bilgisayar otomatik yapmaya başladı. Anaconda altında Spyder kullanarak yazdım kodu; ancak normal cmd üzerinden de çalıştırabilirsiniz elbet. win32apiwin32con, time, sys ve tkinter paketlerini kullandım. Bunların ilk ikisi Windows NT’ye hükmetmek için gerekiyor, diğer üçü kod içi basit işlemler için… Bunların hiçbirini bilmenize gerek yok, sadece merak edenler için söylüyorum (Anaconda’da bu paketlerin hepsi otomatik geliyor).

 

Tatava Yapma, Kodu Ver Geç

# -*- coding: utf-8 -*-
“””
Google PhotosAuto Date Changer

This code includes auto-clickers and auto-keyboard events.
“””

import win32api, win32con, time, sys
from tkinter import Tk

def click(x,y):
win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

VK_CODE = {‘backspace’:0x08,
‘tab’:0x09,
‘clear’:0x0C,
‘enter’:0x0D,
‘shift’:0x10,
‘ctrl’:0x11,
‘alt’:0x12,
‘pause’:0x13,
‘caps_lock’:0x14,
‘esc’:0x1B,
‘spacebar’:0x20,
‘page_up’:0x21,
‘page_down’:0x22,
‘end’:0x23,
‘home’:0x24,
‘left_arrow’:0x25,
‘up_arrow’:0x26,
‘right_arrow’:0x27,
‘down_arrow’:0x28,
‘select’:0x29,
‘print’:0x2A,
‘execute’:0x2B,
‘print_screen’:0x2C,
‘ins’:0x2D,
‘del’:0x2E,
‘help’:0x2F,
‘0’:0x30,
‘1’:0x31,
‘2’:0x32,
‘3’:0x33,
‘4’:0x34,
‘5’:0x35,
‘6’:0x36,
‘7’:0x37,
‘8’:0x38,
‘9’:0x39,
‘a’:0x41,
‘b’:0x42,
‘c’:0x43,
‘d’:0x44,
‘e’:0x45,
‘f’:0x46,
‘g’:0x47,
‘h’:0x48,
‘i’:0x49,
‘j’:0x4A,
‘k’:0x4B,
‘l’:0x4C,
‘m’:0x4D,
‘n’:0x4E,
‘o’:0x4F,
‘p’:0x50,
‘q’:0x51,
‘r’:0x52,
‘s’:0x53,
‘t’:0x54,
‘u’:0x55,
‘v’:0x56,
‘w’:0x57,
‘x’:0x58,
‘y’:0x59,
‘z’:0x5A,
‘numpad_0’:0x60,
‘numpad_1’:0x61,
‘numpad_2’:0x62,
‘numpad_3’:0x63,
‘numpad_4’:0x64,
‘numpad_5’:0x65,
‘numpad_6’:0x66,
‘numpad_7’:0x67,
‘numpad_8’:0x68,
‘numpad_9’:0x69,
‘multiply_key’:0x6A,
‘add_key’:0x6B,
‘separator_key’:0x6C,
‘subtract_key’:0x6D,
‘decimal_key’:0x6E,
‘divide_key’:0x6F,
‘F1’:0x70,
‘F2’:0x71,
‘F3’:0x72,
‘F4’:0x73,
‘F5’:0x74,
‘F6’:0x75,
‘F7’:0x76,
‘F8’:0x77,
‘F9’:0x78,
‘F10’:0x79,
‘F11’:0x7A,
‘F12’:0x7B,
‘F13’:0x7C,
‘F14’:0x7D,
‘F15’:0x7E,
‘F16’:0x7F,
‘F17’:0x80,
‘F18’:0x81,
‘F19’:0x82,
‘F20’:0x83,
‘F21’:0x84,
‘F22’:0x85,
‘F23’:0x86,
‘F24’:0x87,
‘num_lock’:0x90,
‘scroll_lock’:0x91,
‘left_shift’:0xA0,
‘right_shift ‘:0xA1,
‘left_control’:0xA2,
‘right_control’:0xA3,
‘left_menu’:0xA4,
‘right_menu’:0xA5,
‘browser_back’:0xA6,
‘browser_forward’:0xA7,
‘browser_refresh’:0xA8,
‘browser_stop’:0xA9,
‘browser_search’:0xAA,
‘browser_favorites’:0xAB,
‘browser_start_and_home’:0xAC,
‘volume_mute’:0xAD,
‘volume_Down’:0xAE,
‘volume_up’:0xAF,
‘next_track’:0xB0,
‘previous_track’:0xB1,
‘stop_media’:0xB2,
‘play/pause_media’:0xB3,
‘start_mail’:0xB4,
‘select_media’:0xB5,
‘start_application_1’:0xB6,
‘start_application_2’:0xB7,
‘attn_key’:0xF6,
‘crsel_key’:0xF7,
‘exsel_key’:0xF8,
‘play_key’:0xFA,
‘zoom_key’:0xFB,
‘clear_key’:0xFE,
‘+’:0xBB,
‘,’:0xBC,
‘-‘:0xBD,
‘.’:0xBE,
‘/’:0xBF,
‘`’:0xC0,
‘;’:0xBA,
‘[‘:0xDB,
‘\\’:0xDC,
‘]’:0xDD,
“‘”:0xDE,
‘`’:0xC0}

def press(*args):
”’
one press, one release.
accepts as many arguments as you want. e.g. press(‘left_arrow’, ‘a’,’b’).
”’
for i in args:
win32api.keybd_event(VK_CODE[i], 0,0,0)
time.sleep(.5)
win32api.keybd_event(VK_CODE[i],0 ,win32con.KEYEVENTF_KEYUP ,0)

def pressHoldRelease(*args):
”’
press and hold passed in strings. Once held, release
accepts as many arguments as you want.
e.g. pressAndHold(‘left_arrow’, ‘a’,’b’).

this is useful for issuing shortcut command or shift commands.
e.g. pressHoldRelease(‘ctrl’, ‘alt’, ‘del’), pressHoldRelease(‘shift’,’a’)
”’
for i in args:
win32api.keybd_event(VK_CODE[i], 0,0,0)
time.sleep(.05)

for i in args:
win32api.keybd_event(VK_CODE[i],0 ,win32con.KEYEVENTF_KEYUP ,0)
time.sleep(.1)

def release(*args):
”’
release depressed keys
accepts as many arguments as you want.
e.g. release(‘left_arrow’, ‘a’,’b’).
”’
for i in args:
win32api.keybd_event(VK_CODE[i],0 ,win32con.KEYEVENTF_KEYUP ,0)

#Real code starts here:

click(1872,42) #open number of tabs Chrome app
time.sleep(.5)
click(1760,94) #first click on number
click(1760,94) #second click on number
pressHoldRelease(‘ctrl’,’c’)
time.sleep(.5)
click(1864,953) #click away to close the add-in
time.sleep(.1)

repeat=int(Tk().clipboard_get())-1 #how many tabs are open
counter=1
while counter<=repeat:
click(1879,295)
time.sleep(1)
press(‘2′,’0′,’1′,’2′,’0′,’7′,’enter’)
time.sleep(1)
pressHoldRelease(‘ctrl’,’w’)
time.sleep(2)
# pressHoldRelease(‘alt’,’tab’)
# time.sleep(.5)
counter=counter+1
# press(‘F5’)
else:
sys.exit(‘Loop ended’)

 

Anlmdm Bbcm

Kodun ilk kısmı, her zaman olduğu gibi import kısmı.

İlk def kısmı, “Tıklamak” ne demek, Python’a onu öğretmek için. VK_CODE dediği, virtual keyboard (sanal klavye) tuşları. Normalde “space” ya da “enter”ın bilgisayar için hiçbir anlamı yok; ancak bu tuşlara karşılık gelen HEX kodları bilgisayarın anlayabileceği dil. VK_CODE altında tanımladıklarım, her bir tuşun HEX kodu. Böylece “space” yazdığınızda bilgisayar ne demek istediğinizi anlayacak. Sonraki def kısımları hep klavye işleri için. “Tuşlara basmak”, “Tuşa basılı tutmak”, “Tuşu bırakmak” ne demek, Python’a onları öğretiyoruz.

Şimdi, “Real Code Starts Here” dediğim noktadan sonra, bazı şeyleri comment out yaptım (#, yorum yapmak demek; bilgisayar o satırları okumuyor kodu çalıştırırken). Bu kısımları istediğiniz gibi değiştirmeniz gerekiyor. Benim uygulamamda ve monitörümde, (x,y) koordinatlarıyla tanımlanan yerlere sırayla gitmesi gerektiğini söylüyorum. Ama sizin uygulamanızda ve monitörünüzde bu noktalar farklı olacaktır.

O “Real Code” kısmından sonra bazı trickler yapmanız gerekebilir. Mesela ben her bir fotoğrafı tab tab açtığım için, tab sayısını bilmem gerekiyordu. O nedenle Chrome’a “Tab Count” diye bir eklenti kurdum ve ona tıklayarak sayıyı aldım. Size o kısımlar gerekmeyecektir.

 

Önemli Bir Nokta

time.delay olayı çok önemli, iki iş arasında ne kadar beklediğini söylüyor saniye cinsinden bilgisayara. Eğer ki bunları yeterince miktarda ve uzunlukta kullanmazsanız, bilgisayarınız aşırı hızlı tıklamalar yapacaktır ve muhtemelen işi düzgün yapamayacaktır. İnsani sınırlara çekmenizi; ancak sizin yapabileceğinizden çok daha hızlı tıklayacak noktada bırakmanızı tavsiye ederim. Ortalama üstü hızda bir bilgisayar için 0.3 saniye yeterli bir bekleme süresi. Ama ağır bir işle uğraştırıyorsanız bilgisayarı (ya da benim gibi arkaplanda hayvani bir evrimsel algoritma çalıştırıyorsanız) bu sayıları arttırmanız gerekebilir.

 

Peki Bilgisayarın Nereye Tıklaması Gerektiğini Nasıl Öğreneceğim?

Çok basit. Mouse’unuzu, tıklamak istediğiniz yere getirin ve orada bırakın. Sonra Python’un konsoluna win32gui.GetCursorPos() yazıp enter’a basın. Mouse neredeyse, koordinatlarını söyleyecektir. O sayılarla kodunuzu güncelleyebilirsiniz.

 

Tekrardan Uyarı: Bu kod, benim Google Photos işim içindi. Sizin tıklamanız gereken yerler başka olacaktır. O nedenle, “Real Code Starts Here” dediği noktadan itibaren adım adım nelere basmak istediğinizi belirleyip, ona göre kodu düzenlemeniz gerekiyor. Şu haliyle kod, sizin bilgisayarınızda anlamsız işler yapacaktır. Monitörün farklı olması bile farklı sonuçlar verecektir (koordinatlar başka olduğu için).

 

Bundan Daha İyisi Yapılır!

Elbette. Yapıp paylaşırsanız, memnuniyetle incelerim. Benim Python’u ilk defa kullanırken yaptığım minik bir proje bu. İlk kodum bu Python’da yazdığım. 🙂 Dolayısıyla herhangi bir iddiam yok.

 

Sorum Var!

Acımayın, sorun. Ne biliyorsam anlatmaya çalışırım. 🙂

 

Kolay gelsin!

Advertisements