1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GAS を利用して素数判定してくれる LINE Bot を作ってみた

Posted at

概要

Google Apps Script を用いて,与えられた整数が素数かどうかを判定してくれる LINE Bot を作成する.

詳細

この記事の投稿日2020年5月11日は素数日(20200511は素数)である.前回の素数日2020年4月29日に投稿した記事に引き続き,本稿ではトークで送信した整数が素数かどうか教えてくれる LINE Bot を作成する手順を述べる.

準備

LINE Developers でチャネル作成

  1. https://developers.line.biz/console/ にアクセス1
  2. 適当な LINE アカウントでログイン
  3. Welcome to the LINE Developers console! 画面下部にある Create a new provider をクリック
  4. Provider name を入力し,Create をクリック
  5. This provider doesn't have any channels yet 画面の Create a Messaging API channel をクリック
  6. 作成するチャネルの情報を入力,各規約に目を通して同意
  1. 入力や同意が済んだら,いちばん下の Create をクリック
  2. 「情報利用に関する同意について」が表示されるので,読んだ上で同意する
  3. チャネル基本設定が表示されたらMessaging API設定をクリック
  4. 設定画面にある QR コードを LINE で読み取り,作成したチャネルに対応する LINE 公式アカウントを友だち追加しておく
  5. いちばん下にある**チャネルアクセストークン(ロングターム)**を発行し,メモしておく

Google Apps Script のプロジェクト作成

  1. Google ドライブ上で 新規>その他>Google Apps Script を選択2し,GAS のプロジェクトを作成
  2. エディタ画面で既に書かれているもの(myFunction)を消して以下のコードを入力する.その際,先ほどメモした**チャネルアクセストークン(ロングターム)**を accessToken の箇所に書いておく
コード.gs
// 素数かどうか判定する関数
function is_prime(n) {
  var num = Math.abs(n);
  var result = true;
  
  if(num <= 1) {
    result = false;
  }
  else if(num > 2) {
    for(let i = 2; i <= Math.ceil(Math.sqrt(num)); i ++) {
      if(num % i == 0) {
        result = false;
        break;
      }
    }
  }
  
  return result;
}

// LINE Botにメッセージ等が送られると発動する関数
function doPost(event) {
  var lineJson = JSON.parse(event.postData.contents); // LINE Botに送信されたメッセージ情報
  var message = lineJson.events[0].message.text; // メッセージ情報の中からメッセージのみを抽出
  
  // メッセージが整数であれば素数判定を行う(整数でなければメッセージをオウム返しする)
  if(!isNaN(parseInt(message, 10))) {
    var n = parseInt(message, 10);
    if(is_prime(n)) {
      message = n + "は素数です";
    }
    else {
      message = n + "は素数ではありません";
    }
  }
  
  // LINE Botにメッセージを返信する準備
  var accessToken = ""; // チャネルアクセストークン(ロングターム)を "" 内に記述
  var replyToken = lineJson.events[0].replyToken;
  var url = "https://api.line.me/v2/bot/message/reply";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    "Authorization": "Bearer " + accessToken,
  };
  var postData = {
    "replyToken": replyToken,
    "messages": [
      {
        "type": "text",
        "text": message,
      }
    ]
  };
  var options = {
    "method" : "post",
    "headers": headers,
    "payload": JSON.stringify(postData)
  };

  UrlFetchApp.fetch(url, options); // メッセージを返信
}

ウェブアプリケーションとして公開する

  1. GAS のエディタ画面で公開>ウェブ アプリケーションとして導入を選択
  2. Execute the app as: は Me(自分),Who has access to the app: は Anyone, even anonymousを選択し,Deploy をクリック
  3. Current web app URL が発行されるので,メモしておく
  4. 上記で記入したコードが初めて実行される際には Google アカウントへのアクセス許可を求められるので,許可する3

Webhook の設定

  1. 再び LINE Developers のチャネル画面で Messaging API設定を開く
  2. Webhook URL に上記でメモした Current web app URL を入力する
  3. Webhookの利用がオフになっていたら,オンにする

素数判定をさせてみる

ここまでできたら,作成したチャネルに対応する LINE 公式アカウントのトークルームで適当な整数を送信してみる.素数かどうかの判定が返ってくれば成功である.

# 整数だけのメッセージを送る --> 素数判定の結果が返ってくる
20200510 --> 20200510は素数ではありません
20200511 --> 20200511は素数です

# 先頭が整数のメッセージを送る --> 先頭の整数の素数判定が行われる
2020年5月11日 --> 2020は素数ではありません

# 先頭が整数でないメッセージを送る --> メッセージをオウム返しされる
ぴえん🥺 --> ぴえん🥺
時に、西暦2015年 --> 時に、西暦2015年

注意

Google Apps Script のコードを書き換えて LINE Bot の挙動に反映させるためには,変更の度にウェブアプリケーションとして公開する必要がある.具体的には次の手順を踏む.

  1. GAS のエディタ画面で公開>ウェブ アプリケーションとして導入を選択
  2. Project versionNew に変更し,更新をクリック

参考

  1. 英語表記になっていたら,画面右下から言語を日本語に変更できる.執筆中は8を過ぎるまでそれに気が付かなかった……

  2. もし Google Apps Script が表示されなければ「その他」の中の「アプリを追加」から Google Apps Script を追加する.

  3. 「このアプリは確認されていません」という画面が出たら「詳細」をクリックした後「~(安全ではないページ)に移動」をクリックすると先に進める.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?