初めに

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

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

APIの仕様

以下APIの仕様です

  • エンドポイント : https://directline.botframework.com/api/conversations/{ConversationId}/messages
    • conversationId : 前回取得したトークン内のConversationId
  • HTTPメソッド : GET
  • Header
    • Authorization
      • Key : BotConnector
      • Value : 認証トークン内のToken
  • パラメータ
    • watemark : 一番最新の取得したメッセージのwatemark(オプション)

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を試してみるといいかもしれません

CATEGORIES