15
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

【GAS修行②】Wiki調査LINE BOTを作成

・GAS熟練者への道。
・先人達のコードの「写経&コピー」の駆使の成果物のまとめ。
・第二弾
第一弾はこちら。

経緯

・「二回目は何作ろう。今回も実用的なものを作りたい。」
・「行動パターンから、効率化できるものを考えよう」
・「よし。調べ魔の私にぴったりのあれを作ろう」
→そういうわけで、今回もサンプルアプリと仏様サイトを発見。
https://devpixiv.hatenablog.com/entry/2016/11/14/150000
→「また参考(※マルコピ)に作るか。」
→取り組み開始。

概要

  • 調べたい単語を投稿すれば、Wikiから情報を持ってきて返す。(140文字以内)
  • 続きを見るための、WikiのURLも教えてくれる。

結果

・実際の画面はこちらです。
image.png

作成環境

  1. Google Apps Script
  2. LINE Messaging API
  3. Wikipedia API

手順

Google Apps Scriptの設定

  • Googleドライブからスクリプトエディタを起動。
    ※Googleアカウントを持っていない人は、作成する。
    • Googleドライブを起動
    • 「新規」→ 「その他」→「アプリを追加」の順にクリック。
    • アプリ検索欄に「script」と入力して検索。
    • 検索結果に「Google Apps Script」が表示されるので、そこの「接続」ボタンをクリック
    • 改めて「新規」→ 「その他」の順にクリックしていくと、「Google Apps Script」が表示されているので、クリック。
  • 起動したプロジェクトに名前をつける
    ※プロジェクト名が反映されるわけではないが、自分がわかる名前をつける。
    →保存。(最初の3行のままで良い。)
  • 保存後、タブメニューの「公開」から「ウェブアプリケーションとして導入」をクリック。下記の項目を設定。
    • プロジェクトバージョン:New(変更内容は任意)
    • 次のユーザーとしてアプリケーションを実行:自分(アドレス)
    • アプリケーションにアクセスできるユーザー:全員(匿名ユーザーを含む)
  • 設定後、「導入」ボタンをクリック。作成さるウェブアプリケーションURLをメモしておく。「OK」ボタンをクリック。
  • 一旦置いておく。

LINE Messaging APIの設定

  • LINE Messaging APIのトークンを発行。 (※基本的にはこちらを参考)
    • LINE Developersにアクセスして、自分のLINEアカウント情報でログイン。
    • ログイン後、初めての方は開発者情報を登録。
    • 「はじめる」をクリック。
    • コンソールページ内の「プロバイダ作成」ボタンをクリック
    • 「必要情報」を入力後、「確認」ボタンをクリック。(※自分の名前を入力。)
    • 設定後、「チャネル作成」ボタンで、Messaging APIのチャネルを作成し、下記の項目を設定。
      • アプリアイコン画像:任意
      • アプリ名: 任意
      • アプリ説明: 任意
      • プラン: 任意
      • 大業種: 任意
      • 小業種: 任意
      • メールアドレス: ご自身のメールアドレス
    • 設定後、確認ボタンで、チャネルが作成される。
    • コンソールページ内の作成したチャネルをクリック。
    • チャネル基本設定ページ内の「メッセージ送受信設定」「LINE@機能の利用」欄を下記の項目に設定
      • Webhook送信・・・「利用する」
      • Webhook URL・・・先程コピーしたGoogle Apps ScriptのURLを指定
      • 自動応答メッセージ・・・「利用しない」
      • 友達追加時あいさつ・・・「利用しない」
    • 設定後、同ページ内の「アクセストークン」を再発行して、そのトークンを控えておく。
  • トークン発行後、同ページ内のQRコードを読み込み、作成Botを友達として追加。

コード

  • 先程のスクリプトエディタに戻り、下記のコードをコピーして、保存。
line-wiki.gs
var CHANNEL_ACCESS_TOKEN = 'LINE Messaging APIのトークンを書く。';
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';
var simple_wikipedia_api = 'http://wikipedia.simpleapi.net/api';

function doPost(e) {
  var reply_token= JSON.parse(e.postData.contents).events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }
  var user_message = JSON.parse(e.postData.contents).events[0].message.text;

  var reply_messages = ['解読不可能'];
  if (/とは??$/.test(user_message)) {
    var q = user_message.match(/(.*)とは??$/)[1];
    var url_and_body = getWikipediaUrlAndBody(q);
    if (url_and_body !== null) {
      reply_messages = [
        '' + q + '' + 'が知りたいんだね。',
        url_and_body.body.substr(0, 140) + '...',
        '長い(-_-)\nこの先は下記からどうぞ(˘ω˘)',
        url_and_body.url,
      ];
    }
  }

  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);
}

function getWikipediaUrlAndBody(q) {
  var url = simple_wikipedia_api + '?keyword=' + encodeURIComponent(q) + '&output=json';
  var res = JSON.parse(UrlFetchApp.fetch(url));
  if (res !== null) {
    return {'url': res[0].url,'body': res[0].body};
  } else {
    return null;
  }
}

※以下の項目を自分のものに変えるのを忘れない。
   ・LINE Messaging APIのトークン(先程メモしたもの。)

  • 自分のコードに書き換えて保存。
  • 保存後、先程の要領で、「ウェブアプリケーションとして導入」をクリック。
  • プロジェクトバージョンを最新のものにして、更新をクリック。
    ※更新をしないと、反映されない。
  • 実際にLINEへ行き、動作確認。(例:「単語」とは)
  • 正常に動けば、完了。

まとめ

  • だいぶ苦戦したが、なんとか形にはできた。ただ、もっと綺麗に簡単に書けるやり方があると思う。
  • 今回も実用的なものができた。
  • まだまだマルコピ乱用の日々は続くだろう。
  • これを見てくださるエンジニアの皆様、「こうしたら簡単にかけるよ」とか「こういう処理を追加してみたら」等の意見を何卒お待ちしております。

参考

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
Sign upLogin
15
Help us understand the problem. What are the problem?