ごった煮

色々な事を書いてます

REST APIでBotと会話する(会話開始編)

DirectLineを使ってのBotとのやり取りを以前まとめましたが、今回はそれをラッパーライブラリなしでやってみます。

初めに

今回の内容は、DirectLineの認証トークンを取得するまでを行います。

ちなみにDirectLine全体のSwaggerドキュメントは、ここ にあります。

APIの仕様

認証トークンの取得用のREST APIの使い方は、以下のような感じです。

大体こんな感じです。

レスポンス内容

以下のような感じです。

Swaggerには、eTag要素が含まれていますが落ちてこないので謎です。

{
    "conversationId": "string",
"token": "string" }

コード例

C#

C#だと大体以下のような感じで取得できます。

まずレスポンスを格納するモデルです。

    class AuthTokenModel
    {
        [JsonProperty("conversationId")]
        public string ConversationId { get; set; }
        [JsonProperty("token")]
        public string Token { get; set; }
        [JsonProperty("eTag")]
        public string ETag { get; set; }
    }

実際に取得するコード

        private static async Task GetDirectLineAuthToken()
        {
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", "DirectLineToken");
            httpClient.BaseAddress = new Uri("https://directline.botframework.com/");

            var response = await httpClient.PostAsync("api/conversations", new FormUrlEncodedContent(new SortedDictionary()));
            var json = await response.Content.ReadAsStringAsync();
            var authTokenModel = JsonConvert.DeserializeObject(json);

            return authTokenModel;
        }

Curl

Curlで呼び出すと以下のような感じです。

curl -H "Authorization: BotConnector Token" \
-X POST \
-H "Content-type: application/json" \
-H "Content-length: 0" \
https://directline.botframework.com/api/conversations 

Go言語

Goでやると以下のような感じ

まずレスポンスを格納する構造体です。

type Token struct {
    ConversationId string
    ETag string
    Token string
}

全体のコードは、以下のような感じ

DirectLineTokenのところにBot Frameworkのサイトから取得できるトークンを入れます

package main

import(
    "fmt"
    "net/http"
    "net/url"
    "strings"
    "io/ioutil"
    "encoding/json"
)

type Token struct {
    ConversationId string
    ETag string
    Token string
}

func main(){
    values := url.Values{}
    req, err := http.NewRequest("POST", "https://directline.botframework.com/api/conversations", strings.NewReader(values.Encode()))
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Content-length", "0")
    req.Header.Add("Authorization", "Botconnector DirectLineToken")
   
    if err != nil{
        fmt.Println("erro1")
        return
    }
    
    client := &http.Client{}
    resp, err := client.Do(req)
    
    if err != nil{
        return
    }
    
    defer resp.Body.Close()
    
    token, err := ParseJson(resp)
    
    if err != nil{
        return
    }
    
    fmt.Println(token.Token)
    fmt.Println(token.ConversationId)
}

func ParseJson(resp *http.Response) (Token, error){
    b, err := ioutil.ReadAll(resp.Body)
    
    var token Token
    json.Unmarshal(b, &token)    
    return token, err
}

まとめ

認証トークンが取れたらあとはBotにメッセージを投げて、メッセージの取得の繰り返しです。

そこら辺の処理についてはまた今度

DirectLineならSDKやらがない言語でも単純なHTTPのやり取りで会話できるのでGoとかJavaとかでやりたかったらこれを使う方向で行きましょう