HUSKING - kotteri

技術系Note

【C#】Yahoo雑談対話APIを試してみる

コンソール上で雑談会話APIと会話してみる

Yahoo雑談会話APIの利用登録

1. docomoデベロッパーサイトへ行き、新規登録をする

dev.smt.docomo.ne.jp
ちなみに自分はGoogleアカウントで登録

2. 利用申請

マイページより[API利用申請・管理] > [新規API利用申請へ]

3. アプリケーション登録をする。以下、主な設定値。

  • アプリケーション名:任意
  • アプリケーション概要:任意
  • サービス開始日:任意
  • アプリケーションタイプ:ネイティブアプリケーション
  • 提供者名:任意
  • サポートメールアドレス:登録したGoogleアカウントGmail(書式だけあってれば存在しないメールアドレスでも可)

4. API機能選択

雑談対話にチェックを入れて[次へ] > [利用申請する]

5. 登録完了

すぐに登録が完了。マイページより[API利用申請・管理]で登録内容(API keyなど)を確認できる

実装

1. リクエスト用のデータクラスを生成

APIとのやり取りはJSONで行う。以下を参考にデータクラスを作成
husk.hatenablog.com

using System.Runtime.Serialization;
 
namespace ConsoleApplication1
{
    [DataContract]
    class RequestData
    {
        [DataMember]
        public string utt { get; set; }
        [DataMember]
        public string context { get; set; }
        [DataMember]
        public string nickname { get; set; }
        [DataMember]
        public string nickname_y { get; set; }
        [DataMember]
        public string sex { get; set; }
        [DataMember]
        public string bloodtype { get; set; }
        [DataMember]
        public string birthdateY { get; set; }
        [DataMember]
        public string birthdateM { get; set; }
        [DataMember]
        public string birthdateD { get; set; }
        [DataMember]
        public string age { get; set; }
        [DataMember]
        public string constellations { get; set; }
        [DataMember]
        public string place { get; set; }
 
        [DataMember]
        public string mode { get; set; }
        [DataMember]
        public string t { get; set; }
    }
}

2. APIからのレスポンスを格納するデータクラスを作成

using System.Runtime.Serialization;

namespace ConsoleApplication1
{
    [DataContract]
    class ResponseData
    {
        [DataMember]
        public string utt { get; set; }
        [DataMember]
        public string yomi { get; set; }
        [DataMember]
        public string mode { get; set; }
        [DataMember]
        public string da { get; set; }
        [DataMember]
        public string context { get; set; }
    }
}

3. APIへリクエストを投げる用のメソッドを作成

以下を参考
husk.hatenablog.com

private async Task<string> getRequest(string url, string message)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
            
            // リクエストデータを生成(必要最低限だけ)
            RequestData reqData = new RequestData();
            reqData.utt = message;
            reqData.mode = "dialog";
            string json = JsonUtils.ToJson(reqData);
            request.Content = new StringContent(json, Encoding.UTF8, "application/json");
            var response = await client.SendAsync(request);
            return await response.Content.ReadAsStringAsync();
        }
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

実際に試す

static void Main(string[] args)
{
    string url = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=";
    string key = "取得したAPIKEY";
    url += key;

    do
    {
        string input = Console.ReadLine();
        if (!string.IsNullOrEmpty(input))
        {
            if (input.Equals("exit"))
            {
                break;
            }
            getRequest(url, input).ContinueWith(
                (task) =>
                {
                    string json = task.Result;
                    ResponseData resData = JsonUtils.ToObject<ResponseData>(json);
                    Console.Write(">> ");
                    Console.WriteLine(resData.utt);
                    contextId = resData.context;
                });
        }
    } while (true);
    Console.WriteLine("\nStopped..");
    Console.ReadLine();
}

コンソール出力

>>の箇所がAPIからの返事

こんにちは
>> やぁ