Bot, Bot State Service, Graph API

Bot から Graph API を呼び出す

こんにちは、SecretaryBot を開発している A’ です!

前回の投稿で Masa さんが Bot に対して Azure AD への認証/認可を組み込む方法を紹介してくれました。この方法を正しく実装できていれば、ユーザーがサインインした際、取得した  Access Token が Bot State サービスに保存されるようになってます。今回は  Access Token を State サービスから取り出した後、Graph API を呼び出してみましょう。下記では Graph API および便利ツール (Graph Explorer) の紹介、そしてどのように Graph API を呼び出すのかを見ていきます!

Graph API とは

そもそも Graph API とは何なのでしょうか。Graph API とは、Office 365 を含めた Microsoft クラウドサービスのリソースにアクセスするための  API です。例えば、サインインしたユーザー自身のプロファイル、予定情報の取得、OneDrive for Business に保存されているファイルの一覧等が取得できます。その他に Graph API でどのようなことが実現できるのかは、このドキュメント をチェックしてみてください。

Graph Explorer

利用する API が確認できたら実際に試してみたいですよね。そんな時の便利ツールが Graph Explorer です。以下の画面ショットのように試したい Graph API の エンドポイントを指定するだけで、API を実際に呼ぶことができ、かつ JSON データを含んだレスポンスデータを確認できます。また [サインイン] を行うと、実際にサインインしたユーザーの Access Token を使って API の動作確認を行うこともでき、とても便利です。

graphexploreBot から Graph API を呼んでみよう

それでは Bot 内から Graph API を呼ぶサンプル コードを作っていきましょう。Graph API にはたくさんの種類が存在しますが、今回は このページ でも紹介されている以下の API を呼んでみます。

GET https://graph.microsoft.com/v1.0/me

上記 API  を呼ぶとサインインしたユーザーに関する情報を返してくれます。以下では返されたデータに含まれる “displayName” (表示名) の情報を利用した追加実装をAuthSample に施して行きたいと思います。

追加実装する機能

サインインした際に、従来の Main Menu Dialog にて、”What do you want to do, ‘displayNameの値’ ?” のように displayName の値をメッセージ内で表示できるようにします。前回までの AuthSample だと、Main Menu Dialog では、”What do you want to do?” しか表示できませんでした。

事前準備

前回の投稿を終わらせた状態で以下の実装手順に進んでください。

実装手順

完成したコードを確認されたい場合は、GitHub のサンプルコードをご確認ください。サンプルコードは前回の投稿で作った AuthSample に追加実装を行ったものです。以下では、AuthSample をベースにした変更手順を記載します。

1. Web.config の設定確認

前回の投稿からそのままこの手順に進まれた方は不要ですが、Web 上からサンプルを落としてきた場合、 web.config ファイルの以下の 2 つのパラメータの value に適切な値を設定して下さい。値の設定方法については、くどいですが、前回の投稿を確認してください。

 <add key="ActiveDirectory.ClientId" value="Insert your own Client ID" />   
 <add key="ActiveDirectory.ClientSecret" value="Insert your own Key" />

2. Model の追加

Graph API のレスポンスデータを受け取るための モデルを作成します。サンプルコードでは、Models フォルダを作成し、UserModel.cs ファイル内に以下を追加しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MultiDialogSample.Models
{
    public class UserModel
    {
        public string displayName { get; set; }
    }
}

3. ShowMainMenu メソッドの変更と新規メソッドの追加

Dialogs フォルダ内の、ShowMainmenu メソッドをコピーし、以下のコードに置き換えます。置き換えた時にエラーになる部分は警告に従って適時 namespace を追加してください。

private async Task ShowMainmenu(IDialogContext context)
{
    //Get access token from Bot State Service
    string token = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]);
    string firstName = await GetDisplayName(token);

    //Show menues
    PromptDialog.Choice(context, this.CallDialog, this.mainMenuList, $"What do you want to do, {firstName}?");
}

private async Task<string> GetDisplayName(string token)
{
    using (HttpClient httpClient = new HttpClient())
    {
        //Set Header Value
        var acceptHeader = new MediaTypeWithQualityHeaderValue("application/json");
        httpClient.DefaultRequestHeaders.Accept.Add(acceptHeader);
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

        HttpResponseMessage response = await httpClient.GetAsync($"https://graph.microsoft.com/v1.0/me/?$select=displayName");
        UserModel user = await response.Content.ReadAsAsync<UserModel>();
        return user.displayName;
    }
}

上記 4 行目では、State サービスに保存されている Access Token を取り出しています。その後、取得した Access Token を 5 行目の GetDisplayName() メソッドに渡しています。

GetDisplayName() メソッド内では、HttpClient のインスタンスを作り、Access Token を含めた必要な情報を Header に追加の上、Graph API エンドポイントに対して GET リクエストを行っています。その後正しく情報が取得できると、最終的には、displayName の情報が返されます。

手順は以上です。動作を確認してみましょう。Emulator からアクセスし、動作確認すると、サインイン直後に、以下のように displayName の値が表示されていれば成功です!

demo

いかがでしたでしょうか。Graph API も昔から比べると随分充実し多くの情報に API 経由でアクセスできるようになりました。是非 Bot からこれらの Graph API を呼び、皆さんの Bot もより便利なものにしてみてください!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中