システム連携ネタでよくブログを書いている日下です。
※ちなみにこれまでのネタはこちら
さて今回の連携相手は LINE です。
もともと LINE の bot を Questetra で作れるだろうか?と思って調べ始めたのですが、Questetra 単体ではできない部分や処理速度の問題などがあったりして、なんとか動くものはできたのですが bot はやめました・・・(詳しくは後述します)
bot はやめたのですが、Questetra からユーザやグループを指定して LINE へメッセージ投稿することは実現できたので、処理の完了等の通知に使えそうです。
※そういった SNS への通知連携について、他のサービスであれば、slack との連携はいくつか事例を聞いています。Chatwork との連携は事例を聞いたことはないのですが技術的に可能であることは検証済です。
これまでにお客様から LINE と連携できる?と聞かれたことは、まだ多くはないですが、何度かありました。
LINE の強みは一般利用者のすそ野が広くてツールの教育コストが低いことですので、その LINE のビジネス版である Works Mobile がこれからどのように広がるか気になるところです。
ということで LINE との連携について説明します。
2: LINE の設定
3: Questetra の設定
4: さて、なぜ bot をやめたのか・・・
5: まとめ
1: LINE と Questetra の連携の仕組み
以下の図のようなイメージで、LINE API の仕様に沿って認証を通して http リクエストを送るだけです。
※LINE の API 仕様はこちら
2: LINE の設定
以下のページの 1. ~ 3. を参考にするとカンタンに設定できました。
「わずか5分。新LINE Messaging APIでbotを作ってみた手順全公開」
3: Questetra の設定
http リクエストを送るということで「メッセージ送信中間イベント(HTTP)」を使おうと思ったのですが、認証を通すために http ヘッダ の Authorization Bearer に LINE のアクセストークンを設定する必要があったため、「メッセージ送信中間イベント(HTTP)」ではできませんでした。「スクリプトタスク」なら対応可能ですので、そちらを使いました。
※「スクリプトタスク」については以下をご覧ください。
M230: 業務データの複雑なデータ加工が自動実行されるように設定する(ECMAスクリプト)
「スクリプトタスク」のスクリプトサンプルは以下。さきほど触れた bearer の部分がポイントでしょうか。もし LINE 以外との連携でも bearer への設定が必要な場合にはこの方法が使えます。
var token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//LINE の管理画面から取得したアクセストークン
var json = data.get("0");//LINE に送付する JSON 形式のデータ
var response = httpClient.begin()
.bearer(token)
.body(json, "application/json")
.post("https://api.line.me/v2/bot/message/push");
var code = response.getStatusCode() + "";
var text = response.getResponseAsString() + "";
retVal.put("3", code); //処理結果を格納
retVal.put("1", text); //処理結果を格納
LINE に送る JSON 形式のデータは以下。
{
"to": "(投稿先の id)",
"messages":[
{
"type":"text",
"text":"(投稿するメッセージ)"
}
]
}
上記の「投稿先の id」を調べるのがちょっとめんどうでした。LINE のメッセージ投稿時に Webhook を受けられるように準備しておいて、その http リクエストの内容から抜き出す必要があります(もっと他に楽な方法があるのかもしれませんので、知っている方は教えてください)。ですので、その部分は後述の Google Apps Script 等で作るアダプタプログラムのようなものが必要になります。
4: さて、なぜ bot をやめたのか・・・
まずひっかかったのが『LINE からの Webhook を直接 Questetra で受けることができない』という点でした。
LINE から送られる http リクエストの形は決まったものになります。Questetra が受けられる http リクエスト(「メッセージ開始イベント(HTTP)」での受信)の形もある程度決まったものとなり、それを LINE の仕様にあわせることができませんでした。ということで、ここはアダプタプログラムをはさむことで対応しました。
実際には LINE からの http リクエストを一旦 Google Apps Script(GAS)で受けて、そこで加工して Questetra にとばす方法で実現しました。
※アダプタプログラムは heroku や AWS Lambda + API Gatway でも構わないです。単に私が Google Apps Script を使い慣れているだけですので
※ちなみに「メッセージ開始イベント(HTTP)」については以下をご覧ください。
M221: 特定URIにHTTPリクエストがあった時に自動的に開始されるように設定する
以下のバージョンアップにより Webhook を直接受け取ることができるようになりました。
ただ、どうしようもなかったのが『リプライが遅い』という点でした。
以下のような仕組み・モデルにしたのですが、リプライに20秒ぐらいかかってしまいました・・・リプライでそれだけ時間がかかるとなると bot としてはダメ、ということでやめました。
ちなみにモデル図は以下(手動開始の部分はテスト用なのでなくてもいいです)。
GAS のサンプルコードは以下。LINE からの http リクエストを受けて replyToken 等の必要なデータを抜き出して Questetra に送っています。
※パラメータを指定する部分で「&q_reply_token=」「&q_message=」とフィールド名を使っている部分は、「&data[0].input=」といった標準の指定方法でも問題ありません。
var SHEET_ID = "xxxxxxxxxxxxxxxxxxxx"; //Google Spreadsheet の id を入れる
var SHEET_NAME_LOG = "logs"; //あらかじめ「logs」シートを準備しておく
var QBPMS_URL = "https://xxxxx.questetra.net/System/Event/MessageStart/start"; //Questetra の環境にあわせる
var QBPMS_PROCESS_MODEL_INFO_ID = "999"; //Questetra のプロセスモデルにあわせる
var QBPMS_NODE_NUMBER = "0"; //Questetra のプロセスモデルにあわせる
var QBPMS_KEY = "xxxxxxxxxx"; //Questetra の環境にあわせる
function doGet(e) {
return receive_(e);
}
function doPost(e) {
return receive_(e);
}
/**
* 受信したhttpリクエスト処理
*/
function receive_(e) {
var sheet_log = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_LOG);
//httpリクエスト受信のログ出力
sheet_log.appendRow([ logDate(), "receive" ]);
sheet_log.appendRow([ logDate(), "JSON.stringify(e):\n" + JSON.stringify(e) ]);
var receiveJson = JSON.parse(e.postData.contents);
var replyToken = receiveJson.events[0].replyToken;
var message = receiveJson.events[0].message.text;
sheet_log.appendRow([ logDate(), "replyToken:\n" + replyToken ]);
sheet_log.appendRow([ logDate(), "message:\n" + message ]);
var url = QBPMS_URL;
var payload = 'processModelInfoId=' + QBPMS_PROCESS_MODEL_INFO_ID
+ '&nodeNumber=' + QBPMS_NODE_NUMBER
+ '&key=' + QBPMS_KEY
+ '&q_reply_token=' + replyToken
+ '&q_message=' + message;
sheet_log.appendRow([ logDate(), "payload:\n" + payload ]);
var options = {
"method" : 'post',
"payload" : payload
};
var response = UrlFetchApp.fetch(url, options);
sheet_log.appendRow([ logDate(), "response:\n" + response.getContentText() ]);
return HtmlService.createHtmlOutput();
}
/**
* ログ出力用の日時文字列作成
*/
function logDate() {
return Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd HH:mm:ss");
}
「スクリプトタスク」の json データ生成スクリプトサンプルは以下。この bot はオウム返しさせるだけにしましたので、受けたメッセージをそのまま投稿メッセージとして入れてます。
※パラメータを指定する部分で「data.get(“0”)」といった標準の指定方法を使っている部分は、「data.get(“q_reply_token”)」とフィールド名を使っても問題ありません。
var replyToken = data.get("0") + ""; //リプライトークン
var message = data.get("1") + ""; //投稿するメッセージ
var jsonObj = {
"replyToken":"xxx",
"messages":[]
};
var jsonObj2 = {
"type":"text",
"text":"xxx"
};
jsonObj2.text = message;
jsonObj.replyToken = replyToken;
jsonObj.messages[0] = jsonObj2;
var jsonText = JSON.stringify(jsonObj);
retVal.put("3", jsonText);
「スクリプトタスク」の http 送付スクリプトサンプルは以下。
var token = data.get("2"); //LINE の管理画面から取得したアクセストークン
var json = data.get("3"); //LINE に送付する JSON 形式のデータ
var response = httpClient.begin()
.bearer(token)
.body(json, "application/json")
.post("https://api.line.me/v2/bot/message/reply");
var code = response.getStatusCode() + "";
var response = response.getResponseAsString() + "";
retVal.put("4", code); //処理結果を格納
retVal.put("5", response); //処理結果を格納
5: まとめ
ということで、少し脱線もしましたが、今回説明した方法で、例えば『お客様からセミナー申込があったら LINE に通知が入る』といったことが実現できます。
何を通知のトリガにするかは Questetra でのプロセスモデル設計次第ですので、『受注が発生したら LINE に通知が入る』、『トラブル対応が完了したら LINE に通知が入る』といったことも可能です。
また、他の連携ケースとしては、上記の Webhook を受けるアダプタプログラムが必要になりますが、『LINE に特定のキーワードを含む投稿があったらプロセスを開始する』といったことも可能です。例えば『「名刺不足」というキーワードを含む投稿があったら名刺の発注プロセスが起動する』といった感じでしょうか。
もしご質問等がありましたら、お問い合わせフォームからご連絡ください。