메신저 봇 sender - mesinjeo bos sender

Violet's Devblog

메신저봇 가이드 - 이벤트 리스너(레거시) 본문

Android/메신저봇

메신저봇 가이드 - 이벤트 리스너(레거시)

DEViolet 2019. 8. 10. 00:50

연관 문서

  • 메신저봇 가이드 - 소개
  • 메신저봇 가이드 - API(레거시)
  • 메신저봇 가이드 - 이벤트 리스너(레거시)

response

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

메신저봇 앱이 사용자가 지정한 메신저 앱의 알림을 성공적으로 파싱했을 경우 호출됩니다.
room: 메시지가 온 채팅방 이름
msg: 메시지의 내용
sender: 메시지를 보낸 사람의 닉네임
isGroupChat: 메시지를 보낸 방이 개인 채팅방이면 false, 단체 채팅방이면 true
replier: 채팅에 답장을 하는데 사용할 수 있는 객체. 자세한 내용은 메신저봇 가이드 - 레거시 API를 확인하세요
imageDB: 프로필 사진 정보를 담고 있는 객체. 자세한 내용은 메신저봇 가이드 - 레거시 API를 확인하세요
packageName: 채팅이 온 메신저 앱의 패키지명 (예를 들어 카카오톡의 경우 com.kakao.talk

onStartCompile

function onStartCompile()

API를 통해서든 앱의 컴파일 버튼을 통해서든, 컴파일을 수행하고자 할 때 먼저 이 함수가 호출된 후 컴파일을 하게 됩니다.
이 함수에는 몇가지 주의 사항이 있습니다.

  1. onStartCompile의 정의를 업데이트하게 되면, 최소한 다음 컴파일타임에는 업데이트되기 전의 함수가 호출됩니다.
    이는 어찌생각해보면 당연한 동작으로, 예를 들어 onStartCompileA로 정의되어 있는 상태에서 B로 업데이트하게 되면 다음 컴파일타임에는 A가 호출될 것이고, 그 다음 컴파일타임부터는 B의 내용이 적용되어, B가 호출될 것입니다.
  2. 이번 컴파일중에 컴파일에러가 발생하면, 다음 컴파일타임에는 onStartCompile이 호출되지 않습니다.

onNotificationPosted

function onNotificationPosted(statusBarNotification, sessionManager)

기기에 알림이 뜰때마다 호출됩니다. statusBarNotification에 대해서는 안드로이드 공식 문서를 확인하세요.
sessionManager를 통해서는 Api.replyRoom 또는 replier.reply를 통해 해당 알림에 답장하는 방법을 메신저봇 앱에 제공할 수 있습니다. 이는 메신저봇이 공식적으로 지원하지 않는 메신저를 사용할 때 활용할 수 있습니다.

sessionManager.bindSession(packageName, room, action?); //action 값은 주지 않아도 됩니다.

해당 packageName을 가진 메신저앱의 room에 해당하는 방에서 채팅이 왔을 경우, action을 통해 답장을 전송합니다. action값이 주어지지 않는다면, 앱에서 자동으로 읽어들인 action을 사용합니다.

sessionManager.bindSession(room, action?); //action 값은 주지 않아도 됩니다.

위와 비슷하지만, packageName을 앱에서 자동으로 읽어들인다는 차이점이 있습니다.

onCreate

function onCreate(savedInstanceState, activity)

스크립트 액티비티의 onCreate가 호출될 때 잇따라 호출됩니다.
savedInstanceState: 액티비티의 onCreate의 인자인 savedInstanceState를 그대로 제공합니다
activity: 현재 액티비티를 제공합니다

onPause

function onPause(activity)

스크립트 액티비티의 onPause가 호출될 때 잇따라 호출됩니다.
activity: 현재 액티비티를 제공합니다

onResume

function onResume(activity)

스크립트 액티비티의 onResume이 호출될 때 잇따라 호출됩니다.
activity: 현재 액티비티를 제공합니다

onStop

function onStop(activity)

스크립트 액티비티의 onStop이 호출될 때 잇따라 호출됩니다.
activity: 현재 액티비티를 제공합니다

Violet's Devblog

메신저봇 가이드 - 소개 본문

연관 문서

  • 메신저봇 가이드 - 소개
  • 메신저봇 가이드 - API(레거시)
  • 메신저봇 가이드 - 이벤트 리스너(레거시)

메신저봇이란

메신저봇은 카카오톡, 라인, 페이스북 메신저 등 다양한 메신저에 자동으로 응답할 수 있도록 해주는 어플리케이션입니다.

작동 방식

메신저봇은 NotificationListenerService를 통해 알림을 파싱한 후, Rhino JavaScript Engine을 사용하여 사용자가 작성한 자바스크립트로 알림 정보를 전달하여 처리할 수 있도록 합니다. (따라서, 자바스크립트를 모르는 분들은 애석하게도 이 앱을 활용하려면 자바스크립트에 대해 먼저 배우셔야 합니다.)
답장은 최종적으로 WearableExtender를 활용해 하게 됩니다.

스크립트 작성 방법 - 레거시(구형; 신형은 아직 준비중!)

다음과 같이 room, msg, sender, isGroupChat, replier, imageDB, packageName의 순서대로 매개변수를 받는 함수 response를 선언합니다.

/* string room: 방 이름
 * string msg: 메시지 내용
 * string sender: 전송자 이름
 * boolean isGroupChat: 단체채팅방 여부
 * SessionCacheReplier replier: 채팅방의 정보를 담고 있으며, 알림을 받은 채팅방으로 답장을 할 수 있도록 하는 객체
 * - replier.reply(방_이름, 메시지, hideToast = false) 특정 방에 메시지를 보냄.
 *   hideToast는 아직 정보를 얻지 못한 채팅방으로 전송하려고 할 때 발생하는 토스트 경고 메시지를 생략할것인지에 대한 여부, 기본값은 false
 * - replier.reply(메시지) replier가 담고 있는 채팅방에 메시지를 보냄.
 * ImageDB imageDB: 이미지 정보를 담고 있는 객체(후술)
 * string packageName: 알림을 띄운 메신저앱의 패키지 이름 (예컨대, 카카오톡의 경우 com.kakao.talk)
 */
function response(room, msg, sender, isGroupChat, replier, imageDB, packageName){
  if(room == "테스트방"){
    if(msg == "테스트!"){
      replier.reply("답장하는 법 1");
      Api.replyRoom(room, "답장하는 법 2");
    }
  }
}

response함수는 사용자가 알림을 분석하도록 설정한 메신저 앱에서(기본적으로 카카오톡으로 설정되어 있음) 메시지가 포함된 알림을 띄웠을 때 호출됩니다.

주의: replier 객체는 절대 전역변수로 복사해서 안됩니다. 메신저봇은 각각의 메시지를 비동기적으로 처리하기 때문에, 예상치 못한 채팅방으로 답장이 튀어버리는 기이한 상황이 벌어질 수 있기 때문입니다. response함수 밖에서 답장 기능을 사용하려면 Api.replyRoom을 사용하세요.

레거시(구형) API 리스트

해당 문서로 이동

레거시 이벤트 리스너

해당 문서로 이동

카카오톡 봇 (JS)

[카카오톡 봇 강좌(JS/Coffee/Lua)] 4강. 채팅을 보낸 사람, 방 이름에 따라 작동시키기(?)

1강과 3강을 읽고 응용을 해보신 분이라면 이미 알고 있을지도 모르는 부분입니다.

카카오톡 봇 관련 채팅방들을 돌아다니다 보면, 수신된 채팅 내용은 확인할 줄 알면서 누가 보냈는지는 확인할 줄 모르는 사람들이 많습니다.

즉, 1 + 1은 할 줄 아는데, 1 + 2는 할 줄 모르겠다면서 못하겠다고 징징거리시는 분들.

1강에서는 msg와 sender, room이 언급되었습니다. 각각 수신된 채팅 내용과 보낸 사람, 채팅이 수신된 채팅방 이름이라고 했었지요.

3강에서는 특정 채팅에 반응한다면서 msg를 가지고 놓았었습니다.

그러면, 채팅을 보낸 사람과 채팅이 수신된 채팅방은 어떻게 확인할까요?

간단합니다. msg 대신 sender, room을 비교하시면 됩니다.

다음 소스들은 닉네임이 히오스인 사람이 채팅을 보내면 시공을 좋아하냐고 물어보고,

방 이름이 실험방인 곳에서 채팅이 수신되면 특정 채팅방에서 반응한다는 채팅을 보내는 예제입니다.

[자바스크립트]

function response(room, msg, sender, isGroupChat, replier) {

  msg = msg.trim(); //아이콘이 초록색인 봇과 Nusty 내장 카톡봇에서는 없어도 됨.

  if (sender == "히오스") {

    replier.reply("시공을 좋아하십니까?");

  }

  if (room == "실험방") {

    replier.reply("특정 채팅방에 반응");

  }

}

[커피스크립트]

response = (room, msg, sender, isGroupChat, replier) -> 

  if sender is "히오스"

    replier.reply "시공을 좋아하십니까?"

  if room is "실험방"

    replier.reply "특정 채팅에 반응"

또는

response = (room, msg, sender, isGroupChat, replier) -> 

  replier.reply "시공을 좋아하십니까?if sender is "히오스"

  replier.reply "특정 채팅에 반응" if room is "실험방"

[루아]

function response(room, msg, sender, isGroupChat, replier)

  if sender == "히오스" then

    replier:reply("시공을 좋아하십니까?")

  end

  if room == "실험방" then

    replier:reply("특정 채팅에 반응")

  end

end