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
を参考にしてください。
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
で該当する会議室のID を確認できます。 |
BEARER |
Cisco Webex Messaging の bot アカウントの Access Token
webex for Developers
でログイン後に右上のユーザーのアイコンをクリックすると表示されます。
【補足】 OAuth 2.0を利用した認証も可能です。複数のアカウントに関連する操作を行いたい場合や、API へのアクセス権を制限したい場合などには、OAuth 2.0を利用する必要があります。詳細は、
Authentication
を参照ください。 |
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)
固定リンクがコピーされました
AWS の Lambda と API Gateway を設定します。
詳細については
AWS の設定(Lambda, API Gateway) を参考にしてください。
Cisco Webex Messaging の会議室から実際に確認してみましょう。
注意
bot アカウントで確認した場合、プログラムは作動しません。
Cisco Webex Messaging から「こんにちは」と入力します。
数秒待つと bot が投稿内容、e-mail、Cybozu.com のログイン名、表示名を返します。
たしかに、Cisco Webex Messaging と Cybozu.com でユーザー連携が行われているとわかりました。
今回は、メールアドレスでユーザーを連結しましたが、Cisco Webex Messaging の Display Name と Cybozu.com のログイン名で連結させることも可能です。
JavaScript
固定リンクがコピーされました
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/
})();
|