GASを使って「姓名判断占い」ボットお手軽開発

#何を作ったの？
LINEのボットを作ってみました。「占いくん」です。
姓名判断をしてくれます。

![スクリーンショット 2019-01-24 23.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/206972/1a418b49-3a1c-c1dd-1c05-20041a80d979.png)

LINEの友だち追加で以下のQRコードを読みってみてください。

![line_bot_uranaikun.png](https://qiita-image-store.s3.amazonaws.com/0/206972/0b1e7555-2fff-7d31-a384-cf4929c6459d.png)

こんな感じで名字と名前をスペース区切りでテキスト入力すると、姓名判断結果を返してくれます。
なお、入力された氏名の情報は一切保存していませんのでご安心ください。
<img width="375" alt="S__94453805.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/206972/eb2cf16b-497f-b52d-4b4d-bf8d5d297569.jpeg">


#なぜ姓名判断？
子供が産まれた時に名前をつけるのに結構悩んでしまい、1つの判断基準にしたのが姓名判断でした。姓名判断の結果が全てではないと思いますが、どうせなら結果がいい方を選ぼうかなという感じです。
元々は姓名判断にあまり興味はありませんでしたが、自分含め身の回りの人で試してみると結構当たっている気がしたので、気軽にLINEで聞けたら面白いかなと思いボットを作ってみました。

姓名判断の結果は以下より構成されています。（参考：[いい名前ねっと](https://enamae.net/)）

 - **天格（祖運）**：姓の総画数。祖先運。家柄を象徴します。
 - **外格（助運）**：家族や職場などの外因的要素、対人関係・社会的環境一般の運勢。
 - **地格（初運）**：名前の合計字画数。幼少期の運勢を表し、その人の成長過程に強い影響を与える。
 - **人格（主運）**：姓の最後と名の第一字を足したもの。人物の内面をあらわし、家庭・仕事・結婚運、中年期の運勢に影響を与えます。
 - **総格（総運）**：姓と名の合計字画数。人生を歩むにつれて色濃くでてくるといわれ、晩年期に大きく影響を及ぼします。


#どうやって作ったの？
GoogleAppsScript（GAS）を使ってLINEボットを作りました。
フロントにLINE、バックエンドにGASという至ってシンプルな構成です。
入力された氏名をURLに含める形で、姓名判断サイト「[いい名前ねっと](https://enamae.net/)」にGETリクエストを投げて返ってきたHTMLを解析し結果をLINEで表示しています。
![line_bot_uranai.png](https://qiita-image-store.s3.amazonaws.com/0/206972/a040a9f7-f90e-2923-0f57-7bcabd0f7a2e.png)


#GASって何？
[GoogleAppsScript（GAS）](https://developers.google.com/apps-script/)は、GmailやスプレッドシートなどGoogleが提供するサービスをJavaScriptベースの言語で操作することができます。恥ずかしながらGASというものを最近知りましたが、ポテンシャルがすごいのです。WebAPI公開やJob実行などサーバ構築不要で実現することが出来る上に**無償**で使えます。

 - JavaScriptでできることは大体できる
 - Google系サービスを色々操作することができる
 - Googleアカウントさえあれば無償ですぐに使える
 - 作成したコードはWebAPIとして公開することができる
 - スケジュールなどのトリガーでJob実行が可能


# ボット作成の流れ
## １）　LINEボットのアカウントを取得
[LINE Developers](https://developers.line.biz/ja/)でMessagingAPIチャネルを作成します。
詳しくは参考ページに書いてあるサイトなどをご確認ください。

## ２）　GASのプログラムを作成
GASは以下のように[Googleスプレッドシート](https://docs.google.com/spreadsheets/u/0/)から作成できます。
作成が完了したら、プログラムをWebアプリケーションとして公開します。
これで外部からURLでアクセスできるようになります。

　![スクリーンショット 2019-01-07 23.51.35.png](https://qiita-image-store.s3.amazonaws.com/0/206972/e8348628-d3cd-69ee-e2a3-84dec6942cc7.png)

参考までに、作成したGASのプログラムです。

```line-bot-uranai.gs
// LINE Developersで事前にトークンを取得
var channel_access_token = "xxx"


// ボットにメッセージ送信した時の処理
function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message") {
      if(event.message.type=="text" && checkInput(event.message.text)) {
        reply(doUranai(event.message.text), event.replyToken);
      } else { 
        reply("名字と名前をスペースで区切ってテキスト入力してみてね",event.replyToken);
      }
    }
 });
}


// 入力された氏名をチェック
function checkInput(msg) {
  var msg_ary = msg.replace(/　/g, ' ').split(' ');
  if(msg_ary.length >= 2) {
    return true;
  } else {
    return false;
  }
}


// 姓名判断を実施
function doUranai(msg) {
  //入力された姓名を取得
  var msg_ary = msg.replace(/　/g, ' ').split(' ');
  var sei = msg_ary[0];
  var mei = msg_ary[1];

  //性別は特に関係ないので何も考えずに男性として処理
  var seimei_url = "https://enamae.net/m/" + sei + "__" + mei + "#result";
  var tag_from = '<img src="/result.php?sei=' + sei + "&mei=" + mei + '" alt="'+sei+mei+'（男性）の姓名判断診断結果">';

  //いい名前ねっとのURLを呼び出す
  var response = UrlFetchApp.fetch(seimei_url).getContentText();

  //返却されたHTMLを解析
  var res = findTag(response, tag_from, '<div class="center_banner2">');
  var res_ten = findTag(res, '<h3>天格（祖運）<span>は', '<span>天格（祖運）とは');
  var res_jin = findTag(res, '<h3>人格（主運）<span>は', '<span>人格（主運）とは');
  var res_ti = findTag(res, '<h3>地格（初運）<span>は', '<span>地格（初運）とは');
  var res_sou = findTag(res, '<h3>総格（総運）<span>は', '<span>総格（総運）とは');
  var res_gai = findTag(res, '<h3>外格（助運）<span>は', '<span>外格（助運）とは');

  //姓名判断の結果を返却
  var ret_msg = "●天格（祖先運）\n" + res_ten + "\n\n" + "●外格（助運、社会運）\n"+ res_gai + "\n\n" + "●地格（初運、幼少期）\n"+ res_ti 
    + "\n\n" + "●人格（主運、中年期）\n" + res_jin + "\n\n"  + "●総格（総運、晩年）\n" + res_sou
    + "\n\n" + "詳細はいい名前ネット「 " + seimei_url + " 」を見てね";
  return ret_msg.replace(/<h3>/g,'\n\n').replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'');
} 


// HTMLを解析するための関数
function findTag(text, from, to) {
  var fromIndex = text.indexOf(from);
  if (fromIndex === -1) return '';
  text = text.substring(fromIndex + from.length);
  var toIndex = text.indexOf(to);
  if (toIndex === -1) return '';
  return text.substring(0, toIndex);
}


// 入力されたメッセージをLINE送信
function reply(msg,replyToken) {
  var message = {
    "replyToken" : replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : msg
      }
    ]
  };
  var replyData = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(message)
  };
  var response = UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
  return response;
}
```

## ３）　LINEボットからGASプログラムを呼び出すように設定
MessagingAPIチャネルのWebHookURLにGASのアプリケーションURLを設定します。


# まとめ
今回はGASを使ってLINEボットを作成しました。無料で色々できる時代なので、少しやってみようという時にはすごくありがたいですね。GASは手軽ですが、出来る事が非常に多いので引き続き使っていきたいと思います。


# 参考ページ
- [LINE Developersドキュメント（MessagingAPI）](https://developers.line.biz/ja/docs/messaging-api/overview/)
- [Google Apps ScriptでLINE BOTつくったら30分で動かせた件](https://qiita.com/hakshu/items/55c2584cf82718f47464)
- [GAS ビギナーが GAS を使いこなすために知るべきこと 10 選](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4)