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/
})();
|