Cisco Webex Messagingとcybozu.comでユーザー連結を行う

目次

caution
警告

記事内で利用しているライブラリ「 request-promise (External link) 」は、非推奨(deprecated)になりました。
HTTPリクエストができる他のライブラリ( axios (External link) など)や、 https.requst (External link) に書き換えることをおすすめします。

はじめに

Cisco Webex MessagingからGaroonスケジュールを予約する に引き続き、Cisco Webex Messagingとcybozu.comの連携シリーズ第2弾です。

今回紹介するのは、Cisco Webex Messagingとcybozu.comでユーザー情報を紐づけする方法です。
この技術を応用すると、たとえば以下のようなことが可能になります。

  • Cisco Webex Messagingに投稿したメッセージを、作成者を投稿者のユーザーでkintoneにレコードを登録する。
  • Cisco Webex Messagingに自分自身のGaroonのスケジュールを表示する。

システム概念図

Cisco Webex MessagingからGaroonスケジュールを予約する と同様に、今回もAWS Lambdaを利用して連携します。
Cisco Webex Messagingでは会議室に投稿したユーザーの情報を取得して、Cisco Webex Messagingとcybozu.com双方で、ユーザー情報を紐づけることができます。

たとえば、Cisco Webex MessagingとCybozu.com双方でユーザーのメールアドレスを同一にした場合、メッセージの投稿時、メールアドレスをキーにしてユーザーを検索できます。

下準備(メールアドレスをキーにする場合)

Cisco Webex Messaging

  • 会議室にメッセージを投稿するためのユーザーを用意してください(★)
  • Cisco Webex Messaging上に結果を表示するためのbot用のアカウントを1つ用意してください。
  • 専用の会議室を1つ用意してください。
  • Cisco Webex MessagingのAPI情報は Access the Webex API (External link) を参考にしてください。

Cybozu.com

  • (★)と同じメールアドレスをもつユーザーを用意してください。
  • 上記とは別にAPI実行用のユーザーを1つ用意してください。
    API実行用のユーザーはCybozu.comのシステム管理権限が必要です。

Node.jsのJavaScriptファイル

  • 後述の index.jsの内容をコピーして配置してください。
  • request-promiseを使用していますので、必要に応じてnpm installでインストールしてください。

環境を作成する

アップロード用Zipファイルの作成

index.jsを開いて、以下の項目を記入して保存します。

14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Cisco Webex Messagingの会議室のID
const ROOMID = 'xxxxxxxx';

// Cisco Webex MessagingのbotアカウントのAccess Token
const BEARER = 'xxxxxxxx';

// API実行用のユーザー(「ログイン名:パスワード」をBASE64エンコードしたもの)
const CYBZOU_AUTH = 'xxxxxxxx';

// cybozu.comのドメイン
const DOMAIN = 'https://{subdomain}.cybozu.com';

// Cisco Webex Messagingのbotアカウントのメールアドレス
const SPARK_MADDRESS = 'xxxxxxx@xxx.xxx';
項目 設定値
ROOMID Cisco Webex Messagingの会議室のID
Get Room Details (External link) で該当する会議室のIDを確認できます。
BEARER Cisco Webex MessagingのbotアカウントのAccess Token
webex for Developers (External link) でログイン後に右上のユーザーのアイコンをクリックすると表示されます。

【補足】
OAuth 2.0を利用した認証も可能です。複数のアカウントに関連する操作を行いたい場合や、APIへのアクセス権を制限したい場合などには、OAuth 2.0を利用する必要があります。詳細は、 Authentication (External link) を参照ください。
CYBOZU_AUTH cybozu.comのAPI実行用のユーザーのログイン名とパスワードです。
「ログイン名:パスワード」をBASE64エンコードしたものを入力してください。
DOMAIN kintoneのドメイン
SPARK_MADDRESS Cisco Webex Messagingのbotアカウントのメールアドレス

入力したら、以下のコマンドでzipファイルを作成します。
zipファイルの名前は、getPostingUser.zipとします。

1
zip -r getPostingUser.zip index.js node_modules/

AWSの設定(Lambda,API Gateway)

AWSLambdaAPI Gateway を設定します。
詳細については AWSの設定(Lambda,  API Gateway) を参考にしてください。

確認する

Cisco Webex Messagingの会議室から実際に確認してみましょう。

warning
注意

botアカウントで確認した場合、プログラムは作動しません。

Cisco Webex Messagingから「こんにちは」と入力します。

数秒待つとbotが投稿内容、e-mail、Cybozu.comのログイン名、表示名を返します。
たしかに、Cisco Webex MessagingとCybozu.comでユーザー連携が行われているとわかりました。

応用編

今回は、メールアドレスでユーザーを連結しましたが、Cisco Webex MessagingのDisplay NameとCybozu.comのログイン名で連結させることも可能です。

JavaScript

index.js

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * Cisco Webex Messaging sample program
 * Copyright (c) 2016 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
*/
(function() {

  'use strict';

  const rp = require('request-promise');

  // Cisco Webex Messagingの会議室のID
  const ROOMID = 'xxxxxxxx';

  // Cisco Webex MessagingのbotアカウントのAccess Token
  const BEARER = 'xxxxxxxx';

  // API実行用のユーザー(「ログイン名:パスワード」をBASE64エンコードしたもの)
  const CYBZOU_AUTH = 'xxxxxxxx';

  // cybozu.comのドメイン
  const DOMAIN = 'https://{subdomain}.cybozu.com';

  // Cisco Webex Messagingのbotアカウントのメールアドレス
  const SPARK_MADDRESS = 'xxxxxxxx@xxx.xxx';

  // Cisco Webex Messagingにレコードを登録
  function sendSpark(msg) {

    // Cisco Webex Messagingに投稿する内容
    const body_post_spark = {
      roomId: ROOMID, // 会議室
      text: msg // 投稿内容
    };

    // Cisco Webex Messagingに投稿するためのオブジェクト
    const postspark = {
      url: 'https://api.ciscospark.com/v1/messages/',
      method: 'POST',
      auth: {bearer: BEARER},
      'Content-Type': 'multipart/form-data',
      json: body_post_spark
    };

    // 投稿を実行する
    rp(postspark).then((res) => {
      console.log('投稿されました:' + msg);
    });
  }

  // cybozu.comのユーザー情報を取得する
  function getUser() {
    const objUser = {};

    const objGetUser = {
      url: DOMAIN + '/v1/users.json',
      headers: {'X-Cybozu-Authorization': CYBZOU_AUTH},
      method: 'GET',
      'Content-Type': 'application/json'
    };

    // ユーザー情報の取得を実行する
    return rp(objGetUser).then((res) => {
      const resUser = JSON.parse(res);
      // 取得したユーザー情報をオブジェクトに格納する
      for (let i = 0; i < resUser.users.length; i += 1) {
        objUser[resUser.users[i].email] = {code: resUser.users[i].code,
          name: resUser.users[i].name};
      }
      return objUser;
    });
  }

  // Cisco Webex Messagingの投稿者とe-mailが一致する .comのユーザー情報を取得する
  function getPostingUser(email) {
    // .comからユーザー情報を取得する
    return getUser().then((rtnUser) => {
      if (!(rtnUser[email])) {
        throw Error('cybozu.com上に該当するユーザーが見つかりませんでした');
      }
      // Cisco Webex Messagingの投稿者とe-mailが一致するユーザー情報を返す
      return rtnUser[email];
    });
  }

  function allocation(str, email) {

    // ユーザー情報を取得する
    return getPostingUser(email).then((rtnUser) => {
      sendSpark('投稿内容: ' + str + '\n' + // 投稿した内容
                      'e-mail: ' + email + '\n' + // e-mail
                      'ログイン名: ' + rtnUser.code + '\n' + // .comのユーザーのログイン名
                      '表示名: ' + rtnUser.name + '\n'); // .comのユーザーの漢字氏名

      // エラーが発生した場合
    }).catch((err) => {
      sendSpark('Error: ' + err.message);
    });
  }

  // Webhookを受けた際の処理
  exports.handler = function(event, context) {
    console.log('start');
    // event.data.idで投稿されたメッセージのidを取得できる
    // idを利用してメッセージの詳細を取得する
    console.log('message id:' + event.data.id);
    const getmessage = {
      url: 'https://api.ciscospark.com/v1/messages/' + event.data.id,
      method: 'GET',
      auth: {bearer: BEARER},
      'Content-Type': 'application/json'
    };

    // メッセージの詳細の取得を実行する
    rp(getmessage).then((body) => {
      const objbody = JSON.parse(body);
      console.log('message body:' + objbody);

      // Cisco Webex Messaging実行ユーザーからのメッセージの場合は、処理しない(無限ループを防ぐ)
      if (objbody.personEmail === SPARK_MADDRESS) {
        return;
      }
      // メッセージの本文を解析する
      allocation(objbody.text, objbody.personEmail);
    });
  };

  // zip作成時のコマンド
  // zip -r getPostingUser.zip index.js node_modules/

})();
information

このTipsは、2016年6月の段階のCisco Webex Messagingのバージョンで動作を確認しています。