ポートフォリオサイト公開中

【LINE BOT】30分からできるLINE BOT開発⑥【ユーザー登録のシステムを作る】

30分からできるLINEボット開発

こんにちは、ともろう(@tomorrowSLog)です。

この記事は【LINE BOT】30分からできるLINE BOT開発⑤の続きの記事になります。






【プログラミング】 日英翻訳サイトを作ってみた【JavaScript】 【プログラミング】 日英翻訳サイトを作ってみた【JavaScript】

作りたいもの

LINE botに登録したユーザーをスプレッドシートに登録

LINE botを追加してくれたユーザーのユーザー名とIDを取得して、スプレッドシートにデータベースとして登録をしたい。

これによって、ユーザー数の把握やIDに紐づけてのプッシュ通知ができるようになる!

ユーザーが退会(ブロック)をしたらスプレッドシートから削除

登録ができるだけだと不十分。

ユーザー目線としてもブロックした後にデータがずっと残るのは嫌なはず。

退会(ブロック)をしたらスプレッドシートから削除!

発展として

新規登録ユーザー(ブロック解除ユーザー)へのThanks挨拶を名前を取得して動的に変えていく。

登録システムGASコード

事前準備

userと言う名前のシートをgasのコードと結びついたスプレッドシートに作成してください。

コード全文

var channel_token = "your_channel_token"
var url = "https://api.line.me/v2/bot/message/reply"

function doPost(e) {
  var json = e.postData.contents
  var events = JSON.parse(json).events;
  
  events.forEach(function(event) {
    if(event.type == "message") {}
    else if(event.type == "follow") {
      var displayName = follow(event);
      var message = displayName + "さん登録ありがとう!";
      reply(event, message);
    } 
    else if(event.type == "unfollow") {unfollow(event);} 
  });
}

function follow(e) {
  var userId = e.source.userId;
  var options = {"headers" : {"Authorization" : "Bearer " + channel_token}};
  var json = UrlFetchApp.fetch("https://api.line.me/v2/bot/profile/" + userId , options);
  var displayName = JSON.parse(json).displayName;
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sheet.getSheetByName('user');
  ss.appendRow([userId, displayName]); 
  return displayName
}
function unfollow(e) {
  var userId = e.source.userId;
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sheet.getSheetByName('user');
  var dat = ss.getDataRange().getValues();
  var flg = -1;
  
  for(var i=0;i<dat.length;i++){
    if(dat[i][0] === userId){//[行][列]
      ss.deleteRow(i+1);
    }
  }
}
function reply(e,message) {
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [{"type": "text","text" : message}]
  };
  var options = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch(url, options);
}

それではそれぞれの関数について見ていきましょう。

受信データを振り分ける doPost関数

doPost関数は受信したデータを受け取り、イベントごとに場合分けをします。

途中で出てくるfollow関数とreply関数は後述しますが、ユーザーデータを登録してユーザー名を返す関数と、メッセージを返す関数になります。

function doPost(e) {
  var json = e.postData.contents
  var events = JSON.parse(json).events;
  
  events.forEach(function(event) {
    if(event.type == "message") {}
    else if(event.type == "follow") {
      var displayName = follow(event);
      var message = displayName + "さん登録ありがとう!";
      reply(event, message);
    } 
    else if(event.type == "unfollow") {unfollow(event);} 
  });
}

 

フォロー時の処理をする follow関数

フォローされたときの動作を作っていきます。

フローとしては、

  1. データからユーザーIDを取得
  2. ユーザーIDをもとに表示名をリクエスト、取得
  3. スプレッドシートに登録

のような感じ。特に難しいことはしていないはずです!!!

メモ

スプレッドシートのシート名は8行目で指定しています(今回は‘user’)

function follow(e) {
  var userId = e.source.userId;
  var options = {"headers" : {"Authorization" : "Bearer " + channel_token}};
  var json = UrlFetchApp.fetch("https://api.line.me/v2/bot/profile/" + userId , options);
  var displayName = JSON.parse(json).displayName;
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sheet.getSheetByName('user');
  ss.appendRow([userId, displayName]); 
  return displayName
}

フォロー解除時の処理をする unfollow関数

続いてフォロー解除時の挙動を作ります。

と言ってもすることは

  1. ユーザーIDを取得
  2. スプレッドシートからユーザーIDを検索
  3. スプレッドシートからデータを削除

これだけ

function unfollow(e) {
  var userId = e.source.userId;
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sheet.getSheetByName('user');
  var dat = ss.getDataRange().getValues();
  var flg = -1;
  
  for(var i=0;i<dat.length;i++){
    if(dat[i][0] === userId){//[行][列]
      ss.deleteRow(i+1);
    }
  }
}

 

メッセージを返す reply関数

イベントに紐づけて返事を返すreply関数です。

今回はdoPost関数の中でこのように使っています。

var displayName = follow(event);
var message = displayName + "さん登録ありがとう!";
reply(event, message);

メッセージ返信のフォーマットを関数化した感じです。

function reply(e,message) {
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [{"type": "text","text" : message}]
  };
  var options = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch(url, options);
}

 

挙動

おうむちゃん

あなた(ユーザー名)さん登録ありがとう!

友達追加をし、ブロック、ブロック解除をして挙動を確認して見てください。

うまく動きましたか?

LINEBOTシリーズ他の記事

1.【LINE BOT】30分からできるLINE BOT開発①【下準備】
2.【LINE BOT】30分からできるLINE BOT開発②【GASとLINEボットの紐付け】
3.【LINE BOT】30分からできるLINE BOT開発③【メッセージの送信】
4.【LINE BOT】30分からできるLINE BOT開発④【フォローイベントの作成】
5.【LINE BOT】30分からできるLINE BOT開発⑤【おうむ返しさせる】
6.【LINE BOT】30分からできるLINE BOT開発⑥【ユーザー登録のシステムを作る】
7.【LINE BOT】30分からできるLINE BOT開発⑦
8.【LINE BOT】30分からできるLINE BOT開発⑧
9.【LINE BOT】30分からできるLINE BOT開発⑨
10.【LINE BOT】30分からできるLINE BOT開発⑩

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です