きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

C# の自作アプリからHipChatのルームにメッセージを投稿する

先日に続きHipChatネタ。

HipChatのサイトやドキュメントをつらつら見ていると、APIで結構いろいろな操作ができるっぽいというかブラウザやクライアントアプリからできる大半の操作はできそうな勢いなことを知りました*1

HipChat REST API Version 2 Documentation

そしてここを見ていると純正/サードパーティー製入り混じりつつも各言語向けのSDKというかラッパーというかがリストアップされていて、その中には.NET向けのものもありました。今回はその一つ、Hipchat-CSを利用してHipChatの特定のルームにメッセージを投稿するサンプルを、ASP.NET MVCで軽く作って試してみました*2

 

Hipchat-CS とは

先ほど説明したように、.NET向けのHipChatのAPIのラッパーです。現在の最新?である、HipChat REST API version 2に対応しています。 ソースはGithubにあります。MITライセンスを採用したオープンソースプロジェクトである模様です。

KyleGobel/Hipchat-CS · GitHub

使い方も簡単そうだし、ぱっと見では私が使いたいAPIは一通り実装されていそうなので(全部終わってる?)これを試してみることにしました。

 

Hipchat-CS の導入

導入はNuGet一発でさくっと入ります。GUIから検索してインストールするか、パッケージマネージャーコンソールで下記のコマンドでインストールしましょう。

PM> Install-Package Hipchat-CS

 

APIトークンの準備

まずHipChatのAPIアクセスに必要なtokenを入手しましょう。 1. https://www.hipchat.com/ でサインイン 2. Account settings -> API access にアクセス 3. token未作成の場合は作成する 4. 作成されているtokenをコピーする(auth_token=の後ろの文字)

先日の エントリ でも一部キャプチャ付きで紹介しているので、よかったらそちらも参考に。

 

Web.Configにtokenを設定

先ほど準備したtokenをWeb.Configに設定します。 configuration/appSettings に、hipchat_auth_tokenというkeyでエントリを追加し、valueに先ほどのtokenを設定します。 もしtokenが0123456789abcdefghijklmn なら以下のようになります

<configuration>
  <appSettings>
    <!-- HipChat API Token-->
    <add key="hipchat_auth_token" value="0123456789abcdefghijklmn" />

なお、クライアントアプリケーションやコンソールアプリケーションの場合はApp.configのappSettingsセクションに同様に設定します。またappSettingsを利用しない場合でも、後述するライブラリのコンストラクタで文字列としてtokenを渡して設定することも可能です。

 

 

ルームを列挙する処理の作成

さっそくメッセージを投稿したい……のですが、メッセージを投稿するには投稿先のroomを指定する必要があります。つまり、投稿先のroomを識別する何らかのキーが必要になります。 APIおよびHipchat-CSでは、設定されたtokenで選択可能なroomを列挙する機能があります。まずはこれを利用してroomを列挙し、ドロップダウンリストにバインドして画面で選択できるように実装したいと思います。

適当にコントローラを作成し、Actionメソッドで以下のような実装を行ってみました。

public ActionResult Index()
{
  // Hipchat-CSのHipchatClientクラス
  var client = new HipchatClient();

  // 設定したtokenでアクセス権のあるroomを列挙
  var rooms = client.GetAllRooms();

  // 列挙されたルーム一覧を利用してDromDownListを作成するためのに、SelectListを作成
  var selectList = new SelectList(rooms.Items, "Id", "Name");

  ViewBag.room = selectList; 
  return View();
}

ポイントはHipchatClientのインスタンスを作成し、GetAllRooms()メソッドで一覧を取得しているところです。この中に一覧が入っていて、roomのidが格納されています。このidを利用して、roomに対して処理を行っていくことになります。

 

メッセージを投稿する処理

このまま、メッセージを投稿する処理を作っておきます。 別のアクションメソッドを作成し、処理をやらせましょう。アクションメソッドの引数は、投稿するメッセージ文字列と投稿先のルームのidにしてみました。

[HttpPost]
public ActionResult PostMesasge(string message, int room)
{
  var client = new HipchatClient();

  // 投稿する内容・属性をリクエストとして作成
  var request = new SendRoomNotificationRequest()
  {
    Message = message,
    MessageFormat = HipchatMessageFormat.Text,
    Notify = true,
    Color = RoomColors.Purple
  };

  // ルームにメッセージ(Notification)を投稿
  client.SendNotification(room, request);

  return RedirectToAction("Index");
}

ポイントは - 投稿する内容をリクエストの形で作成 - ルームを指定してリクエストを送信する

まずは、SendRoomNotificationRequestクラスのインスタンスを生成し、投稿内容をここに組み立てます。 - Messageには投稿したいメッセージ本文を設定 - MessageFormat ではプレーンテキストかHTMLかを指定 - Notify 通知を行うかどうかをbool値で指定(…とあるけどWebクライアントだと挙動の違いがわかりませんでした) - Color メッセージの色(背景色)を選択

その後はSendNotificationでroomを指定してリクエストを送信。簡単ですね

 

ビューのソース

最後に、一応、ビューのソースの抜粋を掲載しておきます(後ほどサンプルソース全体の置き場所も案内します)。特に注意点などはありませんが、Html.DropDownListはこういう書き方をするとViewBagに"room"と同じ名前のSelectListがあれば使ってくれる、という挙動を前提に書いていたります。

<body>
  <h1>HipChat API Sample</h1>
  <h2>Send Notification to HipChat</h2>
  @using (Html.BeginForm("PostMesasge", "Home", FormMethod.Post))
  {
    <dl>
      <dt>room</dt>
      <dd>@Html.DropDownList("room")</dd>
      <dt>message</dt>
      <dd><input type="text" name="message" value="" /></dd>
    </dl>
    <input type="submit" value="Send Notification to HipChat" />
  }

</body>

 

まとめ

とりあえずroomの列挙とメッセージ(Notification)の投稿だけ試してみました。が、必要最低限のことをシンプルに書くだけで機能が実装できるので素敵な感じがしています。もっといろいろ…というか結構なんでもできそうな予感。

今回のサンプルは例によってGitHubに置いています。

kiyokura/HipChatPostSample · GitHub

*1:ドキュメントは斜め読みなのでどこまでできるのかはちゃんとは把握できていません

*2:特にASP.NET MVCである必然性はありません。コンソールアプリとかでもよかった……わけですが、GUI付きでさくっと試したかった程度の理由です。