はじめに
LINE Botを作っていて、LINE ID やGroup Idを利用してpush message を送りたいときに、簡単なユーザー登録をさせるtipsです
YouTuberの仲条さんの動画で紹介されました!(ちょっと記事でつまづくことがあるので、この動画見ながらだと安心です!!!)
https://www.youtube.com/watch?v=YURez52I2Mc
使う技術
GAS
LINE Bot
Googleフォーム
前提
5分でつくるLINEBot を元に、「オウム返しBot」の作成は完了させておいてください
今回は、複数人が登録しているグループに追加されたBotが、グループIDを取得するまでを行います
Googleフォームの準備
Googleフォームの「事前入力したURLを取得」の説明
登録名とグループIDを入れる用の設問を用意します
グループIDは自動で入力させるのでユーザーが触らないように!という文言を書いておきます。(書き換えないかどうかは、ユーザーの善意頼りですが、プロトタイプなので良しとしましょう!)
ページ右上のメニューを展開し「事前入力したURLを取得」を選択します
末尾に「test」とあるURLがコピーできたらメモ帳か何かに保存しておきましょう
https://docs.google.com/forms/d/e/1FAIpQLSfkTMZCaibmWcki1KS6Lv-3sQsDGlsUv1li9fnVGMsOnE87Dw/viewform?usp=pp_url&entry.36173468=test
試しに、この「test」の文言を「111222333444」に変更しURLにアクセスをすると
https://docs.google.com/forms/d/e/1FAIpQLSfkTMZCaibmWcki1KS6Lv-3sQsDGlsUv1li9fnVGMsOnE87Dw/viewform?usp=pp_url&entry.36173468=111222333444
これを利用してユーザー登録を行います!
上記URLはサンプルなので、自分のフォームを作ってから先に進んでください
Googleフォームの回答を既存のスプレッドシートに出力する
5分でつくるLINEBotをやっている前提ですので、まだの人はこちらの作業を終えてから戻ってきてください。
Googleフォームでの作業です。
「回答」からスプレッドシートのマークを選択します
5分でつくるLINEBotでコピーしたスプレッドシートを選択すると、このようにシートが追加されます
これでフォームの準備は完了です。
GAS の修正
5分でつくるLINEBotのGASのコードを修正していきます
Botがグループへ参加出来るようにするには、LINE Developersから「グループトーク・複数人トークへの参加を許可する」の設定を有効にしてください
doPost関数を以下のように変更します。
//ポストで送られてくるので、ポストデータ取得
function doPost(e) {
// 動作確認用のログ出力
log_to_sheet("A", "doPost")
//JSONをパースする
json = JSON.parse(e.postData.contents);
//返信するためのトークン取得
reply_token= json.events[0].replyToken;
if (typeof reply_token === 'undefined') {
return;
}
let messages
if (json.events[0].source['groupId'] && json.events[0].message.text === "ユーザー登録") {
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
let url = "さっきコピーしたURLでtestを抜いたものをここにコピー(文末は、viewform?usp=pp_url&entry.36173468= みたいな感じになるかと思います)"
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
url = url + json.events[0].source['groupId']
messages = [{'type': 'text', 'text': "ユーザー登録はこちらから " + url }]
} else {
// オウム返し
messages = test_message()
}
// テスト動作ができたら、your_messageの中身を追加して、自分のオリジナルのLINEBotにしてみましょう
// messages = your_message()
// メッセージの中身を確認したい時には以下のコメントアウトを外して、sheet「log」に書き込まれる内容を確認しましょう
// log_to_sheet("A", messages)
// メッセージを返信
send_reply_message(messages)
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
コードの解説
ユーザーからのメッセージにグループIDが存在する場合、以下のコードで取得ができます。
json.events[0].source['groupId']
ユーザーからのメッセージにグループIDが存在して、メッセージが「ユーザー登録」の時だけユーザー登録用のURLを送信するようにします
if (json.events[0].source['groupId'] && json.events[0].message.text === "ユーザー登録") {
} else {
}
先ほどコピーをしたURLの「test」部分をユーザーから取得したグループIDで置き換えます
let url = 'https://docs.google.com/forms/d/e/1FAIpQLSfkTMZCaibmWcki1KS6Lv-3sQsDGlsUv1li9fnVGMsOnE87Dw/viewform?usp=pp_url&entry.36173468=' + json.events[0].source['groupId']
そうするとこのようにユーザー登録用のURLを返却してくれます
フォームを送信すると、スプレッドシートにデータが入っていることを確認できます
プッシュメッセージ送信機能を実装
プッシュメッセージは無料の範囲だと月間1000メッセージしか送れないので注意しましょう
スプレッドシートのsheet1にこのようにプッシュメッセージで送りたい相手、送りたいメッセージを記載しておきます。
(VLOOKUP関数を使って、対象家族の値でシート「フォームの回答1」を検索し、group_idをsheet1に取得しています)
プッシュメッセージを送信したら、ステータスに「送信完了」というメッセージを入れ、次から送信対象にしないようにします。
function test(){
// sheet1 を指定
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
// 全データを取得
const all_data = sheet.getDataRange().getValues();
let messages = []
let group_id
for(let i = 1; i < all_data.length; i++) {
if(all_data[i][0] != "送信完了" && all_data[i][2]){ // ステータスが送信完了でなく、group_idが存在する場合
group_id = all_data[i][2]
messages.push({'type': 'text', 'text': all_data[i][3]})
pushMessage(group_id, messages)
sheet.getRange(i+1, 1).setValue("送信完了")
}
}
}
function pushMessage(group_id, messages) {
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'to': group_id,
'messages': messages,
}),
});
}
これでGASで関数testを選択し、実行ボタンを押すと、プッシュメッセージが送信されるようになりました。
実際には、この送信する関数を、GASの機能で定期的に実行するといったことが必要になってくると思いますが、ひとまずGoogleフォームでの簡単なユーザー登録とプッシュメッセージの送信ができるようになりました。