LINEのBOTで実験の声かけしてみる
やりたいこと
1時間の実験中に被験者に声をかけます。被験者にはLINEで「開始します」と投稿してもらいます。”開始”というホットワードが入っていれば実験スタートとします。実験は1時間。その間に5回の声かけを行います。声かけの間隔は7分以上でランダムにします。
+00分 最初の声かけ、「では実験を始めてください。」
+09分 最初の声かけ、「順調ですか?」
+21分 2番目の声かけ、「その調子です。」
+32分 3番目の声かけ、「良いペースです。」
+43分 4番目の声かけ、「もう少しです。」
+50分 5番目の声かけ、「頑張ってください。」
+60分 最後の声かけ、「お疲れ様でした。」
LINEの開発者になる
被験者からのメッセージを受信し、メッセージを送信するので Messaging API が良さそうだとわかる。BOTのサンプルも開発者ドキュメントにある。
概要はこちら
https://developers.line.biz/ja/docs/messaging-api/overview/
ビジネスアカウントじゃなくても個人アカウントでもすぐに始められそう。
https://developers.line.biz/ja/services/messaging-api/
チャネルを作る
[LINE Developers]ページで[今すぐはじめよう]でスタート。
LINEにログインして[新規チャンネル作成]ページへ。
[チャンネルの種類]は"Messaging API"を選択し、項目を埋めていくだけだが、用語にちょっと戸惑った。プロバイダーはLINEで情報提供する企業のこと。チャネルはLINEで情報提供するアカウント(名前)のこと。一人の開発者が複数のプロバイダー(企業)を持ち、ひとつのプロバイダーが複数のチャンネル(アカウント)を持てる構造のようです。
埋めた項目は以下の通り。
「まめ1号」できました。作るときに必須項目ではなかったアイコンは LINE Official Account Manager という管理コンソールで設定できます。LINE Developersという管理コンソールとは別なのでちょっとややこしく感じました。どの情報がどちらなのか慣れないうちはワチャワチャします。
Messaging API の設定
LINE Developers コンソールの [Messaging API] タブでいくつか設定します。LINE Official Account Manager コンソールが新たに開くので自分がどちらにいるのか見失わないようにします。必須項目ではなかったプロフィール画像をLINE Official Account Managerコンソールでコーヒー豆のアイコンに変更して見ました。
QRコードを読み込んで友だち追加できることを確認します。成功すると自動メッセージが送信されます。
Webhookの設定は終わっていませんが、一旦終わってGoogle Apps Scriptの作業に移ります。あっちでWebhookで使うURLを発行してこちらに戻ってきます。
Google Apps Scriptを使う
通称 GAS(これでググれます)。Google のいろんなサービス(Gmail, Googleスプレッドシートとか)を自動化できる仕組みでプログラミング言語 JavaScriptに似てます。ウェブサービスにすることもできるので今回これを使ってBOTを作ります。
スプレッドシートを作る
スプレッドシートを作って名前をつけます。まめ1号にしましたがなんでも構いません。シートを1枚追加します。2つのシートにそれぞれ secret と log という名前に変更します。
BOTプログラムを作る
メニュー [拡張機能]-[Apps Script]でGASのプログラム用エディターが開きます。myFunction という関数がテンプレートで作られていますが不要なので1行目から3行目まで削除します。
下のプログラムをコピペします。
function getTokenZ() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("secret");
var token = sheet.getRange(1, 2).getValue();
Logger.log( token);
return token;
}
function logtest(){
logZ("my first log", "hello, world");
}
function logZ( uuu, xxx) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("log");
var timestamp = Utilities.formatDate( new Date(),'Asia/Tokyo', 'HH:mm:ss');
sheet.appendRow([timestamp, uuu, xxx]);
}
function postMessageZ( ttt, mmm) {
logZ( ttt, mmm)
const url = 'https://api.line.me/v2/bot/message/push';
const payload = {
to: ttt,
messages: [{
type: 'text',
text: mmm
}]
};
const params = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + getTokenZ()
},
payload: JSON.stringify(payload)
};
UrlFetchApp.fetch(url, params);
}
function randomSleepZ() {
Utilities.sleep( Math.random()*10000); // ミリ秒、10000ミリ秒=10秒、0〜10秒未満のランダム値
}
function doPost(e) {
let token = getTokenZ();
let json = JSON.parse(e.postData.contents);
let userId = json.events[0].source.userId;
let userMessage = json.events[0].message.text;
logZ( userId, userMessage);
if ( userMessage.match(/開始/)) {
postMessageZ( userId, "では実験を始めてください。");
randomSleepZ();
postMessageZ( userId, "順調ですか?");
randomSleepZ();
postMessageZ( userId, "その調子です。");
randomSleepZ();
postMessageZ( userId, "良いペースです。");
randomSleepZ();
postMessageZ( userId, "もう少しです。");
randomSleepZ();
postMessageZ( userId, "頑張ってください。");
randomSleepZ();
postMessageZ( userId, "お疲れ様でした。");
}
else {
postMessageZ( userId, "何?");
}
}
フロッピーディスクのアイコンを押してプログラムを保存します。ここで一旦 LINE Developersコンソールへ移動して、チャネルアクセストークンという情報を入手します。
チャネルアクセストークンを入手する
LINE Developersコンソールで先ほど作ったチャネル(まめ1号)の [Messaging API設定]タブを開きます。
チャネルアクセストークンを発行してもらいます。[発行]ボタンを押すと意味のない長い文字列が表示されます。それがチャネルアクセストークンです。
チャネルアクセストークン(下図の緑の枠)をコピーします。コピーは右側のコピーボタン(下図の赤の丸)を押します。
スプレッドシートに戻り、secret シートの1行目B列にコピーします。これが何の情報だったか忘れないように1行目A列に "トークン" と入力しておきます(必須ではありません。下図では入力していません)。
プログラムを動くようにする
GASはこのままでは動きません。スプレッドシートへアクセスする権限の設定をします。Apps Script のタブに移動し、getTokenZ になっていることを確認して(下図の緑の枠)、実行ボタン(下図の赤丸)を押します。
承認を求めてきます。この手順は最初の1回だけです。[権限を承認]します。
アカウントが複数ある場合はBOTプログラムを動かすアカウントを選択します。アカウントが1個だけならそのまま選択すればOK。
作ったプログラムは Googleにとっては初のプログラム(アプリ)なので確認されてないと警告を出すのは当然です。①の詳細を押し、②[無題のプロジェクト(安全でないページ)に移動] を押します。
これで最後です。プログラムがスプレッドシートにアクセスしようとしているけどいいですか?という質問なので [許可] します。
実行完了しチャネルアクセストークンが表示されていればOK。これでプログラムがスプレッドシートの情報を読み込むことができることが確認できました。
getTokenZ の右横の▼を押して①、logtest を選び②、実行ボタン③を押します。
スプレッドシートの log シートの1行目に my first log hello, world と記入されていればOK。これでプログラムがスプレッドシートに書き込めることが確認できました。
プログラムをデプロイする
プログラムが動くことが確認できました。このプログラムを外部から使えるようにすることをデプロイします。
Apps Scriptの [デプロイ] ボタンを押します。今回は初めてなので[新しいデプロイ]を選びます。
[設定]ボタン①を押して[ウェブアプリ]②を選びます。
[新しい説明文]は自分で区別がつけられれば構わないので何でも良いです。今回は「はじめてのデプロイ」としました。重要なのは [アクセスできるユーザー]の項目でデフォルトは[自分のみ]になっていますが、▲②を押して[全員]③を選択します(★)。
作ったBOTプログラムをアクセスするためのURLが発行されます。https://script.google.com/…. で始まるURLをLINEに設定するためにコピーします。
BOTプログラムを設定する
LINEで書き込みがあったときに外部のプログラムを呼び出す仕組み webhook を設定します。
webhookの設定
LINE Developersコンソールのチャネルの [Messaging API設定]のタブへ。
Webhook設定のWebhook URLの[編集]ボタンを押します。
先ほどコピーしたURLをペーストし[更新]ボタンを押します。
[Webhookの利用]というスライドスイッチが出現するのでオンにします。これでLINEにトークがあったときに自動的にGASで作ったプログラムにお知らせがくる仕組みができました。
Webhookの利用の設定は LINE Official Account Managerコンソールでも行うことができますが、普段は LINE Developersコンソールで操作した方が楽です。参考までに LINE Official Account Managerコンソールでの操作を簡単にメモしておきます。
動作確認
LINEとGASで作ったBOTプログラムが繋がったので動作確認して見ます。
何でもいいのですが hello と入力すると、まめ1号くんはツンデレちゃん風に素っ気なく「何?」と返します。
次に「開始しまーす」と入力します。ホットワード”開始”が入っていればなんでも構いません。すると今度はツンデレちゃんではなく「では実験を始めてください。」と返し、しばらくすると「順調ですか?」と返事してきます。
5回の声がけが行われ、最後に「お疲れ様でした」で終わります。
応答までの時間を変更する
サンプルプログラムでは声がけの応答までの時間をランダムで10秒にしていました。Math.random()関数は0から1未満のランダムな少数を発生させます。それを10000倍します。10000倍すると0から9999の値になります。Utilities.sleep()関数は指定された時間だけ動作を止めます。時間指定はミリ秒。10000は10000ミリ秒=10秒です。これでランダムで0から10秒の待ち時間が作れます。
待ち時間間隔10秒を1分に変更
1分にしたければこの10000を60000に変更すれば良いです。プログラムを変更①したらプログラムを保存②し、[デプロイ]③で[デプロイを管理]④を選びます。
鉛筆アイコン①を押し、[バージョン1 ] の▼②を押し、[新バージョン]③を選択し、[デプロイ]④します。
開始 6:15 から終了 6:18 まで3分に伸びました。基本はこれでできたので時間間隔を最低7分で5回の声がけで合計1時間にするための調整をしていきます。
問題発生
ところが、Utilities.sleep()では5分以上設定できないことがわかりました。GASでは5分以上の実行でタイムアウトしてしまうことがわかりました。別の記事で対策を練りたいと思います。
次号「まめ2号」へ続く。
この記事が気に入ったらサポートをしてみませんか?