ごった煮

色々な事を書いてます

REST APIでBotと会話する(メッセージ取得編)

前回でメッセージをBotに送信する部分まで作ったので最後にやり取りを取得する部分を実装してBotとの会話を完成させます。

初めに

例のごとくSwaggerドキュメントは、ここ です。

認証トークンについては、前回の記事 を参照して取得しておいてください

APIの仕様

以下APIの仕様です

watemarkを渡すと、渡したwatemark以降のメッセージが取得されます

レスポンス内容

{
  "messages": [
    {
      "id": "string",
      "conversationId": "string",
      "created": "datetime",
      "from": "string",
      "text": "string",
      "channelData": "string",
      "images": [
        "string"
      ],
      "attachments": [
        {
          "url": "string",
          "contentType": "string"
        }
      ],
      "eTag": "string"
    }
  ],
  "watermark": "string",
  "eTag": "string"
}

送信内容のjsonにwatemarkのプロパティが新たに含まれた形で返ってきます

コード例

C#

C#で書くと大体以下のような感じです

以下が取得するコードです。

        private async static Task GetMessageCustom(AuthTokenModel token, string watermark = null)
        {
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", token.Token);
            httpClient.BaseAddress = new Uri(baseUrl);
            var url = "";
            if(watermark != null)
            {
                url = "api/conversations/" + token.ConversationId + "/messages" + "?watermark=" + watermark;
            }
            else
            {
                url = "api/conversations/" + token.ConversationId + "/messages";
            }

            var response = await httpClient.GetAsync(url);
  
            return response;
        }

watermarkを取得するためにレスポンスをデシリアライズするコードは、以下のような感じです。

            var response = await GetMessageCustom(token);
            var authTokenModel = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync());

Go

Goで書くと以下のような感じです。

まずjsonのパースにつかう構造体です。

Message型は、前回 を参照

type ResponseMessage struct {
    Messages []Message `json:"messages"`
    Watermark string `json:watermark`
}

メッセージを取得するコードは、以下のような感じです。

func GetMessage(token string, conversationID string, watermark string) string {
    client := &http.Client{}
    var url string
    if watermark != "" {
        url = "https://directline.botframework.com/api/conversations/" + conversationID + "/messages" + "?watermark=" + watermark
    } else {
        url = "https://directline.botframework.com/api/conversations/" + conversationID + "/messages"
    }
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Authorization", "Botconnector " + token)
    res, _ := client.Do(req)
    body, _ := ioutil.ReadAll(res.Body)
    defer res.Body.Close()
    
    var response ResponseMessage
    json.Unmarshal(body, &response)
    
    fmt.Println(string(body))
    fmt.Println(response.Watermark)
    
    return response.Watermark
}

この関数の戻り値を取っておいて、次に取得する際にこの関数に渡すと新しいメッセージのみ取得できます。

まとめ

これで基礎的なコードの実装はできました。

とりあえずこれでSDK等なくてもRESTでBotとの会話を仕込めるようになったのでモバイルだったりC#, node以外の環境でもBotを試してみるといいかもしれません