はじめに
こんにちは、室蘭工業大学 Advent Calendar 2021の2日目担当のオオスミです。
私はLINEbotで自己肯定感上げbotを作りましたのでそれについて記事に書きました。
経緯
昔から自分でメッセージを送ったら返答が返る形のLINEbotを作りたいと考えていました。
自己肯定感上げbotにした経緯としては私自身気持ちが沈み込みやすい性格なのでbotと対話することで緩和できたらいいと思い作成しました。bot作成にGoogle Apps Scriptを選択した理由としては関数を使って、Webサーバーとしても利用することができるからです。さらにスプレッドシートやカレンダーなど、Googleのサービスとの連携も簡単に行うことができるのも決め手になりました。
事前に用意する物
- LINEアカウント
- Googleアカウント
LINE Developersの設定
まず「LINE Developers」にログインします。
「MessagingAPIをはじめる」を選択し、Bot用のアカウントを作成してください。
ボットのアカウントができたら、具体的に7つ設定を行います。
- ボット用のアカウントを友達登録
- アクセストークンを再発行
- webhookのURL(次の章で詳しく)
- 「Webhook」を「有効」
- 「ボットがグループチャットに参加できるようにする 」を「無効」
- 「メッセージの自動返信 」を「無効」
- 「あいさつメッセージ」を「無効」
これらを行えば基本的に設定完了です。
再発行したアクセストークンはGoogle Apps Scriptで使用しますので大切にメモしておいてください。
Google Apps Scriptでの設定
まずGoogleアカウントにログインします。
「Google Drive」→「新規」→「Google Apps Script」のようにを選択します。
以前LINE Developersで再発行したアクセストークンをつけます。
下記のコードを書いて「公開」→「ウェブアプリケーションとして導入」をおしてGoogle Apps Scriptとの連携を受理してwebhookのURLを入手する。そちらをLINE Developersで設定する。これらを行えば完全終了です。
デプロイしたものを再度修正したいときは「Project version」を「New」にし忘れないようにしてください。
var CHANNEL_ACCESS_TOKEN = 'アクセストークン';
function doPost(e) {
var replytoken= JSON.parse(e.postData.contents).events[0].replyToken;
if (typeof replytoken === 'undefined') {
return;
}
function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
var message=['かっこいい!','君がtouristだ!','生きてて偉いぞ!','すごい!','君の未来は明るい'];
var user_message=message[getRandomInt(5)];
var url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replytoken,
'messages': [{
'type': 'text',
'text': user_message,
}],
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
ソースコードについて軽い解説
今回JavaScriptで実装しましたが他のプログラミング言語でも可能です。
doPost関数はWebアプリにPOSTリクエストが送られたときに、実行される関数です。LINEBotにメッセージが送られた場合、LINEのサーバーがWebhookURLに設定したURLにPOST形式でメッセージを送ります。それをGoogle Apps Scriptが受け取って、JSONをパースし、返信するためのリプライトークンとメッセージの中身をJSONフォーマットに入れてエンドポイントに返信しています。ちなみに変数user_messageが送られる文面なのでここを変更するだけで全く違うbotを作ることが出来ます。
開発で工夫したところ
上記のコードにmessageという文字列が格納された配列を用意しておいてそれをランダムで選択できるようgetRandomInt()関数を作成しました。これにより可読性が向上しました。