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 のバージョンで動作を確認しています。