키보드 매크로 코딩 - kibodeu maekeulo koding

개요

파이썬을 이용하여 간단한 매크로 프로그램을 제작해보는 시간을 가져보려고 합니다

주의 : 매크로 만들다가 일어나는 법적 책임은 본인이 쥐어야 합니다. (악용하시는 분들은 없기를...)

알아야 할 것 (라이브러리)

pyautogui (매크로에서 핵심요소, 여기서는 일부만 적지만 다양한 매크로 구현을 하기 위해
라이브러리 읽는 것을 권장한다.)
https://pyautogui.readthedocs.io/en/latest/#
position() 현재 마우스위치를 추출한다 
move(100,200) (100,200) 위치로 이동
click() 마우스 클릭
click(button='right') 오른쪽 마우스 클릭
click(x=100, y=200) (100,200) 위치에 마우스 클릭
click(interval=1) 시간 간격을 두고 클릭 ( 밑에 딜레이 요소를 하나 더두기는 하지만 편한거를 사용하기위해 일단 올린다)
doubleClick() 마우스 더블클릭
dragTo(x=100, y=200) 현재위치에서 (100,200)으로 드래그
press('f5') f5를 누른다 (그외 'a'등의 알파벳 'space' 등 다양한 키가있다)
typewrite('macro', interval=0.1) macro라고 자판을 쳐줌 (interval은 안넣어도 되지만 혹시 모를 문제를 대비하여 넣어준다)
hotkey('ctrl','c') Ctrl + C (복사 기능) , Ctrl + V (붙여넣기 기능)
time (시간을 다루는 모듈)
sleep(숫자) 숫자 1당 1초 만큼 쉰다
(0<x) 의 모든 실수는 다 적용가능하다
여기서 sleep을 배우는 이유는 delay타임을 부여해 시스템의 안정성을 높이기 위해 사용한다.

추가로 필요하면 keyboard, mouse 기능도 추가하면 다양한 기능을 사용할 수 있습니다.

파이썬의 각각 모듈은 아래와 같은 방식으로의 설치가 필요합니다 (cmd)

방법

1. 마우스 매크로 (x축, y축)

# 마우스 x,y 축을 알아내는 방법

import pyautogui
import keyboard
import time

while 1:
    position = pyautogui.position()
    if keyboard.is_pressed('enter'):
        print(position)
        time.sleep(0.2)

# 해당 소스코드는 왼쪽클릭을 하는경우 좌표가 출력되는 방식이다
# pyautogui의 단점은 입력에 관한 함수가 없기 때문에 enter키를 누르면 나오게 설정하였다

여기서 pyautogui의 단점이 나온다. keyboard, mouse 모듈은 입력과 출력이 가능하지만 해당 모듈은 출력만 가능한 모듈이다. 하지만 일반적인 매크로의 상황은 입력의 상황이 필요하지 않으니 상관없다. 

#마우스 매크로를 제작하여보자

import pyautogui
import time

while 1:
    pyautogui.click(x=600,y=400)
    time.sleep(0.1)
    pyautogui.doubleClick(x=650,y=450)
    time.sleep(0.1)

#(600,400)을 클릭 (650,450)을 더블클릭하여 무한실행하는 프로그램
#실제로 이렇게 빨리 실행을 한다면 나가게 해주는 장치도 필요

더블클릭하여 해당 프로그램을 실행시킨다. 만약에 딜레이 타임이 짧을 경우 실제 프로그램 종료 등에 고통을 받을 수 있으니 나갈 수 있는 방법을 구현하는 것이 필요하다.

2. 키보드 매크로

#1분마다 f5버튼 누르기

import pyautogui
import time

while 1: #무한실행
    pyautogui.press('f5')
    print('Do it') #됫는지 체크하기 위하여 넣었다
    time.sleep(60) #60초 = 1분

일정 시간마다 f5를 누르는 매크로 프로그램

3. 응용

#정지기능 추가
import pyautogui
import keyboard
import time

while 1:
    pyautogui.press('f5', interval=3)
    print('Do it')
    
    pyautogui.click(x=600,y=400, interval=0.1)
    pyautogui.click(x=700,y=300, interval=0.1)
    pyautogui.click(x=800,y=500, interval=0.1)

    if keyboard.is_pressed('f12'):
        break
    # 루프문 탈출
    # f5후 해당위치 3곳을 클릭한다.

time.sleep함수를 사용하지 않고 예제 프로그램을 구성하였다. interval 하고 time.sleep은 자신이 편하다고 생각하는 대로 사용하면 된다. (ㅇㅇ);;

마치며

일반적인 모바일 게임이나 간단한 게임 등에서는 매크로 프로그램에서는 매크로를 이용하여 손에 쥐지 않고 할 수 있습니다. 하지만 대다수의 온라인 게임 등에서는 이러한 방법의 매크로 만으로는 부족합니다. 해당 게임에 자체적으로 소프트키 방지를 이용하는 경우가 많습니다. 일반적으로 아두이노 등을 이용하여 물리적인 버튼을 사용하면 가능하다고 이야기는 들었는데 아직 해본 적이 없어서 추후에 해보겠습니다.

게임을 하다가 너무 단순작업을 하는거같아. 자동으로해주는 매크로를 python으로 만들어보았다.

막 만든거라 코드가 좋지않다.

import pyautogui as m
import pyautogui
from random import *
import time 
import sys

Choice_arr = [] //매크로 1,2,3 선택을 저장할 리스트
Mouse_L_X = [] //매크로 마우스의 x좌표를 저장할 리스트
Mouse_L_Y = [] //매크로 마우스의 x좌표를 저장할 리스트
Mouse_R_X = [] //매크로 마우스의 x좌표를 저장할 리스트
Mouse_R_Y = [] //매크로 마우스의 x좌표를 저장할 리스트
Mouse_time = []//키보드 매크로 동작시간 & 클릭횟수
Keyboard_in_list = [] // 키보드 입력 저장 할 리스트
Keyboard_time = [] //키보드 매크로 동작시간 & 동작횟수


def main():
    while True:
        Choice = input("1.마우스 이동/클릭   2.키보드입력    3.시작 : ")
        print(Choice)
        Choice_arr.append(Choice)#입력한 동작을 저장
        if Choice == '1':
            Mouse_in()
        elif Choice == '2' :
            Keyboard_in()
        else :
            print("start!!")
            start()
            break
            

if __name__ == '__main__' :
    main()

마우스 동작 , 키보드 동작을 선택하여 입력받고

시작을하면 여태까지 받은 정보를 가지고 동작을한다.

def Mouse_in():

    time_cnt = 2
    while time_cnt:
        print(str(time_cnt)+ '초 후에 원하는구역의 왼쪽 상단 좌표를 저장합니다.')
        time_cnt -= 1
        time.sleep(1)

    x,y =m.position()
    print('왼쪽 상단 좌표  x : {} , y : {}'. format(x,y))
    Mouse_L_X.append(int(x))
    Mouse_L_Y.append(int(y))


    time_cnt = 2
    while time_cnt:
        print(str(time_cnt)+ '초 후에 원하는구역의 오른쪽 하단 좌표를 저장합니다.')
        time_cnt -= 1
        time.sleep(1)

    x,y =m.position()
    print('오른쪽 하단  좌표  x : {} , y : {}'. format(x,y))
    Mouse_R_X.append(int(x))
    Mouse_R_Y.append(int(y))


    tmp = int(input('마우스 이동 동작 시간 입력  : '))
    Mouse_time.append(tmp)

마우스 를 선택하여 설정하는 부분이다.

원하는 좌표를 받아오는데

버튼을 누른다 생각하고 네모 모양 의 영역을 받아올것이다.

2초의 시간을 주고 원하는곳의 왼쪽상단 에다가 두고

다시 2 초 시간을 주고 원하는곳의 오른쪽 하단 에다가 두면 좌표가 저장이된다.

이렇게 받은 모든 정보는 전부 리스트에 저장해둔다.

def Keyboard_in():
    tmp = input('1 엔터    2스페이스바  : ')
    Keyboard_in_list.append(tmp)
    tmp = input('키보드 입력 동작 시간 입력  : ')
    Keyboard_time.append(tmp)

키보드 를 선택하여 설정하는 부분이다.

원하는 키를 입력하는데 내가 필요한것은 엔터와 스페이스 뿐이라 위와같이 작성하였다.

이 정보도 리스트로 저장해둔다.

이제 원하는 정보를 모두 입력했다면 시작을 하면된다.

def start():
    while True:
        M_time_cnt = -1
        K_time_cnt = -1

        for i in Choice_arr:
            if i == '1' :
                M_time_cnt += 1
                Mouse_out(M_time_cnt)

            elif i =='2' :
                K_time_cnt +=1
                Keyboard_out(K_time_cnt)

            else:
                print("다시 시작.")

입력받은 정보를 게속해서 반복할것이기 때문에 무한루프를 한다.

여태까지 입력받은 정보가 마우스인지 키보드인지 저장해둔 리스트를 가지고와서 그에 맞는 함수로 빠져나간다.

def Mouse_out(M_time_cnt):

    i = Mouse_time[M_time_cnt]

    time_cnt =0
    while time_cnt < i :

        ran_x = randint(Mouse_L_X[M_time_cnt] , Mouse_R_X[M_time_cnt])
        ran_y = randint(Mouse_L_Y[M_time_cnt] , Mouse_R_Y[M_time_cnt])
        m.moveTo(ran_x,ran_y,1)
        m.doubleClick()
        
        time_cnt+=1
        time.sleep(1)

    
    return 0

마우스 일 경우 저장해둔 좌표사이의 랜덤값을 가지고와서 마우스를 이동한후 더블클릭을한다.

1초에 한번씩 동작한다.

def Keyboard_out(K_time_cnt):
    i = Mouse_time[K_time_cnt]
    time_cnt =0
    if Keyboard_in_list[K_time_cnt] == '1':
        while time_cnt < i:
            pyautogui.press('enter')
            time_cnt+=1
            time.sleep(1)

    if Keyboard_in_list[K_time_cnt] == '2':
        while time_cnt < i:
            pyautogui.press('space')
            time_cnt+=1
            time.sleep(1)
    
    return 0

키보드 일 경우 그에 맞는 키를 입력해준다.

1초에 한번씩 동작한다.

이 작업을 게속 반복한다.

키보드 매크로 코딩 - kibodeu maekeulo koding

마우스가 움짤에서는 보이지않지만 원래는 마우스가 움직인다.