開発の経緯
大学で行われる定期ミーティング。組織のメンバのグループ分けを手動で名札を並び替えて行っていた。しかし、毎週手動で行うのは負担が大きく、毎年度名札を作り増すのは更に負担だった。そこで、メンバが使い慣れているLINEを用いてグループ分けシステムを開発した。設計の前に
上で書いたグループ分けの機能を実装するにあたって、欠席メンバの特定が必要なことに気が付いた。なぜなら、在籍メンバの集合から欠席メンバの集合を引いた差が出席予定のメンバの集合となるからである。そこで今回は、「グループ作成機能」と「欠席管理機能」を併せて実装することにした。設計
上で書いたように、今回はメンバの使いやすさを重視してLINE上で使えるように設計する。調べてみると、LINEを用いた開発にはしばしばLINEmessagingAPIが用いられるようだ。LINEmessagingAPIとはユーザからのメッセージを取得及び任意のタイミングでメッセージを送信できるものらしい。よし、これでフロントエンドの問題は解決した。次はバックエンドをどうするか。少し調べるとGoogleAppScriptなるものを見つけた。このサイトは自身でサーバを設けなくてもGoogleAppScriptによって書かれたスクリプトが実行できるサービスを提供している。しかもLINEmessagingAPIにも対応している!では、データの保存をどうするか。GoogleAppScriptからはspreadsheetの操作が容易らしいのでそこに記録することにする。
大まかなフロー
ここでは簡単にOrdered Listで書くことにする。- 公式アカウントにメッセージを送信する
- メッセージによって処理を条件分岐する
- リプライメッセージを設定して返信する
LINEmessagineAPI
下のコードはLINEmessagingAPIを用いてLINEからメッセージを受け取り、リプライを送信する最も簡単なフレームである。
function doPost(e){
let data = JSON.parse(e.postData.contents);
let events = data.events;
for(let i = 0; i < events.length; i++){
let event = events[i];
if(event.type == 'message'){
//メッセージが送信されたときの処理
let return_text = "ACK";
contents = {
// event.replyToken は受信したメッセージに含まれる応答トークン
replyToken: event.replyToken,
messages: [{ type: 'text', text: return_text }],
};
reply(contents);
}
}
function reply(contents){
let channelAccessToken = YOUR_ACCESS_TOKEN;
let replyUrl = "https://api.line.me/v2/bot/message/reply";
let options = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + channelAccessToken
},
payload: JSON.stringify(contents)
};
UrlFetchApp.fetch(replyUrl, options);
}
>MessagingAPIのイベントタイプ
イベントタイプには以下のものがある。- message : メッセージ全般の送信イベント
- follow:フォロー(友達登録 / ブロック解除)イベント
- unfollow:アンフォロー(ブロック)イベント
- unsend:送信取り消しイベント
- text:テキストメッセージの送信イベント
- image:画像送信イベント
- movie:動画送信イベント