Microsoft TeamsはMicrosoftの提供するチャットツールです。ビジネス界隈で利用が広がっています。他のチャットサービスと同様に、他社のサービスと簡単に連携できます。今回はMicrosoft Teamsと連携できるQualityForward用ボットを作成してみました。
利用するAPIについて
Microsoft Teamsのボットは5秒以内にレスポンスを返さないといけないという縛りがあります。Web APIを何度も叩いていると5秒以内にレスポンスが返せない可能性があるので、以前作成したGoogle Apps Script上で動作するWeb APIを利用します。
QualityForwardのテスト集計を返すSlackコマンドを作ってみた - Qiita
このWeb APIであればGoogle Apps Scriptを呼び出すだけなので処理は高速になります。ただし、Google Apps Scriptのリダイレクトする仕組みではMicrosoft Teamsのボットがうまくレスポンスを受け取れませんでした。そのため、直接Google Apps Scriptを呼び出すのではなく、Node.jsサーバ(今回はGlitchを利用)から呼び出す方式にしています。
ボットについて
Microsoft Teamsのボットは簡単に作成できます。今回はWebhookを利用しています。Webhookはあらかじめ作成したボットに対してメッセージを送ると、指定したURLへPOSTメソッドを投げてくれます。レスポンスで返したJSONをボットからの返信として表示してくれます。
コードについて
Node.js(Express利用)のコードは次のようになります。Google Apps Script上で作成しているAPIを実行し、そのレスポンスを返しているだけです。
const express = require("express");
const app = express();
// POSTのボディ解析用
app.use(express.json())
app.use(express.urlencoded({ extended: true }));
// HTTPクライアントw追加
const client = require('superagent');
app.use(express.static("public"));
app.get("/", (request, response) => {
response.sendFile(__dirname + "/views/index.html");
});
// ボットからデータを受け取る処理
app.post("/post", async (request, response) => {
// メッセージ内にある日付部分を取得
const date = request.body.text.replace(/^.*?<\/at>(.*)\n.*/s, "$1");
// Google Apps ScriptのAPIを呼び出し
const url = `https://script.google.com/macros/s/AKf...IGt/exec?text=${date}`;
const res = await client.get(url)
// レスポンスを返す
response.json({
"type": "message",
"text": res.text
});
});
const listener = app.listen(process.env.PORT, () => {
console.log("Your app is listening on port " + listener.address().port);
});
これでボットに対して日付を送ると、その日付における処理件数を返してくれるようになりました。
まとめ
今回の仕組みは自前のサーバを立てることなく、サーバレスで構築しています。GlitchもGoogle Apps Scriptも安定していますので、メンテナンス不要で動作できる仕組みは便利です。Microsoft Teamsで情報共有しているプロジェクトでは、この仕組みを試してみてください。