Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@koichi_hiphopdream

映画レビューの記録・共有をLINE BOTで行ってみる

More than 1 year has passed since last update.

何をつくりたいのか。

・LINE BOTとGoogle Apps Script(GAS)の勉強
・内容としては、LINE BOT経由で内容をスプレッドシートに送信
映画レビューを、LINE BOTに話すとスプレッドシートに送られて、仲間同士で共有できる仕組みを作ります。

図1.jpg

完成後

映画レビューをLINE BOTに話すと
S__22683708.jpg

カテゴリごとに分割されて、スプレッドシートに格納されます。
キャプチャ最終.JPG

LINE Developersの設定

・Webブラウザから「LINE Developers」を検索
・右上の[ログイン]を押してページ遷移
・[LINEアカウントでログイン]
すると、こんな感じの画面になります。
キャプチャ.JPG

英語版だったので、日本語にして、プロバイダーの横の作成ボタンをクリック。
プロバイダー名の欄に管理者名を登録します。

キャプチャ1.JPG

チャンネル作成、真ん中のAPIをクリック。

キャプチャ2.JPG

登録情報を入力していきます。

キャプチャ_4.JPG

同意して進んだら、API設定をクリック
キャプチャ6.JPG

応答メッセージの編集をクリックして、応答メッセージをオフ、webhookをオンにします。

キャプチャ7.JPG

キャプチャ8.JPG

先ほどの画面で、アクセストークン[発行]します。

キャプチャ9.JPG

管理者用Googleアカウント作成とスプレッドシートの設定(GAS)

・アカウント作成
・ドライブを開く
・新規作成->googleスプレッドシートを開く

スクリプトエディタを開きます。
(複数のGoogleアカウントでログインしている状態だと、うまくいかないかも)
きゃぷ10.jpg

元のコードを削除して、下記のコードを貼り付けます。以下のサイトを参考にして作成しました。
アイデアを記録・想起する LINE Bot を作ってみました。

GASのコード

はじめに、アクセストークンなどLINEとの接続部分の設定。
CHANNEL_ACCESS_TOKEN = ‘xxxxxxxxx’のxxxxxx…を削除し、line developersで発行していたトークンをコピーし、xxxx…の部分に貼り付けます。

main.gs
var CHANNEL_ACCESS_TOKEN = 'xxxxxxxxxxxxxxx'; // please set your channel access token
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';#LINE Developer Document記載のAPIのURL
var line_endpoint_profile = 'https://api.line.me/v2/bot/profile';

この処理で分割したメッセージを、スプレッドシートに追加しています。

main.gs
function addToSpreadSheet(time,m1,m2,m3,m4,m5,m6) {
  var today = new Date();
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadSheet.getSheets()[0];
  sheet.appendRow([today,m1,m2,m3,m4,m5,m6]);
}

BOTがメッセージを受け取った後に、分割する部分。

main.gs
function doPost(e) {
  //JSONをパース
  var json = JSON.parse(e.postData.contents);  
  //返信用のトークンを取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  var time = json.events[0].source.userId;
  //送信されたメッセージを取得
  var user_message = json.events[0].message.text;  
  //返信するメッセージを配列で用意
  var reply_messages;
  var spreadSheet;
  var str1='映画レビュー';
  var str2='【投稿者】';
   if(user_message.indexOf(str1)!=-1 && user_message.indexOf(str2)!=-1){
    //メッセージに映画レビュー、【投稿者】というフォーマット形式のデータが入っていた場合分割する
    var str;
    str = user_message[0];
    var i=0;
    for(i=1;i<=user_message.length;i++){
     str += user_message[i];
    }

    var reg = /【投稿者】.*?\n/;
    var m1 = str.match(reg);
    m1 = m1.join('');//配列の要素を結合して文字列に変換
    m1 = m1.replace(/【投稿者】/g,'');//不要な情報の削除
    m1 = m1.replace(/\n/g,'');//改行の削除

    var reg = /【映画名】.*?\n/;
    var m2 = str.match(reg);
    m2 = m2.join('');//配列の要素を結合して文字列に変換
    m2 = m2.replace(/【映画名】/g,'');//不要な情報の削除
    m2 = m2.replace(/\n/g,'');//改行の削除

    var reg = /【ジャンル】.*?\n/;
    var m3 = str.match(reg);
    m3 = m3.join('');//配列の要素を結合して文字列に変換
    m3 = m3.replace(/【ジャンル】/g,'');//不要な情報の削除
    m3 = m3.replace(/\n/g,'');//改行の削除

    var reg = /【評価】.*?\n/;
    var m4 = str.match(reg);
    m4 = m4.join('');//配列の要素を結合して文字列に変換
    m4 = m4.replace(/【評価】/g,'');//不要な情報の削除
    m4 = m4.replace(/\n/g,'');//改行の削除

    var reg = /【良かった点】.*?\n/;
    var m5 = str.match(reg);
    m5 = m5.join('');//配列の要素を結合して文字列に変換
    m5 = m5.replace(/【良かった点】/g,'');//不要な情報の削除
    m5 = m5.replace(/\n/g,'');//改行の削除

    var reg = /【悪かった点】.*/;
    var m6 = str.match(reg);
    m6 = m6.join('');//配列の要素を結合して文字列に変換
    m6 = m6.replace(/【悪かった点】/g,'');//不要な情報の削除
    m6 = m6.replace(/\undefined/g,'');

    addToSpreadSheet(time,m1,m2,m3,m4,m5,m6);
    reply_messages = [ m1 + 'さん\n' + m2 + 'のレビューありがとうございます。'];
}

   else {
    reply_messages = ['error'];
   }

BOTが、メッセージを返信する部分。
返信がないと、きちんと反映されているのか不安になりますよね。

main.gs
  //メッセージを返信
  var messages = reply_messages.map(function (v) {
    return {'type': 'text', 'text': v};    
  });    
  UrlFetchApp.fetch(line_endpoint, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': messages,
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

アプリケーション公開へ

公開→ウェブアプリケーションとして導入

きゃぷ13.jpg

公開範囲を設定、連携を許可し、URLをコピーします。

キャプチャ14.JPG

ここから安全ではないページと表示されますが、そこをクリックして同意してください。

キャプチャ15.JPG

もう一度、公開からウェブアプリケーションとして導入を押すと、このURLが発行されます。コピーして、Project versionをnewバージョンに選択して更新します。コードを書き換えた際も、毎回更新します。

キャプチャ16.JPG

コピーしたURLをline developersのチャネル基本設定画面のwebhookの欄に貼り付けます。

キャプチャ17.JPG

webhookの利用を、そのままonにします。

キャプチャ18.JPG

そして、LINE Developersのチャネル基本設定画面のQRコードを携帯で読み取って、BOTをLINEに追加します!

実際に試してみる

スプレッドシートの1行目に、投稿日時等の情報を書いておいて、LINEBOTに、このフォーマットを使って、内容を書き込んで送信すると

映画レビュー
【投稿者】
【映画名】
【ジャンル】
【評価】
【良かった点】
【悪かった点】

S__22683708.jpg

キャプチャ最終.JPG

無事に、スプレッドシートに反映されました。

さいごに

スプレッドシートのURLを共有しておけば、仲間同士で共有する事ができます。グループラインへの招待をDepelopersで有効にしておけば、グループで発信して会話を楽しみ、スプレッドシートでも後から見返す事ができます。

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
koichi_hiphopdream
このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?