KBot

Docs

알아두기

카카오톡봇 개발 전 꼭 알아두어야 할 몇 가지 사항이 있습니다!

  • Java와 JavaScript는 서로 다른 언어입니다! 이 말은 JavaScript를 "Java"라고 줄여서 부르지 않는다는 것이죠. 차라리 "JS"라고 부르기로 합시다.
  • 카카오톡봇 개발에 사용되는 JS는 웹 개발에 사용되는 JS가 아니라 Rhino라는 JS구현 엔진입니다. JS의 여러 최신 문법/기능이 빠지긴 했어도 Java클래스를 사용할 수 있다는 장점이 있죠!
  • 카카오톡봇을 작동시키기 위해서는 기기의 운영체제가 Android OS, 그 중에서도 버전 5.0(롤리팝) 이상이어야 해요.

카카오톡봇이 무엇인가요?

카카오톡봇은 카카오톡 상단바 알림을 읽고, 자동으로 응답하는 자동응답 봇이에요. 이걸 개발하기 위해서는 메신저봇R, 채팅 자동응답 봇 등의 앱이 쓰인답니다.

개발 준비

앱 설치

카카오톡봇을 개발하려면, 일단 개발하고 구동시킬 앱이 필요하겠죠? 지금 이 편과 앞으로의 편 모두 메신저봇R을 기준으로 할게요.

  • 우선, Google Play에서 메신저봇R 을 설치해주세요.
  • 안드로이드 버전이 7.0(누가) 미만일 경우 Wear OS by Google 를 추가로 설치해야 해요. (설치만 하면 된답니다. 이 앱에 대해서는 추가로 설정해야할 것이 없어요!)
  • 메신저봇R 최초 실행 시 데이터 폴더창이 나와요. 앞으로 자신이 개발할 봇의 소스코드를 어디에 저장할 것인지 지정하는 것이니 저장할 폴더를 지정하시면 됩니다.
  • 드디어 메신저봇R의 메인 화면을 구경할 수 있게 되었네요! 자신의 첫 봇을 만들기 위해 우측 하단에 있는 스크립트 추가 버튼을 클릭해봅시다.
  • 새 봇 창에 자신의 봇 이름을 입력하고 확인을 누르세요.
  • 이제 자신의 봇이 어떻게 작동될 것인지를 코딩할 스크립트 파일이 생성되었습니다! 생성된 스크립트를 클릭한 다음 연필 버튼을 클릭하면 소스코드를 작성할 수 있습니다.

부계정을 사용하신다고요?

부계정을 사용할건데 별도로 작업해야할 것이 있냐고요? 음... 모른다는 뜻이 아닙니다.

  • 삼성 듀얼 메신저 기능을 사용하신다면, 봇 전용 계정인 아닌 계정의 카카오톡 알림을 비활성화해야 합니다. 그러지 않으면 봇 전용 계정과 자신의 주 계정 모두가 봇으로서 작동될 수 있어요.
  • 복제 앱을 사용하신다고요? 그러면 메신저봇R > 공용 설정 > 알림을 읽을 패키지명에서 봇으로 사용할 메신저앱의 패키지명을 입력하세요.

response 함수

처음 스크립트를 생성하면, 아래처럼 코드가 이미 작성되어 있을 거예요.

const scriptName = "script";
    /**
    * (string) room
    * (string) sender
    * (boolean) isGroupChat
    * (void) replier.reply(message)
    * (boolean) replier.reply(room, message, hideErrorToast = false) // 전송 성공시 true, 실패시 false 반환
    * (string) imageDB.getProfileBase64()
    * (string) packageName
    */
    function response (room, msg, sender, isGroupChat, replier, imageDB, packageName) {
    
    }
    
    //아래 4개의 메소드는 액티비티 화면을 수정할때 사용됩니다.
    function onCreate (savedInstanceState, activity) {
    var textView = new android.widget.TextView(activity);
    textView.setText('Hello, World!');
    textView.setTextColor(android.graphics.Color.DKGRAY);
    activity.setContentView(textView);
    }
    
    function onStart (activity) {  }
    
    function onResume (activity) {  }
    
    function onPause (activity) {  }
    
    function onStop (activity) {  }

복잡해 보이죠? 하지만 카카오톡봇 제작에 가장 많이 쓰이는 것은 이것 하나입니다.

function response (room, msg, sender, isGroupChat, replier, imageDB, packageName) {
    
    }

이것을 response 함수라고 부릅니다! 이 함수는 메시지를 수신할 때마다 작동됩니다.

저 소괄호 안에 든 room, msg, sender, isGroupChat, replier, imageDB, packageName 를 response 함수의 매개변수라고 부를겁니다.

그럼 response 함수의 매개변수 각각의 기능을 살펴볼까요?

자료형 설명
String room

메시지가 발신된 채팅방의 이름을 나타냅니다.
String msg

발신된 메시지의 내용을 나타냅니다.
String sender

메시지를 발신한 유저의 이름을 나타냅니다.
Boolean isGroupChat

메시지가 발신된 방이 그룹 채팅방(3인 이상)인지의 여부를 나타냅니다.
Object replier

응답 기능, 세션 등을 가지고 있는 객체입니다. (아래 참고)
Object imageDB

메시지를 발신한 유저의 프로필 이미지의 정보를 담은 객체입니다. (아래 참고)
String packageName

메시지가 발신된 앱의 패키지명을 반환합니다. (카카오톡의 경우: com.kakao.talk)

replier

자료형 설명
void reply(msg: String)

메시지가 발신된 방에 메시지를 보냅니다.

msg: 보낼 메시지의 내용
Boolean reply(room: String, msg: String, hideToast?: Boolean= false)

특정 방에 메시지를 보냅니다.
메시지를 보낼 방에 대한 세션의 존재 여부를 반환합니다.

room: 메시지를 보낼 방 이름
msg: 보낼 메시지의 내용
hideToast?: 메시지를 보낼 방의 세션 존재 여부를 토스트 메시지로 출력할 것인지의 여부
void replyDelayed(msg: String, delay: Number)

메시지가 발신된 방에 지정한 시간이 지난 후 메시지를 보냅니다.

msg: 보낼 메시지의 내용
delay: 메시지 발신을 지연할 시간 (밀리초)
Boolean replyDelayed(room: String, msg: String, delay: Number, hideToast?: Boolean= false)

특정 방에 지정한 시간이 지난 후 메시지를 보냅니다.
메시지를 보낼 방에 대한 세션의 존재 여부를 반환합니다.

room: 메시지를 보낼 방 이름
msg: 보낼 메시지의 내용
delay: 메시지 발신을 지연할 시간 (밀리초)
hideToast?: 메시지를 보낼 방의 세션 존재 여부를 토스트 메시지로 출력할 것인지의 여부
Boolean markAsRead(room?: String, packageName?: String)

채팅방의 메시지를 읽음 처리합니다.
방에 대한 알림 읽기 세션을 찾을 수 있는지의 여부를 반환합니다.

room?: 메시지를 읽음 처리할 채팅방의 이름 (인자가 없을 시 메시지가 온 채팅방의 메시지를 읽음 처리)
packageName?: 메시지를 읽음 처리할 메신저 앱의 패키지명

imageDB

자료형 설명
String getProfileBase64()
getProfileImage()

프로필 이미지를 Base64로 인코딩한 값을 반환합니다.
android.graphics.Bitmap getProfileBitmap()

프로필 이미지를 Bitmap으로 반환합니다.
String getImageBase64()
getImage()

채팅 상에서 감지된 이미지를 Base64로 인코딩한 값을 반환합니다.
String getImageBitmap()

채팅 상에서 감지된 이미지를 Bitmap으로 반환합니다.
String getImageHash()

채팅 상에서 감지된 이미지의 해시 값을 반환합니다.
String getImageMD5()

채팅 상에서 감지된 이미지를 MD5로 인코딩한 값을 반환합니다.
String getImageSHA()

채팅 상에서 감지된 이미지를 SHA로 인코딩한 값을 반환합니다.

유용한 매개변수들이죠? 다만, response 함수의 매개변수를 사용할 때 유의해야 할 점이 있어요. response 함수의 매개변수는 반드시 response 함수 안에서만 사용을 해야 한답니다!

메시지 보내기

이제 슬슬 자동응답봇이라면 기본적으로 갖추어야 할 기본적인 기능을 알아봐야겠죠? 이번에는 카카오톡봇을 이용하여 메시지를 보내는 방법을 알아볼 겁니다!

메시지를 보내는 방법은 크게 두 가지가 있습니다. 첫 번째 방법부터 알아볼까요?

function response (room, msg, sender, isGroupChat, replier, imageDB, packageName) {
    replier.reply('Hello World!');
    // 또는
    replier.reply('방 이름', 'Hello World!');
    }

response 함수 편에서 본 replier객체가 보이죠? 2번째 줄 처럼 보낼 메시지만 입력하면, 메시지가 발신된 방으로 메시지를 보냅니다.

그리고 4번째 줄처럼 메시지를 보낼 방 이름도 입력하면, 입력된 방으로 메시지를 보냅니다.

하지만 이전 편에서 언급했듯이, replier객체는 response 함수 안에서만 사용할 수 있습니다. response 함수 밖에서 메시지를 보내는 코드를 사용하려면 어떻게 해야 할까요? 이러한 문제를 해결할 수 있는 방법이 두 번째 방법입니다!

Api.replyRoom('방 이름', 'Hello World!');

이렇게 메시지를 보낼 방의 이름과 보낼 메시지를 입력하면 됩니다. Api.replyRoom()은 response 함수의 안쪽뿐만 아니라 바깥쪽에서도 사용할 수 있죠!

레거시 API

갑자기 뜬금없이 레거시 API라니, '하늘에서 떨어졌나 땅에서 솟았나' 하는 느낌일 거예요. 하지만 이때까지 나온 소스 코드는 모두 레거시 API를 기반으로 한 것이었답니다!

카카오톡봇 개발에 사용되는 내장 API는 두 가지가 있어요. 하나는 지금 이 편에서 다룰 레거시 API이고, 다른 하나는 다음 편에서 알아볼 API2라는 것이죠.

일단 레거시 API의 객체부터 알아보도록 합시다!

객체

레거시 API의 객체들에 대해 알아볼 거예요. 레거시 API의 객체는 다양하답니다!

Api

Api 객체는 카카오톡봇의 근본적인 기능을 구현하거나 스크립트에 접근하기 위한 메소드들을 모아놓은 것이에요. 어떤 메소드들이 있는지 볼까요?

자료형 설명
android.content.Context getContext()

앱의 Context(컨텍스트)를 반환합니다.
Boolean reload(scriptName?: String, throwOnError?: Boolean = false)
compile(scriptName?: String, throwOnError?: Boolean = false)

스크립트를 재컴파일합니다.
컴파일 성공 여부를 반환합니다.

scriptName?: 재컴파일할 스크립트 이름 (인자가 없을 시 모든 스크립트를 대상으로 재컴파일)
throwOnError?: 컴파일 에러 시 에러 throw 여부
Number prepare(scriptName: String)

스크립트가 한번도 컴파일된 적이 없을 경우 컴파일합니다.
컴파일 에러 시 에러를 throw합니다. 반환값은 다음과 같습니다:

스크립트가 존재하지 않음: 0
컴파일에 성공함: 1
컴파일된 적이 있음: 2

scriptName: 컴파일할 스크립트 이름
Boolean unload(scriptName: String)

스크립트를 컴파일 전 상태로 전환합니다.
언로드 성공 여부를 반환합니다.

scriptName: 언로드할 스크립트 이름
Boolean off(scriptName?: String)

스크립트의 작동을 비활성화합니다.
주어진 인자가 없을 경우, 무조건 true를 반환합니다.
주어진 인자가 존재할 경우, 비활성화 성공 여부를 반환합니다.

scriptName?: 비활성화할 스크립트 이름
Boolean on(scriptName?: String)

스크립트의 작동을 활성화합니다.
주어진 인자가 없을 경우, 무조건 true를 반환합니다.
주어진 인자가 존재할 경우, 스크립트의 존재 여부를 반환합니다.

scriptName?: 활성화할 스크립트 이름
Boolean isOn(scriptName: String)

스크립트의 활성화 여부를 반환합니다.

scriptName: 활성화 여부를 확인할 스크립트 이름
Boolean isCompiled(scriptName: String)

스크립트의 컴파일 완료 여부를 반환합니다.

scriptName: 컴파일 완료 여부를 확인할 스크립트 이름
Boolean isCompiling(scriptName: String)

스크립트의 컴파일 진행 여부를 반환합니다.

scriptName: 컴파일 진행 여부를 확인할 스크립트 이름
Array getScriptNames()

존재하는 모든 스크립트의 이름을 배열로 반환합니다.
Boolean replyRoom(room: String, message: String, hideToast?: Boolean = false)

특정 방에 메시지를 보냅니다.
메시지를 보낼 방에 대한 세션의 존재 여부를 반환합니다.

room: 메시지를 보낼 방 이름
message: 보낼 메시지의 내용
hideToast?: 메시지를 보낼 방의 세션 존재 여부를 토스트 메시지로 출력할 것인지의 여부
Boolean canReply(room: String)

특정 방에 메시지를 수신할 수 있는지의 여부를 반환합니다.

room: 메시지 수신 가능 여부를 확인할 방의 이름
undefined showToast(content: String, length?: Number = android.widget.Toast.LENGTH_SHORT)

토스트 메시지를 발생합니다.

content: 토스트 메시지로 출력할 내용
length?: 토스트 메시지의 유지 시간
  • android.widget.Toast.LENGTH_SHORT = 0 (0x00000000): 짧은 시간 동안 출력
  • android.widget.Toast.LENGTH_LONG = 1 (0x00000001): 긴 시간 동안 출력
Boolean makeNoti(title: String, content: String, id?: Number)

상단바 노티피케이션을 생성합니다.

title: 노티피케이션의 제목
content: 노티피케이션의 내용
id?: 노티피케이션 아이디 (같은 아이디의 노티피케이션은 내용을 갱신)
String papagoTranslate(sourceLanguage: String, targetLanguage: String, content: String, errorToString?: String = false)

입력된 텍스트에 대한 Papago NMT 번역 결과를 반환합니다.

sourceLanguage: 출발어의 언어코드
targetLanguage: 번역어(도착어)의 언어코드
content: 번역할 텍스트
errorToString: 에러를 문자열로 반환할 것인지에 대한 여부
undefined gc()

가비지 컬렉팅을 강제로 시작합니다.
undefined UIThread(func: Function, onComplete: Function)

UI쓰레드 상에서 특정 함수를 실행합니다.

func: UI쓰레드 상에서 실행할 함수
complete: 결과를 처리할 함수
매개변수:
  • error: func함수 실행 도중 일어난 에러의 객체를 전달받는 인자
  • result: func함수의 반환값을 전달받는 인자
Number getActiveThreadsCount(scriptName?: String)

스크립트의 활성 쓰레드 수를 반환합니다.

scriptName?: 활성 쓰레드 수를 확인할 스크립트 이름 (인자가 없을 시 이 메소드를 호출한 스크립트의 활성 쓰레드 수 반환)
undefined interruptThreads(scriptName?: String)

스크립트의 쓰레드에 interrupt요청을 보냅니다.

scriptName?: 쓰레드에 interrupt요청을 보낼 스크립트 이름 (인자가 없을 시 이 메소드를 호출한 스크립트의 쓰레드에 interrupt요청)
Boolean isTerminated(scriptName?: String)

interruptThreads() 실행 이후, 스크립트의 모든 쓰레드의 interrupt처리 완료 여부를 반환합니다.

scriptName?: 모든 쓰레드의 interrupt처리 완료 여부를 확인할 스크립트 이름 (인자가 없을 시 이 메소드를 호출한 스크립트의 모든 쓰레드의 interrupt처리 완료 여부 반환)
Boolean markAsRead(room?: String, packageName?: String)

채팅방의 메시지를 읽음 처리합니다.
방에 대한 알림 읽기 세션을 찾을 수 있는지의 여부를 반환합니다.

room?: 메시지를 읽음 처리할 채팅방의 이름 (인자가 없을 시 메시지가 온 채팅방의 메시지를 읽음 처리)
packageName?: 메시지를 읽음 처리할 메신저 앱의 패키지명

Utils

그럼 Utils 객체는 어떤 객체일까요? 이 객체도 카카오톡봇의 근본적인 기능을 구현하기 위한 메소드들이 있답니다!

자료형 설명
String getWebText(url: String)

입력된 URL의 HTML을 반환합니다. (동기)

url: HTML을 로드할 웹 페이지의 URL
org.jsoup.nodes parse(url: String)

입력된 URL의 HTML을 로드한 org.jsoup.nodes.Document를 반환합니다. (동기, GET방식)
Number getAndroidVersionCode()

앱 구동 환경의 안드로이드 버전 코드를 반환합니다.
String getAndroidVersionName()

앱 구동 환경의 안드로이드 버전 이름을 반환합니다.
String getPhoneBrand

앱 구동 기기의 브랜드명을 반환합니다.
String getPhoneModel()

앱 구동 기기의 모델명을 반환합니다.

FileStream

이번 객체는 이름에서부터 느낌이 오지 않나요? FileStream 객체는 내부 저장소의 파일을 다루는 객체입니다! 카카오톡봇을 개발하다 보면 많이 사용할 객체이니 잘 알아보세요.

자료형 설명
String read(path: String)

특정 파일의 내용을 반환합니다.

path: 내용을 읽을 파일의 경로
String write(path: String, data: String)

파일을 새로 생성하거나, 특정 파일의 내용을 덮어씁니다.
생성하거나 덮어쓴 파일의 최종 내용을 반환합니다.

path: 생성하거나 덮어쓸 파일의 경로
data: 생성한 파일의 내용이나 파일에 덮어쓸 내용
String append(path: String, data: String)

기존의 파일의 내용에 새로운 내용을 이어 씁니다.
이어 쓴 파일의 최종 내용을 반환합니다.

path: 내용을 이어 쓸 파일의 경로
data: 파일에 이어 쓸 내용
Boolean remove(path: String)

파일을 삭제합니다.
java.io.File.delete()의 결과값을 반환합니다.

path: 삭제할 파일의 경로

DataBase

DataBase 객체는 FileStream 객체와 마찬가지로 파일을 다루는 객체입니다. 근데 뭐가 다르냐고요? 이 객체는 스크립트의 로컬 폴더에 한해서만 파일을 조작할 수 있습니다!

자료형 설명
String getDataBase(fileName: String)

스크립트 로컬 폴더 내 특정 파일의 내용을 반환합니다.

fileName: 내용을 읽을 파일의 이름
String setDataBase(fileName: String, data: String)

파일을 새로 생성하거나, 스크립트 로컬 폴더 내 특정 파일의 내용을 덮어씁니다.
생성하거나 덮어쓴 파일의 최종 내용을 반환합니다.

fileName: 생성하거나 덮어쓸 파일의 이름
data: 생성한 파일의 내용이나 파일에 덮어쓸 내용
String appendDataBase(fileName: String, data: String)

기존의 파일의 내용에 새로운 내용을 이어 씁니다.
이어 쓴 파일의 최종 내용을 반환합니다.

fileName: 내용을 이어 쓸 파일의 이름
data: 파일에 이어 쓸 내용
Boolean removeDataBase(fileName: String)

스크립트 로컬 폴더 내 특정 파일을 삭제합니다. (메신저봇R 옵션의 "삭제 시 백업기능"이 활성화 상태인 경우, fileName.bak으로 백업.)
java.io.File.delete()의 결과값을 반환합니다.

fileName: 삭제할 파일의 이름

Log

Log 객체는 앱 내 스크립트 로그에 로그를 기록할 수 있게 하는 객체입니다.

자료형 설명
undefined d(data: String, showToast?: Boolean = false)
debug(data: String, showToast?: Boolean = false)

디버그 로그를 작성합니다.

data: 작성할 디버그 로그의 내용
showToast?: 작성된 로그를 토스트 메시지로 출력할 것인지의 여부
undefined e(data: String, showToast?: Boolean = false)
error(data: String, showToast?: Boolean = false)

에러 로그를 작성합니다.

data: 작성할 에러 로그의 내용
showToast?: 작성된 로그를 토스트 메시지로 출력할 것인지의 여부
undefined i(data: String, showToast?: Boolean = false)
info(data: String, showToast?: Boolean = false)

정보 로그를 작성합니다.

data: 작성할 정보 로그의 내용
showToast?: 작성된 로그를 토스트 메시지로 출력할 것인지의 여부
undefined clear()

로그를 모두 삭제합니다.

Device

Device 객체는 구동 환경 / 기기에 관한 정보를 제공하는 메소드들을 모은 객체입니다. 빈번하게는 아니지만 꽤 애용할 만한 객체예요.

자료형 설명
android.os.Build getBuild()

android.os.Build()값을 반환합니다.
Number getAndroidVersionCode()

앱 구동 환경의 안드로이드 버전 코드를 반환합니다.
String getAndroidVersionName()

앱 구동 환경의 안드로이드 버전 이름을 반환합니다.
String getPhoneBrand()

앱 구동 기기의 브랜드명을 반환합니다.
String getPhoneModel()

앱 구동 기기의 모델명을 반환합니다.
Boolean isCharging()

앱 구동 기기가 충전 중인지의 여부를 반환합니다.
String getPlugType()

앱 구동 기기의 충전기 타입을 반환합니다.
반환값은 다음과 같습니다:
  • ac
  • wireless
  • usb
  • unknown
Number getBatteryLevel()

앱 구동 기기의 배터리 잔량(%)을 반환합니다.
Number getBatteryHealth()

앱 구동 기기의 배터리 건강 상태를 나타내는 상수를 반환합니다.
반환값은 다음과 같습니다:
  • android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN = 1 (0x00000001)
  • android.os.BatteryManager.BATTERY_HEALTH_GOOD = 2 (0x00000002)
  • android.os.BatteryManager.BATTERY_HEALTH_OVERHEAT = 3 (0x00000003)
  • android.os.BatteryManager.BATTERY_HEALTH_DEAD = 4 (0x00000004)
  • android.os.BatteryManager.BATTERY_HEALTH_VOLTAGE = 5 (0x00000005)
  • android.os.BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6 (0x00000006)
  • android.os.BatteryManager.BATTERY_HEALTH_COLD = 7 (0x00000007)
Number getBatteryTemperature()

앱 구동 기기의 배터리 온도(temp * 10)값을 반환합니다.
Number getBatteryVoltage()

앱 구동 기기의 배터리 전압(mV)을 반환합니다.
Number getBatteryStatus()

앱 구동 기기의 배터리 상태를 나타내는 상수를 반환합니다.
반환값은 다음과 같습니다:
  • android.os.BatteryManager.BATTERY_STATUS_UNKNOWN = 1 (0x00000001)
  • android.os.BatteryManager.BATTERY_STATUS_CHARGING = 2 (0x00000002)
  • android.os.BatteryManager.BATTERY_STATUS_DISCHARGING = 3 (0x00000003)
  • android.os.BatteryManager.BATTERY_STATUS_NOT_CHARGING = 4 (0x00000004)
  • android.os.BatteryManager.BATTERY_STATUS_FULL = 5 (0x00000005)
android.content.Intent getBatteryIntent()

context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))값을 반환합니다.

Bridge

Bridge 객체는 이름처럼 다른 스크립트의 전역 스코프에 접근할 수 있도록 하는 메소드를 모은 것이에요. 알아두면 언젠가 유용하게 쓰일 객체이니 기억해두세요!

자료형 설명
org.mozilla.javascript.ScriptableObject getScopeOf(scriptName: String)

특정 스크립트의 전역 스코프를 반환합니다.

scriptName: 반환받고자 하는 전역 스코프의 스크립트 이름
Boolean isAllowed(scriptName: String)

특정 스크립트의 Bridge에 의한 접근 허용 여부를 반환합니다.

scriptName: Bridge의 접근 혀용 여부를 확인할 스크립트 이름

AppData

AppData 객체는 앱의 데이터에 관한 기능들을 위한 객체예요.

자료형 설명
undefined putBoolean(key: String, boolean: Boolean)

앱 데이터에 Boolean형 데이터를 씁니다.

key: 쓸 앱 데이터의 키
boolean: key에 대한 Boolean형 데이터
Boolean getBoolean(key: String)

앱 데이터로부터 특정 키 값에 대응되는 Boolean형 데이터를 반환합니다.

key: 불러올 앱 데이터에 대응되는 키 이름
undefined putInt(key: String, integer: Number)

앱 데이터에 Number(정수)형 데이터를 씁니다.

key: 쓸 앱 데이터의 키
integer: key에 대한 Number(정수)형 데이터
Number getInt(key: String)

앱 데이터로부터 특정 키 값에 대응되는 Number(정수)형 데이터를 반환합니다.

key: 불러올 앱 데이터에 대응되는 키 이름
undefined putString(key: String, string: String)

앱 데이터에 String형 데이터를 씁니다.

key: 쓸 앱 데이터의 키
string: key에 대한 String형 데이터
String getString(key: String)

앱 데이터로부터 특정 키 값에 대응되는 String형 데이터를 반환합니다.

key: 불러올 앱 데이터에 대응되는 키
undefined remove(key: String)

AppData로 저장한 특정 키에 대응되는 앱 데이터를 삭제합니다.

key: 삭제할 앱 데이터에 대한 키
undefined clear()

AppData로 저장한 모든 앱 데이터를 삭제합니다.

이벤트 리스너

레거시 API에는 이벤트 리스너가 지정되어 있습니다. 상황에 맞는 이벤트 리스너를 사용하여 더 다양한 기능을 만들거나, 더 다양한 상황에 대응할 수 있죠!

response 함수

response 함수에 대한 설명은 Summary 편의 response 함수에 작성되어 있습니다!

onStartCompile 함수

onStartCompile 함수는 스크립트의 컴파일이 수행되려 할 때, 컴파일 수행 전 호출되는 이벤트 리스너에요.

function onStartCompile () {
                                    
    }

onNotificationPosted 함수

onNotificationPosted 함수는 기기에 상단바 노티피케이션이 생성될 때마다 호출되는 이벤트 리스너에요. 방법은 어려울지 모르지만, 이 이벤트 리스너를 이용해 다른 메신저 앱의 자동응답봇을 개발할 수 있어요!

function onNotificationPosted (statusBarNotification, sessionManager) {
    
    }
자료형 설명
android.service.notification.StatusBarNotification statusBarNotification

안드로이드 공식 문서를 참고하세요.
Object sessionManager

앱이 공식 지원하지 않는 메신저에 사용하기 위한 인자입니다.

  • bindSession(packageName?: String, room: String, action?: android.app.Notification.Action): Boolean
    : 다른 메신저 앱의 특정 방에 채팅이 왔을 때 메시지를 전송합니다.
    action?과 앱이 자동 분석한 답장 액션 모두 null이 아닌지의 여부를 반환합니다.
    • packageName?: 메시지를 보낼 메신저 앱의 패키지명
    • room: 메시지를 보낼 메신저 앱 내의 채팅방
    • action?: 메시지 전송 구형을 위한 android.app.Notification.Action

onCreate 함수

지금부터는 스크립트 액티비티에 관한 이벤트 리스너에요. 안드로이드 객체를 사용하여 새 화면을 만들 수 있는건데, onCreate 함수는 스트립트 액티비티의 onCreate가 호출될 때 호출되는 이벤트 리스너에요.

function onCreate (savedInstanceState, activity) {
    
    }
자료형 설명
android.os.Bundle savedInstanceState

액티비티의 onCreate의 인자인 savedInstanceState입니다.
android.app.Activity activity

해당 이벤트 리스너가 호출되었을 때의 액티비티입니다.

onPause 함수

onPause 함수는 스트립트 액티비티의 onPause가 호출될 때 호출되는 이벤트 리스너에요.

function onPause (activity) {
    
    }
자료형 설명
android.app.Activity activity

해당 이벤트 리스너가 호출되었을 때의 액티비티입니다.

onResume 함수

onResume 함수는 스트립트 액티비티의 onResume이 호출될 때 호출되는 이벤트 리스너에요.

function onResume (activity) {
    
    }
자료형 설명
android.app.Activity activity

해당 이벤트 리스너가 호출되었을 때의 액티비티입니다.

onStop 함수

onStop 함수는 스트립트 액티비티의 onStop이 호출될 때 호출되는 이벤트 리스너에요.

function onStop (activity) {
    
    }
자료형 설명
android.app.Activity activity

해당 이벤트 리스너가 호출되었을 때의 액티비티입니다.

API2

API2는 레거시 API보다 더 최근에 공개된 내장 API에요. 레거시 API보다 지원하는 앱이 적지만, 디스코드봇을 개발해본 분이라면 레거시 API보다 더 친숙하게 느껴질 거예요.

기존 내장 API (레거시 API)보다 더 체계적인 구조로 되어 있어요. 레거시 API에만 존재하는 기능도 있지만, API2에만 존재하는 기능도 있으니 한번 공부해보면 좋을 거예요. 안 그래요?

객체

API2의 객체는 레거시 API와 비슷한 부분도 있고, 다른 부분도 있어요. 그래도 전체적으로 보았을 땐 API2에 더 다양한 기능의 객체이 내장되어 있어요.

App

App 객체는 봇 구동 앱에 관한 기능들을 담고 있어요. 메소드는 몇 개 없지만 한번 살펴볼까요?

자료형 설명
android.content.Context getContext()

앱의 Context(컨텍스트)를 반환합니다.
undefined runOnUiThread(task: Function, onComplete: Function)

UI쓰레드 상에서 특정 함수를 실행합니다.

task: UI쓰레드 상에서 실행할 함수
complete: 결과를 처리할 함수
매개변수:
  • error: task함수 실행 도중 일어난 에러의 객체를 전달받는 인자
  • result: task함수의 반환값을 전달받는 인자

Bot

Bot 객체는 카카오톡봇을 소스 코드 상에서 카카오톡봇을 조금 더 개념화해주는 객체예요. 말이 어려워서 그렇지, 사실 카카오톡봇의 근본적인 기능에 관한 객체로 이해하시면 돼요.

자료형 설명
undefined setCommandPrefix(prefix: String)

카카오톡봇 명령어의 접두어를 설정합니다.

prefix: 카카오톡봇 명령어의 접두어로 설정할 값
Boolean send(room: String, msg: String, packageName?: String = null)

특정 방에 메시지를 보냅니다.
메시지를 보낼 방에 대한 세션의 존재 여부를 반환합니다.

room: 메시지를 보낼 방 이름
msg: 보낼 메시지의 내용
packageName?: 메시지를 보낼 메신저 앱의 패키지명
Boolean canReply(room: String, packageName?: String = null)

특정 방에 메시지를 수신할 수 있는지의 여부를 반환합니다.

room: 메시지 수신 가능 여부를 확인할 방의 이름
packageName?: 메시지 수신 가능 여부를 확인할 방이 소속한 메신저 앱의 패키지명
String getName()

카카오톡봇의 이름을 반환합니다.
undefined setPower(power: Boolean)

특정 스크립트의 작동 여부를 제어합니다.

power: 활성화할 스크립트 이름
Boolean getPower()

스크립트의 활성화 여부를 반환합니다.
undefined compile()

스크립트를 컴파일합니다.
undefined unload()

스크립트를 컴파일 전 상태로 전환합니다.
undefined on(eventName: String, listener: Function)
addListener(eventName: String, listener: Function)

특정 이벤트에 대한 이벤트 리스너를 추가합니다. (리스너 리스트의 마지막에 추가)

eventName: 리스너를 추가할 이벤트명
listener: 추가할 이벤트 리스너
undefined off(eventName: String, listener?: Function)
removeListener(eventName: String, listener?: Function)

특정 이벤트에 대한 이벤트 리스너를 제거합니다.

eventName: 리스너를 제거할 이벤트명
listener?: 제거할 이벤트 리스너 (인자가 없을 시 리스너 이벤트의 마지막 리스너를 제거)
undefined removeAllListeners(eventName: String)

특정 이벤트에 대한 모든 이벤트 리스너를 제거합니다.
undefined prependListener(eventName: String, listener: Function)

특정 이벤트에 대한 이벤트 리스너를 추가합니다. (리스너 리스트의 첫 번째에 추가)

eventName: 리스너를 추가할 이벤트명
listener: 추가할 이벤트 리스너
Array listeners(eventName: String)

특정 이벤트에 대한 모든 이벤트 리스너를 배열로 반환합니다.

eventName: 반환될 모든 이벤트 리스너의 이벤트명
Boolean markAsRead(room?: String, packageName?: String)

채팅방의 메시지를 읽음 처리합니다.
방에 대한 알림 읽기 세션을 찾을 수 있는지의 여부를 반환합니다.

room?: 메시지를 읽음 처리할 채팅방의 이름 (인자가 없을 시 메시지가 온 채팅방의 메시지를 읽음 처리)
packageName?: 메시지를 읽음 처리할 메신저 앱의 패키지명

BotManager

BotManager 객체는 앞서 나온 Bot 객체를 보조해주는 느낌의 객체예요.

자료형 설명
Bot getCurrentBot()

스크립트에 할당된 Bot 객체를 반환합니다.
Bot getBot(botName: String)

특정 Bot 객체를 반환합니다.

botName: 반환받을 Bot 객체의 이름
Array getRooms(packageName?: String)

메신저 앱에서 받은 메시지의 방 이름을 배열로 반환합니다.

packageName?: 메시지가 발신된 방들의 메신저 앱 패키지명 (인자가 없을 시 모든 메신저 앱에 대하여 반환)
Array getBotList()

모든 Bot 인스턴스를 배열로 반환합니다.
Boolean getPower(botName: String)

특정 Bot의 활성화 여부를 반환합니다.
undefined setPower(botName: String, power: Boolean)

특정 Bot의 작동 여부를 제어합니다.
Boolean compile(botName: String, throwOnError?: Boolean = false)

특정 Bot을 컴파일합니다.

botName: 컴파일할 Bot의 이름
throwOnError?: 컴파일 에러 시 에러 throw 여부
undefined compileAll()

모든 Bot을 컴파일합니다.
Number prepare(scriptName: String, throwOnError?: Boolean = false)

Bot이 한번도 컴파일된 적이 없을 경우 컴파일합니다.
컴파일 에러 시 에러를 throw합니다. 반환값은 다음과 같습니다:

컴파일에 실패함: 0
컴파일에 성공함: 1
컴파일된 적이 있음: 2

scriptName: 컴파일할 Bot의 이름
throwOnError?: 컴파일 에러 시 에러 throw 여부
Number prepare(throwOnError?: Boolean = false)

Bot에 대하여 prepare()를 실행합니다.
새롭게 컴파일된 Bot의 개수를 반환합니다.

throwOnError?: 컴파일 에러 시 에러 throw 여부
Boolean isCompiled(botName: String)

특정 Bot의 컴파일 완료 여부를 반환합니다.

botName: 컴파일 완료 여부를 확인할 Bot의 이름
undefined unload()

Bot을 컴파일 전 상태로 전환합니다.

Broadcast

Broadcast 객체는 다른 스크립트 간의 데이터 교류를 지원하는 객체입니다. 레거시 API의 Bridge 객체와 근본적인 용도는 비슷하지만, Bridge 객체보다 더 다양한 기능을 수행할 수 있죠!

자료형 설명
undefined send(broadcastName: String, value: Any)

모든 스크립트를 대상으로 특정 값을 브로드캐스트합니다.

broadcastName: 브로드캐스트 이름
value: 브로드캐스트으로 송출할 값 (register()의 인자 task의 인자로 주어짐.)
undefined register(broadcastName: String, task: Function)

특정 브로드캐스트에 대한 리스너를 추가합니다.

broadcastName: 리스너를 추가할 브로드캐스트 이름
task: 리스너로 추가할 함수
  • value: 특정 브로드캐스트을 통해 송출된 값
undefined unregister(broadcastName: String, task: Function)

특정 브로드캐스트에 대한 특정 리스너를 제거합니다.

broadcastName: 특정 리스너를 제거할 브로드캐스트 이름
task: 제거할 리스너
undefined unregisterAll()

브로드캐스트에 등록된 모든 리스너를 제거합니다.

Database

Database 객체는 레거시 API의 DataBase 객체와 비슷하게 스크립트 로컬 폴더의 /Database 폴더 내 데이터 조작에 관한 객체예요. 하지만 메소드들을 잘 살펴보면 API2의 Database 객체가 더 편리한 기능들을 가지고 있다는 것을 알 수 있어요!

자료형 설명
Boolean exists(fileName: String)

특정 이름의 파일이 존재하는지의 여부를 반환합니다.

fileName: 파일의 존재 여부를 확인할 파일의 이름
Object readObject(fileName: String)

특정 파일의 내용을 Object 형식으로 반환합니다.
파일 내용의 형식이 JSON일 경우에만 가능합니다.

fileName: 내용을 Object 형식으로 반환할 파일 이름
String readString(fileName: String)

특정 파일의 내용을 반환합니다.

fileName: 내용을 반환할 파일 이름
undefined writeObject(fileName: String, obj: Object)

인자로 주어진 객체를 JSON String으로 변환한 값을 특정 파일에 덮어씁니다.
파일이 존재하지 않을 경우 파일을 생성합니다.

fileName: 내용을 덮어씌우거나 새로 생성할 파일 이름
obj: 문자열로 변환 후 파일 내용으로 저장할 객체
undefined writeString(fileName: String, str: String)

인자로 주어진 문자열을 특정 파일에 덮어씁니다.
파일이 존재하지 않을 경우 파일을 생성합니다.

fileName: 내용을 덮어씌우거나 새로 생성할 파일 이름
str: 파일 내용으로 저장할 문자열

Device

이 객체는 보자마자 바로 "레거시 API에 있던 거 아냐?"라고 생각할 수 있어요. 그거 맞아요. API2의 Device 객체는 레거시 API의 Device 객체와 동일하답니다!

자료형 설명
android.os.Build getBuild()

android.os.Build()값을 반환합니다.
Number getAndroidVersionCode()

앱 구동 환경의 안드로이드 버전 코드를 반환합니다.
String getAndroidVersionName()

앱 구동 환경의 안드로이드 버전 이름을 반환합니다.
String getPhoneBrand()

앱 구동 기기의 브랜드명을 반환합니다.
String getPhoneModel()

앱 구동 기기의 모델명을 반환합니다.
Boolean isCharging()

앱 구동 기기가 충전 중인지의 여부를 반환합니다.
String getPlugType()

앱 구동 기기의 충전기 타입을 반환합니다.
반환값은 다음과 같습니다:
  • ac
  • wireless
  • usb
  • unknown
Number getBatteryLevel()

앱 구동 기기의 배터리 잔량(%)을 반환합니다.
Number getBatteryHealth()

앱 구동 기기의 배터리 건강 상태를 나타내는 상수를 반환합니다.
반환값은 다음과 같습니다:
  • android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN = 1 (0x00000001)
  • android.os.BatteryManager.BATTERY_HEALTH_GOOD = 2 (0x00000002)
  • android.os.BatteryManager.BATTERY_HEALTH_OVERHEAT = 3 (0x00000003)
  • android.os.BatteryManager.BATTERY_HEALTH_DEAD = 4 (0x00000004)
  • android.os.BatteryManager.BATTERY_HEALTH_VOLTAGE = 5 (0x00000005)
  • android.os.BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6 (0x00000006)
  • android.os.BatteryManager.BATTERY_HEALTH_COLD = 7 (0x00000007)
Number getBatteryTemperature()

앱 구동 기기의 배터리 온도(temp * 10)값을 반환합니다.
Number getBatteryVoltage()

앱 구동 기기의 배터리 전압(mV)을 반환합니다.
Number getBatteryStatus()

앱 구동 기기의 배터리 상태를 나타내는 상수를 반환합니다.
반환값은 다음과 같습니다:
  • android.os.BatteryManager.BATTERY_STATUS_UNKNOWN = 1 (0x00000001)
  • android.os.BatteryManager.BATTERY_STATUS_CHARGING = 2 (0x00000002)
  • android.os.BatteryManager.BATTERY_STATUS_DISCHARGING = 3 (0x00000003)
  • android.os.BatteryManager.BATTERY_STATUS_NOT_CHARGING = 4 (0x00000004)
  • android.os.BatteryManager.BATTERY_STATUS_FULL = 5 (0x00000005)
android.content.Intent getBatteryIntent()

context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))값을 반환합니다.

Event

Event 객체는 API2에서 제공하는 이벤트들에 대한 상수들을 제공하는 객체예요. 그래서 메소드는 없고 프로퍼티만 존재하는 객체이죠.

자료형 설명
String Activity.BACK_PRESSED = "activityBackPressed"

API2의 activityBackPressed 이벤트 입니다.
String Activity.CREATE = "activityCreate"

API2의 activityCreate 이벤트 입니다.
String Activity.DESTROY = "activityDestroy"

API2의 activityDestroy 이벤트 입니다.
String Activity.PAUSE = "activityPause"

API2의 activityPause 이벤트 입니다.
String Activity.RESTART = "activityRestart"

API2의 activityRestart 이벤트 입니다.
String Activity.RESUME = "activityResume"

API2의 activityResume 이벤트 입니다.
String Activity.START = "activityStart"

API2의 activityStart 이벤트 입니다.
String Activity.STOP = "activityStop"

API2의 activityStop 이벤트 입니다.
String NOTIFICATION_POSTED = "notificationPosted"

API2의 notificationPosted 이벤트 입니다.
String START_COMPILE = "startCompile"

API2의 startCompile 이벤트 입니다.
String TICK = "tick"

API2의 tick 이벤트 입니다.
String COMMAND = "command"

API2의 command 이벤트 입니다.
String MESSAGE = "message"

API2의 message 이벤트 입니다.

FileStream

이 객체도 레거시 API의 FileStream 객체와 동일한 객체예요.

자료형 설명
String read(path: String)

특정 파일의 내용을 반환합니다.

path: 내용을 읽을 파일의 경로
String write(path: String, data: String)

파일을 새로 생성하거나, 특정 파일의 내용을 덮어씁니다.
생성하거나 덮어쓴 파일의 최종 내용을 반환합니다.

path: 생성하거나 덮어쓸 파일의 경로
data: 생성한 파일의 내용이나 파일에 덮어쓸 내용
String append(path: String, data: String)

기존의 파일의 내용에 새로운 내용을 이어 씁니다.
이어 쓴 파일의 최종 내용을 반환합니다.

path: 내용을 이어 쓸 파일의 경로
data: 파일에 이어 쓸 내용
Boolean remove(path: String)

파일을 삭제합니다.
java.io.File.delete()의 결과값을 반환합니다.

path: 삭제할 파일의 경로

Http

Http 객체는 웹 상에서의 request(리퀘스트; 요청)에 관한 기능을 제공하는 객체예요.

자료형 설명
undefined request(url: String, callBack: Function)
request(option: Object, callBack: Function)

특정 URL에 Jsoup으로 비동기 request를 보냅니다.

url: request를 보낼 URL
option: request 옵션 구조
callBack: CallBack 인자 정보
org.jsoup.nodes.Document requestSync(url: String)
requestSync(option: Object)

특정 URL에 Jsoup으로 동기 request를 보냅니다.

url: request를 보낼 URL
option: request 옵션 구조

request 옵션 구조

{
        "url": String, // request를 보낼 URL
        "timeout": Number, // request 타임아웃 (밀리초; 기본값: 3000)
        "method": String, // request 메소드 (기본값: "GET")
        "headers": { /* Header */ } // request 헤더 (기본값: null)
        }

CallBack 인자 정보

error: java.lang.Exception
        response: org.jsoup.Connection.Response
        doc: org.jsoup.nodes.Document

Log

Log 객체 또한 레거시 API의 Log 객체와 동일합니다.

자료형 설명
undefined d(data: String, showToast?: Boolean = false)
debug(data: String, showToast?: Boolean = false)

디버그 로그를 작성합니다.

data: 작성할 디버그 로그의 내용
showToast?: 작성된 로그를 토스트 메시지로 출력할 것인지의 여부
undefined e(data: String, showToast?: Boolean = false)
error(data: String, showToast?: Boolean = false)

에러 로그를 작성합니다.

data: 작성할 에러 로그의 내용
showToast?: 작성된 로그를 토스트 메시지로 출력할 것인지의 여부
undefined i(data: String, showToast?: Boolean = false)
info(data: String, showToast?: Boolean = false)

정보 로그를 작성합니다.

data: 작성할 정보 로그의 내용
showToast?: 작성된 로그를 토스트 메시지로 출력할 것인지의 여부
undefined clear()

로그를 모두 삭제합니다.

sessionManager

sessionManager 객체는 채팅방 세션을 수동으로 등록할 수 있게 해주는 객체예요.

자료형 설명
Boolean bindSession(packageName?: String, room: String, action?: android.app.Notification.Action): Boolean

다른 메신저 앱의 특정 방에 채팅이 왔을 때 메시지를 전송합니다.
action?과 앱이 자동 분석한 답장 액션 모두 null이 아닌지의 여부를 반환합니다.

packageName?: 메시지를 보낼 메신저 앱의 패키지명
room: 메시지를 보낼 메신저 앱 내의 채팅방
packageName?: 메시지 전송 구형을 위한 android.app.Notification.Action

Security

Security 객체는 각종 암호화 / 복호화에 관한 기능들을 제공하는 객체예요.

자료형 설명
String aesDecode(key: String, initVector: String, value: String)

특정 값을 AES 복호화한 값을 반환합니다.

key: AES 복호화를 위한 키
initVector: 초기화 백터
value: 복호화할 값
String aesEncode(key: String, initVector: String, value: String)

특정 값을 AES 암호화한 값을 반환합니다.

key: AES 암호화를 위한 키
initVector: 초기화 백터
value: 암호화할 값
String ariaDecode(key: String, value: String)

특정 값을 ARIA 복호화한 값을 반환합니다.

key: ARIA 복호화를 위한 키
value: 복호화할 값
String ariaEncode(key: String, value: String)

특정 값을 ARIA 암호화한 값을 반환합니다.

key: ARIA 암호화를 위한 키
value: 암호화할 값
String base32Decode(value: String)

특정 값을 Base32 복호화한 값을 반환합니다.

value: 복호화할 값
String base32Encode(value: String)

특정 값을 Base32 암호화한 값을 반환합니다.

value: 암호화할 값
String base64Decode(value: String)

특정 값을 Base64 복호화한 값을 반환합니다.

value: 복호화할 값
String base64Encode(value: String)

특정 값을 Base64 암호화한 값을 반환합니다.

value: 암호화할 값
String desDecode(key: String, value: String)

특정 값을 DES 복호화한 값을 반환합니다.

key: DES 복호화를 위한 키
value: 복호화할 값
String desEncode(key: String, value: String)

특정 값을 DES 암호화한 값을 반환합니다.

key: DES 암호화를 위한 키
value: 암호화할 값
String desKey()

DES 보조키를 생성하여 반환합니다.
String des3Decode(key: String, value: String)

특정 값을 DES3 복호화한 값을 반환합니다.

key: DES3 복호화를 위한 키
value: 복호화할 값
String des3Encode(key: String, value: String)

특정 값을 DES3 암호화한 값을 반환합니다.

key: DES3 암호화를 위한 키
value: 암호화할 값
String eccDecode(key: String, value: String)

특정 값을 ECC 복호화한 값을 반환합니다.

key: ECC 복호화를 위한 키
value: 복호화할 값
String eccEncode(key: String, value: String)

특정 값을 ECC 암호화한 값을 반환합니다.

key: ECC 암호화를 위한 키
value: 암호화할 값
String hashCode(value: String)

특정 값의 해시코드를 반환합니다.

value: 해시코드를 추출할 값
String md2(value: String)

특정 값을 MD2 암호화한 값을 반환합니다.

value: 암호화할 값
String md5(value: String)

특정 값을 MD5 암호화한 값을 반환합니다.

value: 암호화할 값
String rc4Decode(key: String, value: String)

특정 값을 RC4 복호화한 값을 반환합니다.

key: RC4 복호화를 위한 키
value: 복호화할 값
String rc4Encode(key: String, value: String)

특정 값을 RC4 암호화한 값을 반환합니다.

key: RC4 암호화를 위한 키
value: 암호화할 값
String seedDecode(key: String, value: String)

특정 값을 SEED 복호화한 값을 반환합니다.

key: SEED 복호화를 위한 키
value: 복호화할 값
String seedEncode(key: String, value: String)

특정 값을 SEED 암호화한 값을 반환합니다.

key: SEED 암호화를 위한 키
value: 암호화할 값
String sha(value: String)

특정 값을 SHA 암호화한 값을 반환합니다.

value: 암호화할 값
String sha256(value: String)

특정 값을 SHA256 암호화한 값을 반환합니다.

value: 암호화할 값
String sha384(value: String)

특정 값을 SHA384 암호화한 값을 반환합니다.

value: 암호화할 값
String sha512(value: String)

특정 값을 SHA512 암호화한 값을 반환합니다.

value: 암호화할 값
String sha3_224(value: String)

특정 값을 SHA3-224 암호화한 값을 반환합니다.

value: 암호화할 값
String sha3_256(value: String)

특정 값을 SHA3-256 암호화한 값을 반환합니다.

value: 암호화할 값
String sha3_384(value: String)

특정 값을 SHA3-384 암호화한 값을 반환합니다.

value: 암호화할 값
String sha3_512(value: String)

특정 값을 SHA3-512 암호화한 값을 반환합니다.

value: 암호화할 값

이벤트

API2에는 레거시 API와 달리, 이벤트 리스너가 지정되어 있지 않습니다. 이벤트 자체만 존재할 뿐이죠. 이벤트 리스너는 Bot 객체Event 객체를 이용하여 관리할 수 있죠!

activityBackPressed

activityBackPressed 이벤트는 스크립트 액티비티의 onBackPressed가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityCreate

activityCreate 이벤트는 스크립트 액티비티의 onCreate가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityDestroy

activityDestroy 이벤트는 스크립트 액티비티의 onDestroy가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityPause

activityPause 이벤트는 스크립트 액티비티의 onPause가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityRestart

activityRestart 이벤트는 스크립트 액티비티의 onRestart가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityResume

activityResume 이벤트는 스크립트 액티비티의 onResume가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityStart

activityStart 이벤트는 스크립트 액티비티의 onStart가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

activityStop

activityStop 이벤트는 스크립트 액티비티의 onStop가 호출되면 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.app.Activity activity

해당 이벤트가 발생했을 때의 맥티비티

notificationPosted

notificationPosted 이벤트는 기기에 알림이 발생할 때 마다 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
android.service.notification.StatusBarNotification atatusBarNotification

안드로이드 공식 문서 참고
SessionManager sessionManager

메신저봇 앱이 공식적으로 지원하지 않는 메신저에 사용하기 위한 인자

startCompile

startCompile 이벤트는 컴파일 요청을 감지했을 때, 컴파일 시작 전에 발생하는 이벤트예요. 이 이벤트는 인자를 따로 필요로 하지 않죠.

tick

tick 이벤트는 매 틱마다 발생하는 이벤트예요. 이 이벤트는 아직 구현되지 않은 이벤트라는 것을 기억하세요!

message

message 이벤트는 메신저 앱에 메시지가 수신되었을 때 마다 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
Object msg

수신된 메시지에 대한 정보를 담고 있는 객체

msg 인자에 대해 더 궁금하신가요? msg 인자의 구조는 아래와 같습니다!

{
        "room": String, // 메시지가 온 방의 이름
        "content": String, // 메시지의 내용
        "isGroupChat": Boolean, // 방 내 인원이 3인 이상인지의 여부
        "isDebugRoom": Boolean, // 디버깅룸에서 온 메시지인지의 여부
        "author": { // 메시지 전송자에 대한 정보를 담고 있는 객체
            "name": String, // 메시지를 보낸 유저의 이름
            "avatar": { // 메시지 전송자 프로필에 대한 정보
                "getBase64": Function, // 전송자 프로필의 Base64 값을 반환
                "getBitmap": Function // 전송자 프로필의 android.graphics.Bitmap을 반환
            }
        },
        "reply": Function(content), // 메시지가 온 방에 content를 전송 (content: String)
        "markAsRead": Function, // 메시지가 온 방의 알림을 읽음 처리 
        "packageName": String // 메시지가 온 메신저 앱의 패키지명
        }

command

command 이벤트는 message 이벤트와 달리, Bot.setCommandPrefix()에 의해 정해진 접두어로 시작하는 메시지가 수신되었을 때 마다 발생하는 이벤트예요.

인자의 정보는 아래와 같아요.

자료형 설명
Object msg

수신된 메시지에 대한 정보를 담고 있는 객체

command 이벤트의 msg 인자에 대해서도 더 궁금하신가요? command 이벤트의 msg 인자에는 message 이벤트의 인자에 없는 프로퍼티가 있답니다!

{
        "command": String, // 명령어의 이름 ('/angles 30 60 90' 이라는 메시지일 때 "angles")
        "args": Array, // 명령어의 인자들의 배열 (인자가 없을 경우 길이가 0인 배열 반환; 가령, '/angles 30 60 90' 이라는 메시지일 때 ["30", "60", "90"])
        "room": String, // 메시지가 온 방의 이름
        "content": String, // 메시지의 내용
        "isGroupChat": Boolean, // 방 내 인원이 3인 이상인지의 여부
        "isDebugRoom": Boolean, // 디버깅룸에서 온 메시지인지의 여부
        "author": { // 메시지 전송자에 대한 정보를 담고 있는 객체
            "name": String, // 메시지를 보낸 유저의 이름
            "avatar": { // 메시지 전송자 프로필에 대한 정보
                "getBase64": Function, // 전송자 프로필의 Base64 값을 반환
                "getBitmap": Function // 전송자 프로필의 android.graphics.Bitmap을 반환
            }
        },
        "reply": Function(content), // 메시지가 온 방에 content를 전송 (content: String)
        "markAsRead": Function, // 메시지가 온 방의 알림을 읽음 처리 
        "packageName": String // 메시지가 온 메신저 앱의 패키지명
        }

패키지/클래스

Java의 패키지 / 클래스와 연관있는 내용이기 때문에 이에 대한 지식을 가지고 있어야 읽기 수월할 거예요..

카카오톡봇 개발에 사용되는 자바스크립트는 Java로 구현된 Rhino엔진이라고 했었죠. 그렇기에 다른 자바스크립트 엔진과 다른 점이 있어요. 그 중 하나가 바로 Java의 클래스를 사용할 수 있다는 것이죠!

음.. 이게 왜 이점이 되는지 잘 모르겠다고요? Java클래스 중에는 원래 JS만으로는 한계가 있는 것들을 가능케 하는 것들이 있기 때문이에요. 그럼 이제 Java의 패키지와 클래스를 사용하는 방법을 알아볼까요?

사실 별거 없어요. 자바에서 사용하는 것 처럼 그냥 아래와 같이 사용하면 되는 거니까요.

new java.io.File('sdcard/folder1/');
    java.lang.Thread.sleep(1000);

아, 근데 클래스의 전체 이름은 사용하기에 조금 긴 느낌이 있잖아요. 그래서 자바에서는 임포트(Import)를 하죠. Rhino엔진에서도 패키지와 클래스의 임포트를 지원해요!

importClass(java.io.File);
    importPackage(java.lang);
    
    new File('sdcard/folder1/');
    Thread.sleep(1000);

다만, 한계가 있어요. 자바의 클래스명과 자바스크립트의 내장객체 이름이 같은 경우에는 자바의 전체 클래스명을 사용해야 예기치 않은 오류를 방지할 수 있어요. 예를 들자면, 자바의 java.lang.String 클래스와 자바스크립트의 String 객체 말이죠.

ADB

내용이 다소 미약하므로 여기에서 문서의 작성을 도와주세요!

카카오톡봇 개발을 컴퓨터로 하는 분들 계신가요? 컴퓨터에서 개발하고 휴대폰으로 옮기는게 귀찮을 수 있어서 메신저봇R은 ADB를 지원합니다. 아래에 예제를 달아놓을게요.

MDB(MessengerBot Debug Bridge) 예제

Actions Extras 설명
com.xfl.msgbot.broadcast.compile name: String 이름이 nameBot 객체를 컴파일합니다.
com.xfl.msgbot.broadcast.set_bot_power name: String, power: Boolean 이름이 nameBot 객체의 작동 여부를 제어합니다.
com.xfl.msgbot.broadcast.set_activation activation: Boolean 메신저봇R의 작동 여부를 제어합니다.

소켓 통신

내용이 다소 미약하므로 여기에서 문서의 작성을 도와주세요!

소켓 통신을 통해 카카오톡봇을 구동하는 기기 외의 기기에서도 메신저봇R에 접근하게 할 수도 있어요!

PC에서 메신저봇으로 요청을 보내든, 메신저봇에서 PC로 요청을 보내든 한줄로 된 JSON 형태로 보내야 해요. 메신저봇이 readLine으로 요청을 처리하거든요.

아래는 PC에서 메신저봇으로 요청을 보낼 때 필요한 데이터의 형태에요.

{
        "name": "debugRoom",
        "data": {
            "botName": String, // 봇의 이름
            "authorName": String, // 메시지 전송자 이름
            "roomName": String, // 방의 이름
            "isGroupChat": Boolean, // 방 내 인원이 3인 이상인지의 여부
            "packageName": String, // 메시지가 온 앱의 패키지명
            "message": String // 메시지 내용
        }
    }

위의 JSON을 사용하여 요청을 보낼 땐 아래와 같이 보내면 되겠죠?

{ "name": "debugRoom", "data": { "botName": String, "authorName": String, "roomName": String, "isGroupChat": Boolean, "packageName": String, "message": String  } }

그리고 아래 JSON은 메신저봇에서 PC로 요청을 보낼 때 필요한 데이터의 형태이죠.

{
        "name": "debugRoom",
        "data": {
            "botName": String, // 봇의 이름
            "authorName": String, // 메시지 전송자 이름
            "roomName": String, // 방의 이름
            "message": String, // 메시지 내용
            "isBot": Boolean // 메시지 전송자가 봇인가에 대한 불린 값
        }
    }