본문 바로가기
자동화

이미지를 인식하는 봇 만들기(오토핫키)

by 도천수 2024. 1. 29.

저는 어릴 때 부터 매크로에 관심이 참 많았습니다. 마침 제가 즐겨하던 게임이 매크로가 필수였기 때문에 일찌감치 매크로를 접하고, 사용법을 익혔어요.

게임 속에서 캐릭터에게 명령을 내릴 작은 루틴을 만들고, 고치는 과정이 마치 지금의 스크래치 처럼 어린 저에게 자연스럽게 알고리즘에 대한 개념을 익히게 해준 것 같아요.

어쨌든 저는, 매크로를 사용하는 것을 넘어 만들고 싶어졌습니다. 매크로를 만드는 방법을 찾아보니 그 당시 제가 사용했던 매크로는 대부분 “오토핫키” 라는 스크립트 언어로 만들어졌어요. 저도 그렇게 오토핫키를 배워보게 되었습니다.

이번엔 오토핫키로 이미지를 인식하는 봇 만드는 과정을 짧게 담아보았습니다.

ImageSearch

오토핫키는 미리 따 놓은 이미지를 화면 내에서 찾아주는 ImageSearch 라는 명령어를 제공합니다. 기본적인 문법은 아래와 같습니다.

Copy
ImageSearch, X, Y, x1, y1, x2, y2, *30 file
	if ErrorLevel = 0 {
		#이미지 서치 성공
	}
	if ErrorLevel = 1 {
		#이미지 서치 실패
	}
 if ErrorLevel = 2 {
		#오류가 발생하여 이미지 서치 수행 불가
	}
 
 > X : 이미지를 찾았을 때 영역의 X좌표가 담기는 변수
 > Y : 이미지를 찾았을 때 영역의 Y좌표가 담기는 변수
 > x1 : 이미지 서치를 시작하는 x좌표
 > y1 : 이미지 서치를 시작하는 y좌표
 > x2 : 이미지 서치를 끝내는 x좌표
 > y2 : 이미지 서치를 끝내는 y좌표
 > *30 file : 오차범위와 이미지 파일 경로
(오차범위는 0~255이며 작을 수록 정확한 이미지를 찾음.)
 > ErrorLevel = 0 : 이미지 서치에 성공했을 때의 동작
 > ErrorLevel = 1 : 이미지 서치에 실패했을 때의 동작
 > ErrorLevel = 2 : 오류가 발생하여 이미지 서치를 수행하지 못했을 때의 동작

위 사진을 참고하면 각 파라미터의 용도를 조금 더 이해하기 쉽습니다.

필요한 이미지 구하기

저는 인스타그램에서 클릭되지 않은 좋아요 아이콘을 찾아주는 봇을 만들어 보려고 합니다.

인스타그램의 클릭되지 않은 좋아요와 댓글 아이콘 이미지를 캡처해 Like.png라는 파일명으로 저장해 두었습니다.

Copy
#F1키를 눌러 스크립트 시작
F1::

#화면의 0, 0 좌표부터 2560, 1080 좌표까지 Like.png 파일과 같은 이미지를 찾아라
ImageSearch X, Y, 0, 0, 2560, 1080, *30 Like.png

	#이미지를 찾았다면 이미지의 위치를 출력해라
	if ErrorLevel = 0
		MsgBox, Empty heart image location : %X%, %Y%

	#이미지를 찾지 못했다면 메시지를 출력해라
	if ErrorLevel = 1
		MsgBox, There is no empty heart image.

그리고 간단히 아래와 같은 스크립트를 작성했습니다.

실행 결과

이미지 서치 성공과 실패 케이스에서 모두 기대했던 대로 동작하는 것을 볼 수 있었습니다. 지금은 단순히 MsgBox만 띄우고 있지만 이미지 서치 결과에서 다양한 동작으로 이어나갈 수 있습니다.

클릭, 우클릭, 마우스 스크롤, 키입력, 또다른 이미지 서치 등등… 또는 이미지 서치 결과의 좌표를 새로운 변수에 넣어 활용할 수도 있겠죠.

활용 사례

활용 사례를 소개하기 전에 먼저 말씀드리자면, 사실 이미지 서치를 이용한 자동화 또는 봇, 매크로 방식은 장단점이 굉장히 명확합니다.

장점으로는 UI단에서 활용할 수 있는 짧고 간단한 스크립트를 빠르고 간단하게 작성하여 활용해 볼 수 있다는 점이 있습니다.

단점으로는 좌표와 이미지 기반이기 때문에 스크립트를 사용하는 사람의 모니터 해상도, 브라우저의 크기 등이 달라지는 경우 스크립트의 수정이 필요합니다. 또한 이미지 서치 자체도 불안정한 기술이며, 화면 내 동일한 이미지가 여러 개 노출되는 경우 기대하지 않는 동작을 할 확률이 높습니다. 또한 최근에는 하나의 웹 페이지에서 한 가지 정보만 보여주지 않고 최대한 다양한 정보를 보여주려 하는데, 이미지 서치 만으로 이것을 커버하기 위해서는 배보다 배꼽이 커지는 상황이 올 수 있습니다.

그럼에도 제가 실무에서 활용하는 사례는 있습니다. 위에서 말씀드린 대로 간단하게 UI를 확인하고 버튼의 동작을 체크하는 경우 UI나 버튼의 이미지를 따 두어 클릭하는 동작을 하도록 합니다. 이 동작을 Loop를 사용해 여러번 반복하고 성공과 실패 횟수를 카운트 하여 결과를 취합하고 있습니다.

또 한가지는 반복적인 입력이 필요한 부분에서 특정 키 입력 시 Send를 이용하여 미리 입력해둔 상용구를 입력할 수 있도록 하는 입력 매크로로 활용하고 있어 귀찮은 반복 업무를 가능한 최소화 하는데에 쏠쏠한 도움을 주는 스크립트 입니다.

Copy
F1::
Send, 반복적인 입력을 매크로로 대체하였습니다.
return

위와 같은 스크립트로 F1을 입력 시 “반복적인 입력을 매크로로 대체하였습니다.” 라는 문구가 입력할 수 있는 것이죠.

마무리

아직은 어떻게 더 활용할 수 있을지 활용처를 고민해 보고 있지만 제가 사용할 수 있는 python이나 Excel, GoogleSheet의 기능들과 병합하여 사용하면 더 많은 활용사례를 찾을 수 있을겁니다.

비록 간단한 매크로를 만드는 데에 특화된 스크립트 이지만 닭 잡는 데에는 닭 잡는 칼을 쓰고, 소 잡는 데에는 소 잡는 칼을 쓸 수 있도록 여러가지 칼을 준비해 두는 것도 나쁘지 않다고 생각합니다. 응급 상황에서 급히 자동화, 매크로 스크립트를 만들어 낼 수 있는 데에는 아직까지 오토핫키 만한 것을 찾지 못했으니까요.

저에게는 장난감처럼 재미있는 스크립트인 오토핫키에 관심이 생기신 분이 계신다면 너무 뿌듯할 것 같네요.

감사합니다.