ごった煮

色々な事を書いてます

DirectLineの新しい会話を始める

DirectLineでのBotとの会話中に、現在の会話とは別スレッドの会話を同じBotと別途始める方法についてです。

初めに

別スレッドでの会話を行う場合、認証トークンの再取得が必要ですが、DirectLine用の最初のトークンを引き回すと会話がリセットされるので、新規に認証トークンの生成が必要になります。

この操作もREST APIを呼び出します。

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

APIの仕様

以下APIの仕様です

レスポンス内容

レスポンス内容は、DirectLine用の新しい認証トークンがそのまま落ちてきます。

コード例

C#

C#だと以下のような感じです

        private static async Task StartNewConversation(string conversationId, string token)
        {
            var httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(baseUrl);
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", directLineAuthToken);

        var response = await httpClient.PostAsync("api/tokens/conversation", new FormUrlEncodedContent(new SortedDictionary<string  , string>()));
        var json = await response.Content.ReadAsStringAsync();

        return json.Replace('&#x5c;&#x5c;', ' ').Replace('"', ' ').Trim();
    }

Go

Goだと以下のような感じです

func StartNewConversation(token string, conversationID string) string {
    client := &http.Client{}
    values := url.Values{}
    
    req, _ := http.NewRequest("POST", "https://directline.botframework.com/api/tokens/conversation", strings.NewReader(values.Encode()))
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Content-length", "0")
    req.Header.Add("Authorization", "Botconnector DirectLineToken")
    res, _ := client.Do(req)
    body, _ := ioutil.ReadAll(res.Body)
    defer res.Body.Close()
    
    fmt.Println(string(body))
    return string(body)
}

まとめ

同時進行で別会話を実行する必要性がよくわからないですがこういうこともできるよっていうことで頭の片隅にあるといつかいいことがあるかもです。