ごった煮

色々な事を書いてます

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

前回REST APIで会話を開始する(認証)部分について触れたので、次に実際に会話する部分の実装をしてみます。

初めに

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

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

APIの仕様

以下APIの仕様です。

Body用のJson形式

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

textだけデータを入れておけば問題なく受け付けてくれます。

レスポンス内容

このAPIは、受け付けると空の204が返ってきます。

その他は, Swaggerドキュメント参照

コード例

C#

C#だと大体以下のような感じ

モデルは、面倒だったのでライブラリで用意されているものを使用していますが他は、HttpClientをベースに作っています。

        private static async Task Send(AuthTokenModel token)
        {
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json; charset=utf-8"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", token.Token);
            httpClient.BaseAddress = new Uri(baseUrl);

            var message = new Microsoft.Bot.Connector.DirectLine.Models.Message
            {
                Text = "hogehoge"
            };
            var json = JsonConvert.SerializeObject(message);
            var response = await httpClient.PostAsJsonAsync("api/conversations/" + token.ConversationId + "/messages", message);
        }

Go

Goだと大体以下のような感じ

まずjsonへのエンコードに使う構造体です

type Token struct {
    ConversationId string
    ETag string
    Token string
}

type Message struct {
    Id string `json:"id"`
    ConversationId string `json:"conversationId"`
    Created string `json:"created"`
    From string `json:"from"`
    Text string `json:"text"`
    ChannelData string `json:"channelData"`
    Images [] string `json:"images"`
    Attachments [] Attachment `json:"attachments"`
    ETag string `json:"eTag"`
}

type Attachment struct {
    Url string `json:"url"`
    ContentType string `json:"contentType"`
}

次に送信処理です。

引数には、前回取得したTokenとConversationIdを渡します

func SendMessage(token string, conversationID string){
    message := Message{}
    message.Text = "hogehoge"
    
    json, err := json.Marshal(message)
    
    if err != nil{
        return
    }
    
    req, err := http.NewRequest("POST", "https://directline.botframework.com/api/conversations/" + conversationID + "/messages", bytes.NewBuffer([]byte(json)))
    
    if err != nil{
        return
    }
    
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Authorization", "Botconnector " + token)
    
    client := &http.Client{}
    resp, _ := client.Do(req)  
    
    fmt.Println(resp.Status)
}

 

まとめ

基本的にゆるりとエンドポイントにPOSTすればメッセージの送信はできます。

あとは、やりとりを取得する処理を作ればBotとの会話が可能になるのでそれはまた次回