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

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

# 詳細
この記事の投稿日2020年5月11日は素数日（20200511は素数）である．[前回の素数日2020年4月29日に投稿した記事](https://qiita.com/denkiuo604/items/d89997bae77f5930b922)に引き続き，本稿ではトークで送信した整数が素数かどうか教えてくれる 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. 作成するチャネルの情報を入力，各規約に目を通して同意
 - optional（任意）とある項目は入力しなくても良い
 - 個人作成の場合，Category（大業種）は「個人」，Subcategory（小業種）は「個人（その他）」で問題ない
 - 「[LINE公式アカウント 利用規約](https://terms2.line.me/official_account_terms_jp?lang=ja)」「[LINE公式アカウントAPI利用規約](https://terms2.line.me/official_account_api_terms_jp?lang=ja)」を読み，同意する
7. 入力や同意が済んだら，いちばん下の **Create** をクリック
8. 「情報利用に関する同意について」が表示されるので，読んだ上で同意する
9. チャネル基本設定が表示されたら**Messaging API設定**をクリック
10. 設定画面にある QR コードを LINE で読み取り，作成したチャネルに対応する LINE 公式アカウントを友だち追加しておく
11. いちばん下にある**チャネルアクセストークン（ロングターム）**を発行し，メモしておく

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

### Google Apps Script のプロジェクト作成
1. Google ドライブ上で **新規>その他>Google Apps Script** を選択[^2]し，GAS のプロジェクトを作成
2. エディタ画面で既に書かれているもの（myFunction）を消して以下のコードを入力する．その際，先ほどメモした**チャネルアクセストークン（ロングターム）**を `accessToken` の箇所に書いておく

```javascript:コード.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); // メッセージを返信
}
```

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

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

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

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

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

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

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

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

## 注意
Google Apps Script のコードを書き換えて LINE Bot の挙動に反映させるためには，変更の度に[ウェブアプリケーションとして公開する](#%E3%82%A6%E3%82%A7%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%97%E3%81%A6%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B)必要がある．具体的には次の手順を踏む．

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

# 参考
- [GASとLINE Messaging APIでpushメッセージのLINEbotを作る！ - Qiita](https://qiita.com/n_oshiumi/items/a1a02e03093825f41e01)
- [LINE BOTをGASで作成 - Qiita](https://qiita.com/t_gata/items/897936761695124ef920)
- [Google Apps Script 文字列を整数に変換、文字列が整数か判定する](https://gist.github.com/kemsakurai/a2f28fb5ec9a7963cb5b0b970d26919d)
- [Messaging APIリファレンス | LINE Developers](https://developers.line.biz/ja/reference/messaging-api/)