본문 바로가기

메봇 강좌

5.2.메신저봇r의 Api예제

안녕하세요. 오랜만이군요.

 

지난 강좌에서 메신저봇 r의 Api들의 종류에 대해 알아보았습니다.

이번 강좌에서는 입문자에게 자주 쓰이는 Api들의 예제를 보여드리도록 하겠습니다.

 

이번 강좌에서 풀이할 Api들은 아래와 같습니다.

 

이름 설명
Api.reload("스크립트이름.js")
또는
Api.compile("스크립트이름.js")

해당 스크립트를 컴파일합니다.

참고로 소괄호 안을 비워놓을 시 모든 스크립트들을 컴파일합니다.

Api.unload("스크립트이름.js") 해당 스크립트를 컴파일되지 않은 상태로 만듭니다.
Api.off("스크립트이름.js") 해당 스크립트의 전원을 끕니다. 소괄호 안을 비울 시 모든 스크립트의 전원을 끕니다.
Api.on("스크립트이름.js") 해당 스크립트의 전원을 켭니다. 소괄호 안을 비울 시 모든 스크립트의 전원을 켭니다.
Api.isOn("스크립트이름.js")

해당 스크립트의 전원이 켜져 있는지 확인하여 반환합니다.

켜져 있다면 true 를, 꺼져 있다면 false를 반환합니다.

Api.isCompiled("스크립트이름.js")

해당 스크립트의 컴파일 상태를 확인하여 반환합니다.

켜져있다면 true를, 꺼져있다면 false를 반환합니다.

Api.getScriptNames() 모든 스크립트들의 이름을 반환합니다.
Api.replyRoom("방이름","내용")

해당 방에 내용을 전송합니다.

사실 그냥 replier.reply("방이름","내용")

을 쓰는 걸 추천합니다.

(안정성 문제)

Api.canReply("방이름") 해당 방에 메시지를 보낼 수 있는지 확인하여 가능하다면 true 를, 불가능하다면 false를 반환합니다.
Api.showToast("제목","내용") 화면에 토스트 메시지를 띄웁니다.
Api.makeNoti("제목","내용","id값")

알림 창에 알림을 띄웁니다.

id값을 안 쓰고 그냥

Api.makeNoti("제목", "내용")

만 해도 상관없지만, id값이 계속 달라지게 하면 새 알림이 이전의 알림을 대체하지 않고, 여러 개가 같이 나타납니다.

Api.papagoTranslate("번역할 언어코드","번역결과의 언어코드", "내용")

파파고 번역을 합니다. 모든 메신저봇 유저들의 총합 사용 횟수가 10000회로 제한되어 있기에 남발하는 것은 심한 민폐입니다.

언어코드에 관해서는

https://developers.naver.com/docs/papago/papago-nmt-api-reference.md

을 참고하시면 되겠습니다.

(스크립트 이름 뒤에. js를 붙일 필요는 없습니다.)

위 표는 입문자들이 자주 쓰는 Api들의 목록입니다.

 

 

 

우선 Api.reload()의 경우 봇의 모든 스크립트들을 컴파일합니다.

이는 봇을 리셋(?)하는 용도로 쓰이기도 하고, 에러가 났을 때 스크립트를 재 컴파일하는데 자주 사용됩니다.

const scriptName = "테스트.js";

function response(~~){

try{

//코드가 들어갈 자리

}catch(e){
Api.reload(scriptName);
}

}

소괄호 안에 있었어야 할 것들은 편의상 ~~으로 대체하였으나 실제 소스에서는 다 넣으셔야 합니다.

 

여기서

try {} catch(){}

이라는 처음 보는 것이 튀어나왔습니다.

 

이것은 try뒤에 나오는 중괄호 안의 코드를 실행하고, 그 코드에서 throw 된 값이 catch의 소괄호와 일치하다면 catch의 중괄호 안의 코드를 실행합니다. 일치하지 않거나 throw 된 값이 없다면 catch의 중괄호는 건너뜁니다.

 

이해하시기 힘들 겁니다. throw는 또 뭔지 궁금하실 테죠. 괜찮습니다. 지금 다룰 내용은 아니니 말이죠.

 

그냥

try{

}catch(e){

}

로 생각하고, try의 코드에서 에러(e)가 나면 catch의 코드를 실행하고, 에러가 안 나면 catch는 건너뛴다고 생각하시면 됩니다.

 

다시 본론으로 돌아가서, 처음의 예제에서는 try안의 코드에서 에러가 난다면 catch문을 실행하여 scriptName이라는 스크립트를, 즉 테스트.js를 재 컴파일합니다. 이는 나중에 자주 쓰이게 되니 알고 넘어가면 좋습니다.

 

물론 간단하게

if(msg=="/전체 컴파일") Api.reload();

처럼 쓰일 수도 있습니다.

 

 

 

다음으로 Api.unload()는 Api.reload()와 정 반대입니다. 바로 스크립트를 컴파일되지 않은 상태로 바꾸는 거죠.

자주 쓰이진 않지만 사용법은 Api.reload()와 비슷합니다.

 

 

 

Api.off()는 소괄호 안의 이름을 가진 스크립트의 전원을 꺼버립니다. 여기엔 자기 자신도 포함됩니다.

봇의 전원을 끄는 용도로 사용되지만, 다시 켤 수도 있어야 하기에 바로 뒤에 설명할 Api.on()이 있는 스크립트는 설정에서 Api.off() 무시하기 를 켜 놓아야 합니다.

예제는 다음과 같습니다.

if(msg=="/끄기") Api.off();

위는 모든 스크립트의 전원을 꺼버리는 것입니다.

 

아래는 특정 스크립트의 전원을 끄는 예제입니다.

if(msg.startsWith("/끄기 ")) Api.off(msg.replace("/끄기 ",""));

/끄기 스크립트 이름을 하면 스크립트 이름 을 끕니다.

 

예를 들어

/끄기 테스트.js

를 한다면 테스트.js가 꺼집니다.

 

참고로 .startsWith()는 앞의 문자열이 소괄호 안의 문자열로 시작하는지 검사하여 맞다면 true를, 아니라면 false를 반환합니다.

 

 

 

Api.on()은 소괄호 안의 이름을 가진 스크립트의 전원을 켭니다. 보통 봇의 전원을 켤 때 사용되죠.

off와 on은 봇의 전원 관리에 사용될 때는 다음과 같이 쓰일 수 있습니다.

if(msg.startsWith("/끄기 ")) Api.off(msg.replace("/끄기 ",""));
if(msg.startsWith("/켜기 ")) Api.on(msg.replace("/켜기 ",""));
if(msg=="/모두 끄기") Api.off();
if(msg=="/모두 켜기") Api.on();

(간단)

 

 

 

Api.isOn()은 소괄호 안의 스크립트가 켜져 있는지 검사하여 true나 false를 반환합니다.

이를 써서 봇이 켜져있는지 검사할 수 있습니다. 물론 다른 응용법들도 뒤에서 풀이하겠습니다.

 

 

 

Api.isCompiled()는 소괄호 안의 스크립트가 컴파일되어 있는지 검사하여 true나 false를 반환합니다.

매우 긴(수백 줄에서 수천 줄 이상) 스크립트들의 경우 컴파일하는데 많은 시간이 걸리는데,

이것을 이용하여 컴파일되지 않은 스크립트들만 선택적으로 컴파일하여 시간을 절약할 수 있습니다.

 

위를 하려면 한 Api를 더 사용해야 하기에 그것과 함께 다루겠습니다.

 

 

 

Api.getScriptNames()는 모든 스크립트들의 이름들을 , 로 이어 붙여서 반환합니다.

이때 이름에서 .js는 빠집니다.

당장에 어디다가 쓰는지 모르실 테니 응용법을 알려드리죠.

Api.getScriptNames().split(",").length

를 하면 스크립트가 총 몇 개인지 알 수 있습니다.

또, 이를 응용하면 앞에서 말했던 선택적인 컴파일도 가능하며,

켜져 있는 스크립트의 이름만 반환하게 할 수도 있습니다.

 

예제로 보여드리죠.

var scripts = Api.getScriptNames().split(","); //스크립트들을 배열로 하나씩 나눈다.
var scriptamount = scripts.length; //스크립트들의 개수

if(msg=="/전부 컴파일"){
	for(var i = 0 ; i < scriptamount ; i++){
		if(Api.isCompiled(scripts[i])==false) Api.reload(scripts[i]);
	}
    replier.reply("완료");
}

위 예제는 msg가 /전부 컴파일 일 시 for문으로 스크립트의 컴파일 여부를 확인하고 안 되어 있다면 컴파일 한 뒤 다음 스크립트를 검사하는 것을 반복하다가 모든 스크립트들을 검사했을 때 채팅방에 완료를 보내고 종료합니다.

 

저기서 scripts[i] 는 배열에 담긴 스크립트들의 이름에서 앞에서부터 하나씩 빼오는 용도입니다.

배열 객체의 응용이라고 보면 되겠습니다.

변수 i는 for문이 반복되면서 0, 1, 2, 3 이렇게 증가하므로

1번째 검사대상은 scripts[0], 2번째는 scripts[1] 이런 식입니다.

 

다음 예제는 켜져 있는 스크립트의 이름만 반환하는 겁니다.

var scripts = Api.getScriptNames().split(","); //스크립트들을 배열로 하나씩 나눈다.
var scriptamount = scripts.length; //스크립트들의 개수
var onscripts = [];

if(msg=="/켜져있는 스크립트 목록"){
	for(var i = 0 ; i < scriptamount ; i++){
		if(Api.isOn(scripts[i])) onscripts.push(scripts[i]);
	}
    replier.reply(onscripts.join("\n"));
}

위 예제는 msg가 /켜져있는 스크립트 목록 일 시 for문으로 스크립트가 켜져 있는지 확인하고 켜져 있다면 onscripts 배열에 추가합니다.

모든 스크립트들을 검사했다면 마지막에 엔터로 이어 붙여서 채팅방에 전송합니다.

 

예를 들어

a, b, c, d 이렇게 4개의 스크립트들이 있고, 그중 a, b 만 켜져 있다고 하면

채팅방에는

a

b

라는 메시지가 전송됩니다.

 

 

 

Api.replyRoom("", "") 은 사실 쓰는 것을 비추천합니다.

오류가 자주 나고, 아예 작동하지 않는 경우도 있기에 그냥 replier.reply() 쓰세요. 사용법도 replier.reply와 같습니다.

 

 

 

Api.canReply()는 소괄호 안의 이름을 가진 방이 존재하는지, 존재한다면 메시지를 보낼 수 있는지 확인합니다.

이것은 봇이 방에서 강퇴되는 등의 이유로 메시지를 보낼 수 없는 상황에서 에러가 나는 것을 막을 때 쓸 수 있습니다.

if(Api.canReply(room)){
//코드가 들어갈 자리
}

이렇게 해주면 해당 방에 메시지를 보낼 수 있을 때만 봇이 작동하기에 메시지를 보내는데 실패하여 에러가 나는 상황을 줄일 수 있습니다.

 

 

 

Api.showToast()의 주요 쓰임은 개발자 호출입니다.

메신저봇 r 앱에서 화면에 토스트 메시지를 띄웁니다.

호출이 많아지면 짜증이 납니다.

if(msg=="@내 이름") Api.showToast(room+"에서 "+sender+" 님의 호출","");

함정은 필자의 경우 제목만 뜨고 내용은 사라졌다는 것.

 

이것의 경우 다음으로 설명할 Api.makeNoti()와 함께 사용하면 완벽한 호출 어그로가 됩니다.

 

 

 

Api.makeNoti()는 개발자 호출이나 개발자가 알아야 할 정보들(예 : 오류 메시지)을 알림 창에 띄울 때 사용됩니다.

if(msg=="@내 이름") Api.makeNoti(room+" 에서",sender+" 님의 호출");

위의 Api.showToast()와 같이 쓰면 환상적인 어그로 콤비가 됩니다.

 

아래의 예제는 오류 발생 시 그 내용을 알림 창에 띄웁니다.

try{

//코드가 들어갈 자리

}catch(e){
  Api.makeNoti("오류 발생!", "내용 : "+e);
}

 

 

 

 

Api.papagoTranslate()는 되도록이면 쓰지 않는 것을 추천합니다. 메신저봇 유저들 모두가 10000회라는 사용제한을 공유하고 있기에 누군가 실수로 반복문을 잘못 돌린다거나 해서 10000회를 다 써버린다면 다른 유저들은 못 쓰게 되기 때문이죠.

그래도 초보자가 papago의 공식 번역 Api를 쓰기엔 난이도가 심하니 한영 번역 정도만 알려드리겠습니다.

if(msg.startsWith("/한영 번역 ")){
  var a = msg.replace("/한영 번역 ","");
  replier.reply(Api.papagoTranslate("ko","en",a));
}

if(msg.startsWith("/영한 번역 ")){
  var b = msg.replace("/영한 번역 ","");
  replier.reply(Api.papagoTranslate("en","ko",b));
}

위쪽의 if문은 /한영 번역 뒤에 한글을 적을 시 그것을 영어로 번역합니다.

아래의 경우 /영한 번역 뒤에 영어를 적을 시 그것을 한글로 번역합니다.

 

 

 

이번 강좌는 여기까지입니다. 이해 안 되는 부분도 많겠지만, 하다 보면 나중에 다시 봤을 때 이해가 될 겁니다.

 

궁금한 점은 댓글로 질문해 주시면 되겠습니다.

 

(혹시나 예제에 오류가 있을 시 댓글로 알려 주시면 감사하겠습니다.)

 

다음 강좌에선 Utils에 대해 풀이하도록 하겠습니다.

모두 다음 강좌에서 봅시다.

'메봇 강좌' 카테고리의 다른 글

5.1.메신저봇r의 Api 설명  (7) 2020.05.03
5.메신저봇r이 지원하는 기능들  (0) 2020.05.03
3.4.switch문의 사용법  (0) 2020.05.03
4.4.문자열 객체의 사용법  (2) 2020.04.19
4.3.배열 객체의 사용법  (0) 2020.04.05