Bot Framework에서 Slack bot 빌드 노트

12021 단어 슬랙BotFrameworkbot
다음 두 기사를 바탕으로 Microsoft Bot Framework 및 Microsoft Cognitive Services를 사용하는 표정 분석 bot API를 게시하여 Slack을 클라이언트로 사용할 수 있도록 구성해 보았습니다.
  • 인공 지능 부품 Microsoft Cognitive Services를 사용한 표정 분석 앱을 만들자! (Emotion API × Bot Framework 편)
  • Azure에서 웹 게시 및 간편한 웹 채팅 사용

  • Slack bot 구성 방법은 Bot Framework 사이트 에서 Slack 설정을 추가할 때 나타나는 단계에 따라 진행할 수 있습니다.

    이하에서는, 구축시의 작업 메모나 주의점에 대해서 간단하게 써 둡니다.

    (1) 개발 환경에서의 실행에 대해서



    로컬 개발 환경에서는 Visual Studio에서 시작한 bot API에 Bot Framework Channel Emulator에서 연결할 수 있지만 [디버그 없이 시작(Ctrl+F5)]에서는 401 오류가 발생합니다.
    [디버그 시작(F5)]에서 실행하면 연결할 수 있습니다.

    이것은 Controller 에 BotAuthentication 속성이 붙어 있기 (위해)때문에, 디버거에 첨부 되고 있을 때는 인증 불필요하게 되기 (위해)때문에입니다.
    따라서 개발 환경에서는 [디버그 시작(F5)]에서 실행합시다.

    (2) 계정 정보 설정 정보



    Azure에 게시된 API의 Web.config appSettings에 계정 정보를 설정하려면 Azure 포털의 응용 프로그램 설정을 사용하는 것이 좋습니다.

    (3) 클라이언트에서 텍스트 표시 정보



    텍스트는 기본적으로 Markdown 형식입니다. 입니다. 따라서 기호 등을 사용할 때는 주의가 필요합니다.
    또한 reply.TextFormat을 plain으로 설정해도 Web Chat에서는 유효하지 않습니다.
    또한 reply.TextFormat을 plain으로 설정해도 Slack에서는 왜 *가 _로 표시됩니다.

    (4) Activity.Type 정보



    Slack은 activity.Type이 ActivityTypes.Message가 아닌 요청을 보낼 수 있습니다.
    activity.Type 의 값에 의해 처리를 분기시키지 않으면, 응답 메세지가 중복해 표시되어 버립니다.

    (5) URL 전송 정보



    Slack에서 URL을 보내면 bot 측에서 수신하는 텍스트는 URL을 <와 >로 묶습니다.

    위의 (4), (5)를 근거로 개량한 것이 다음의 소스 코드입니다.
    전체 소스 코드는 EmotionBotApi (GitHub)에 있습니다.

    MessagesController.cs
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type != ActivityTypes.Message)
            return Request.CreateResponse(HttpStatusCode.OK);
        if (string.IsNullOrWhiteSpace(activity.Text))
            return Request.CreateResponse(HttpStatusCode.OK);
    
        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
        // In Slack, URLs are qualified by '<' and '>'.
        var text = activity.Text.Trim('<', '>');
    
        var echoMessage = $"You sent this picture.  \n![]({text})";
        await Reply(connector, activity, echoMessage);
    
        var mainMessage = await GetEmotionsAsync(text);
        await Reply(connector, activity, mainMessage);
    
        return Request.CreateResponse(HttpStatusCode.OK);
    }
    
    static async Task<string> GetEmotionsAsync(string text)
    {
        if (!Uri.IsWellFormedUriString(text, UriKind.Absolute)) return "Send the URL of a picture.";
    
        var emotions = await RecognizeEmotionsAsync(text);
        if (emotions == null) return "The emotions recognition failed.";
        if (emotions.Length == 0) return "Nobody is recognized.";
    
        var topScore = emotions[0].Scores
            .ToRankedList()
            .First();
        return $"{topScore.Key}: {topScore.Value:P1}";
    }
    
    static async Task<Emotion[]> RecognizeEmotionsAsync(string imageUrl)
    {
        var client = new EmotionServiceClient(SubscriptionKey);
    
        try
        {
            return await client.RecognizeAsync(imageUrl);
        }
        catch (Exception)
        {
            return null;
        }
    }
    
    static async Task Reply(ConnectorClient connector, Activity activity, string message)
    {
        var reply = activity.CreateReply(message);
        await connector.Conversations.ReplyToActivityAsync(reply);
    }
    

    다음과 같이 HTTP 상태 코드 202에서 메시지를 반환합니다.
    await connector.Conversations.ReplyToActivityAsync(reply);
    

    완료되면 HTTP 상태 코드 200을 반환합니다.
    return Request.CreateResponse(HttpStatusCode.OK);
    

    Slack에서 실행할 때의 스크린 샷입니다.


    소인수분해 bot 에 대해서는 Bot Framework에서 Slack bot 구성 에 썼습니다.

    만든 샘플
    BotSample (GitHub)

    버전 정보
    .NET Framework 4.6
    Microsoft.Bot.Builder 3.3.0
    Microsoft.ProjectOxford.Emotion 1.0.331.1

    좋은 웹페이지 즐겨찾기