LINEBOT에서 대화 상태(컨텍스트) 관리(세션 관리?)
                                            
                                                
                                                
                                                
                                                
                                                
                                                 16373 단어  LINEmessagingAPIlinebot자바
                    
하고 싶은 일
대화의 스테이터스(컨텍스트)와 같은 것을 서버측에 갖게 해 두고(웹 앱의 세션 같은 느낌?), 그에 의해 응답이 바뀌는 LINEBOT를 만들고 싶다.
이미지로서는 이런 느낌.

자연 언어 해석이라든지, DeepLearning이라든지, RNN이라든지, 잡담 BOT이라든지, 그러한 고도의 이야기가 아닙니다.
실현 방법
사용자 ID를 key, 저장할 값을 모은 클래스를 value로 한 map을 작성하기로 했습니다.
그 외, 메세지에 응답하는 개소의 구현은 sample-spring-boot-kitchensink (을)를 참고로 했습니다 (replyText 메소드).
언어는 Java입니다.
실은 더 왕도의 방법(≒라이브러리, 프레임워크)이 있다, 라고 하는 것이 있으면 꼭 가르쳐 주세요.
상태를 저장하는 클래스
Status.java
public class Status {
    private String context = "0";//ステータス
    private String place = "";//場所
    public String getContext() {
        return context;
    }
    public void setContext(String context) {
        this.context = context;
    }
    public String getPlace() {
        return place;
    }
    public void setPlace(String place) {
        this.place = place;
    }
}
지도
PseudoSession.java
public class PseudoSession {
    private static Map<String,Status> statusMap = new HashMap<>();
    public static Status getStatus(String userId) {
        return PseudoSession.statusMap.get(userId);
    }
    public static void putStatus(String userId, Status status) {
        PseudoSession.statusMap.put(userId, status);
    }
    public static String readContext(String userId) {
        return PseudoSession.statusMap.get(userId).getContext();
    }
    public static String readPlace(String userId) {
        return PseudoSession.statusMap.get(userId).getPlace();
    }
    public static void updateContext(String userId, String context) {
        Status newStatus = PseudoSession.statusMap.get(userId);
        newStatus.setContext(context);
        PseudoSession.statusMap.put(userId, newStatus);
    }
    public static void updatePlace(String userId, String place) {
        Status newStatus = PseudoSession.statusMap.get(userId);
        newStatus.setPlace(place);
        PseudoSession.statusMap.put(userId, newStatus);
    }
}
주요 처리
Controller.java
    private void handleTextContent(String replyToken, Event event, TextMessageContent content)
            throws Exception {
        final String text = content.getText();
        final String userId = event.getSource().getUserId();
        //初めてアクセスするユーザーの場合、mapに値を入れる
        if (Objects.isNull(PseudoSession.getStatus(userId))) {
            PseudoSession.putStatus(userId, new Status());
        }
        if(PseudoSession.readContext(userId).equals("0")) {
            if (text.equals("天気教えて")) {
                this.replyText(replyToken,"どこの天気?");
                PseudoSession.updateContext(userId,"1");
            } else {
                this.replyText(replyToken,"「天気教えて」って入力してみて!");
            }
        }else if (PseudoSession.readContext(userId).equals("1")) {
            if (!("富山".equals(text))&&!("石川".equals(text))) {
                this.replyText(replyToken,"富山か石川しか分からないんだ");
            } else {
                this.replyText(replyToken,"いつの天気?");
                PseudoSession.updatePlace(userId,text);
                PseudoSession.updateContext(userId,"2");
            }
        }else if (PseudoSession.readContext(userId).equals("2")) {
            if (!("今日".equals(text))&&!("明日".equals(text))) {
                this.replyText(
                        replyToken,"今日か明日しか分からないんだ");
            } else {
                String answer = text + "の"
                        + PseudoSession.readPlace(userId) + "の"
                        + "天気は晴れです。";
                this.replyText(replyToken,answer);
                PseudoSession.updatePlace(userId,"");
                PseudoSession.updateContext(userId,"0");
            }
        }
    }
결과
 
                Reference
이 문제에 관하여(LINEBOT에서 대화 상태(컨텍스트) 관리(세션 관리?)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shima-218/items/643406e5a8c0ed3b2176텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)