[업무자동화] R로 마우스를 조작하려면 rMouse

R rmouse automation mouse

java 의존성이 없는 KeyboardSimulator패키지가 소개되었습니다. Windows 에서만 동작합니다.

true
2018-10-08

업데이트

한줄요약

  1. R 스크립트로 키보드/마우스를 다루는 rMouse 패키지를 사용할 수 있다.

메일을 보내는 포스트를 작성하고 아니 업무자동화 키워드에 해당하는 패키지에 관심이 생겼습니다. 많은 업무가 웹에서 이루어진다면, 웹 api로 제공해주거나 브라우저 자동화 등을 사용할 텐데요. 어쩔 수 없이 브라우저 밖의 프로그램 들을 자동화할 일들이 있습니다. 이때 사용하는 것이 키보드/마우스 메크로 입니다.

R 스크립트로 동작하는 것이 없는지 찾아봤는데요. 놀랍게도 있었습니다! 바로 rMouse 패키지입니다. 무려 작년 중순께 나온 싱싱한(?) 패키지입니다. 놀라운건 코드 공개를 안하셔서 문의를 메일로 해야 하네요 ㅎㅎ

설치

자바 의존성이 있는 패키지라 자바와 rJava 패키지가 필요합니다. 지난 포스트에 설명이 잘 나와있어서 이제 자바 의존성 패키지가 두렵지 않습니다!

install.packages("rMouse")
library(rMouse)
setAutoDelay()

처음에 패키지가 실행되는 시간이 필요해서 setAutoDelay() 함수를 제공해준다고 합니다. library(rMouse) 다음에 연속으로 붙여 놓으면 좋겠네요!

기능 설명

rMouse 패키지는 크게 3가지 기능과 한 가지 중요한 옵션을 제공합니다.

  1. 딜레이
  2. 마우스 입력
  3. 키보드 입력
  4. 긴급 중단 옵션

딜레이 먼저 볼까요?

딜레이

Sys.sleep() 함수와 같은 기능을 제공하는 delay() 함수가 있습니다. 이건 설명이 별로 필요없겠네요.

delay(1000) 

긴급 중단 옵션

이제 다른 것들을 설명하기 전에 긴급 중단 옵션을 먼저 볼까 합니다. rMouse 패키지에서 제공하는 거의 모든 함수는 failSafe 파라미터를 가지고 있습니다. 기본 값은 T인데요. 마우스를 화면 왼쪽 위 끝(x = 0, y = 0)으로 옮기면 스크립드를 중단하겠다는 뜻입니다. 키보드/마우스 자동화 단계에서 얼마나 긴급 중단이 중요한지는 아마 사용해보셨다면 잘 아실겁니다. 자기 마음대로 움직이는데, 중간에 뭘 할 수 없으면 엄청 답답하거든요.ㅎㅎ

키보드 입력

키보드 입력은 총 2가지 함수를 제공합니다. type() 함수와 specialKey() 함수입니다. 직접 키를 입력하는 함수와 기능 키를 입력하는 함수군요 키 입력 함수는 자바와 R의 키값이 달라서 많은 특수 문자들(+한글)이 동작하지 않는다고 합니다. 엉엉

type("This is a sentence.")  # 대부분의 특수 문자를 제외한 글자들로 영어만 가능
type("!")                    # 에러가 발생함
specialKey("ESC")            # ESC 키 사용
specialKey("ENTER")          # ENTER 키 사용

마우스 입력

마우스 입력은 어떤 좌표로 움직이고, 오른쪽/왼쪽 클릭을 수행하는 함수를 제공합니다.

move(0,0)       # 모니터 가장 왼쪽 위(0,0)로 이동
move(50,30)     # 좌표 x = 50, y = 30 로 이동
left()          # 왼쪽 클릭
right()         # 오른쪽 클릭

마우스의 위치를 잡아주는 coord() 함수와 pos() 함수도 제공합니다. coord() 함수는 list 자료형으로 x, y 위치를 제공하구요. pos() 함수는 x, y 위치를 콘솔에 출력해줍니다. pos() 함수가 coord() 함수로 만든 cat()(출력 함수) 함수인 것으로 보아 편한 방식으로 사용하시면 좋을 것 같습니다.

coord()       # 리스트 자료형으로 결과 제공
pos()         # 콘솔에 출력
#> move(x,y)

안타깝게도 rMouse 패키지가 사용하는 자바 패키지에는 마우스 클릭 동작을 기록하는 기능을 제공하지 않는답니다. 보통 마우스 메크로에서 recode라고 하면 클릭 할 때 딜레이와 위치, 어느 쪽 클릭인지를 기록해주는데요. 대신 비슷하게 동작을 흉내내는 recode() 함수를 제공한다고 합니다.

# 3초 간격으로 3번 기록
record(n = 3, timeInterval = 3) 
#> delay(2000); move(412,668); left()
#> delay(2000); move(155,636); left() 
#> delay(2000); move(387,697); left()

옵션에 ntimeInterval 이 있는데요. n은 기록하는 갯수라는 뜻입니다. 이게 아마도 클릭하는 횟수를 흉내내려는 것 같네요. timeInterval 은 클릭을 잡지 못하니 위치를 캐치하기 위해서 어느 시간 마다 동작함같은 방식을 사용한 것 같습니다. 아래 이미지를 보시면 조금 감이 오실 것 같습니다.

사용평

간단한 자동화를 위해서는 제공하는 기능도 단순하고 이해하기 쉬워서 좋을 것 같습니다. 하지만 드래그를 지원하지 않는다던가, 제대로된 기록 기능을 제공하지 않는 점이 아쉬운 것 같습니다.

매크로 프로그램들

윈도우로만 한정하면 GUI까지 잘 제공하는 무료 프로그램이 몇 개 있습니다.

G Macro

G Macro은 2버전이 2003년에 나오고 지금도 관리자 권한으로 실행하면 win10에서 잘 동작한다고 합니다. 나무위키에 자세하게 설명이 잘 나와있네요.

키보드/마우스 매크로

키보드/마우스 매크로라는 이름으로 v1, v2, 비활성화 윈도우 버전 총 3개를 제공합니다. v1은 단순 버전, v2는 고급 버전이라고 하네요.

이것도 12년 정도에 제작하시고 이후에 업데이트가 없긴 하군요. 그래도 무리없이 작동하는 것 같습니다.

기타

오토 마우스류라고 불리는 프로그램들이 게임 쪽에서 많이 사용되었습니다. 대표적으로는 졸라빨라 같은 프로그램이 있는데요. 이것도 개발이 중간에 중지된 모양입니다. 그리고 게임 광클에 맞게 개발된 프로그램이라 업무자동화에는 조금 맞지 않습니다.

맥용은 없는가?

맥은 검색해보면 몇 가지 나오기는하는데, 제가 시도해보지를 못하고 있네요. 맥은 AppleScriptAutomator를 자체적으로 지원합니다. 뭔가 다른 세상 이야기 같네요. 혹시 잘 정리된 글이 있으면 추가, 공유하도록 하겠습니다. 사실 한국에서 화면 자동화 니즈는 윈도우 전용 클라이언트들(은행의 기업용 프로그램이라던가..)이기 때문에 필요성을 못 느끼겠네요.

언제나처럼, 오타 질문 등등 대환영입니다.

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-NC-ND 4.0. Source code is available at https://github.com/mrchypark/mrchypark.github.io, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Park (2018, Oct. 8). mrchypark: [업무자동화] R로 마우스를 조작하려면 rMouse. Retrieved from https://mrchypark.github.io/post/업무자동화-r로-마우스를-조작하려면-rmouse/

BibTeX citation

@misc{park2018[업무자동화],
  author = {Park, Chanyub},
  title = {mrchypark: [업무자동화] R로 마우스를 조작하려면 rMouse},
  url = {https://mrchypark.github.io/post/업무자동화-r로-마우스를-조작하려면-rmouse/},
  year = {2018}
}