自作LineBotの仕様とソース

##はじめに
当Botは作者の仕事を楽にするために開発されたものです。
企業アカウントのように、複数人での使用を前提としていない機能が盛りだくさんなので
利用する際はご注意ください:sunglasses:

##BOTの開発目的
１：日々の仕事や作業の手間を軽減する事。(一部、仕事仲間向けに公開)
２：疑似ゆめみちゃんとして、天体情報を教えてくれる事。
３：それらしい雑談ができる事。

##主な機能
- 雑談
- メール通知
- スクレイピング
- スプレッドシート読み書き
- Fusion Tables読み書き
- Gmail読み書き


以下イベント発生時は、管理者にメール送信

- フォロー・アンフォロー時
- グループ追加時
- エラー発生時

##ソースコード
MITライセンスで配布します。
https://github.com/Aoi-Erimiya/izumi-open.git
なにか機能増やしたり、複数人対応とか実装できたらぜひプルリク送ってください:relaxed:

##ソース構成
izumi.jsをベースに、複数のライブラリが取り巻いている構造。
設計思想としては、izumi.jsをゆめみちゃんのようなアンドロイドと捉えているので
以下のような流れで動いている。

イベント発生
　　↓
聞く(WebhookEventObjectに変換)
　　↓
考える(行動パターンの決定)
　　↓
行動(パターン一致したときの行動)

行動(=機能)はWorkクラスで表現している。
機能の追加はWork.jsの中にWorkクラスを継承したクラスを作成し、必要箇所だけオーバーライド。
izumi.jsのmakeReceptionOnetoOneWorkPatterns()の中に、有効にする機能を足していくスタイル。

##事前に準備が必要なサービス
このあたりの設定とかは、もっとわかりやすく書いてくれてる記事がたくさんあるので
自分に合うものを探してください:slight_smile:

###[Line@アカウント](https://developers.line.me/ja/)

###[docomo Developer support アカウント](https://dev.smt.docomo.ne.jp/?p=index)
以下APIの利用申請を行う
「自然対話：雑談対話」
「自然対話：キャラクタ変換」

###[Gmailアカウント + GoogleAppsScript](https://script.google.com/home)
以下機能の有効化や紐づけを行う
「Gmail」
「Fusion」
「SpreadSheet」（権限設定）

##稼働準備
###GASへのアップロード
ソースをぺたぺた。
作者はBitBucket + VScode(Prettierで整形) + スクリプトエディタに手動貼り付けでやってますが、
[gas-clasp-starter](https://qiita.com/howdy39/items/0e799a9bfc1d3bccf6e5)とか使ってもらってもいいと思います。

###GASのスクリプトプロパティの登録
ハードコードでもいいけど、ソースコード公開にあたり色々隠蔽。

####必須項目
- ADMINISTRATOR_USERID[^1]
- ADMINISTRATOR_EMAILADRESS
- DOCOMO_DEVELOPER_API_KEY
- LINE_CHANNEL_ACCESS_TOKEN

####任意項目(対応するソースコードをご確認ください)
- DIAGRAM_SPREADSHEET_ID[^2]
- TREASURE_SPREADSHEET_ID[^3]

##仕様

LineBotのため、個別トーク、グループトーク時で振る舞いを変える必要あり！
※例えば、グループトークで仕事の会話してるのに、割り込まれたら邪魔なので:frowning2:

###個別トーク
- 後述の使えるコマンドのいずれかにヒットすればその対応
- どのコマンドにも一致しなければ雑談（方言変換する）
- スタンプ→ランダムでスタンプを返す
- 位置情報→「そこに何かあるんですか？」
- 画像や動画→「見れないんです＞A＜;」
- 連絡先→完全スルー

###グループトーク
- 「～さん紹介」コマンドのみ対応
- 雑談やスタンプには回答しない

###Lineからの戻りオブジェクトについて
Lineスタンプの問題は、膨大な種類あるのに、APIからはスタンプの種別とユニークIDしか返ってこない事。

```lineのスタンプイベント.json
  "message": {
    "id": "325708",
    "type": "sticker",
    "packageId": "1", //公式スタンプの
    "stickerId": "1"  //１番目...
  }
```
感情を表す情報('happy'みたいな感じで)があれば、それらしい返答スタンプ出せるのに...:disappointed_relieved:
また、使えるスタンプが決めうちされているのも残念なところ。
今んとこ、ランダムで返答してます。

位置情報は、もらっても何も反応できないので、ひとまず「そこに何かあるんですか？」とか返信して
テキストベースでの話に誘導。あとは雑談APIが何とかしてくれるはず:smirk:

画像や動画は、解析できるAPIとか作ったらなんか活用できるかも。
今のところはごめんなさいしてます。

連絡先に至っては、そもそも通知が来ないので手の打ちようがないです:sweat:

##使えるコマンド
#### 「～の天気は？」
[ライブドアさんのサービス](http://weather.livedoor.com/weather_hacks/webservice)を叩かせてもらってます。
地域コード列挙するの面倒だったので、現状では大阪と帝都のみ対応。
最高気温・最低気温のところだけ、時間によって取れなかったりするので分岐を入れてます。

####「特定駅名」※時刻表機能
よく使う駅について、スプレッドシートに時刻表を転記したものを引き出す処理。
ありがちなのが乗り換えサービスで「大阪→京橋」を調べたいのに、
「大阪→京橋（東京）」ですか？とか聞き返してくるので自作を決意。

<strong>大阪駅から京橋（東京）なら、新大阪を経由に入れるわ！！</strong>:tired_face:

駅によっては上りだけとか、下りだけとか決め打ちさせてたりする。

もうちょっと汎用的に出来たらと思うけど、外部API呼ぶの結構費用かかりそうなので…
果てしなく、自分専用に特化したサービス。

#### 「経理」「月集計」
Google Fusion Tablesを練習がてらに使ったお小遣い帳。
「経理 りんご 100」みたいに、半角スペースで割って送るだけの簡易仕様。
「月集計」で、当月の使用金額合計が返ってくる。


#### 「～でしゃべって」
雑談時に適用する方言を設定する。
「愛媛弁でしゃべって」→「わかったけん」みたいな。
ドコモのキャラクタ変換サービス利用。
ほんとは天気予報とかも変換したかったけど、文字数多すぎて切られてしまったので、自然対話時のみに制限してる。

lineのuserIdと固定文言くっつけて、スクリプトプロパティでキー情報を管理している。

```docomoapituil.js
var dialects = {
  愛媛弁: 'ehime3',
  関西弁: 'kansai',
  博多弁: 'hakata',
  福島弁: 'fukushima',
  三重弁: 'mie',
  舞妓風: 'maiko',
  お嬢様風: 'ojo',
  武士風: 'bushi',
  ギャル風: 'gyaru',
  標準語: ''
};
```

####「今は何の方言？」
今設定してる方言コードを取得する(開発用)

####「ドコモのID教えて」
自然対話およびキャラクタ変換用にユーザー個別に発行されたDOCOMO側のIDを取得する。(開発用)

####「惑星の動き」「今日の天文イベント」「今月の天文イベント」「今月の星空」
[国立天文台の情報](https://www.nao.ac.jp/astro/sky/2018/09.html)をスクレイピング、整形して取得する。

####「～座の運勢」
yahooの占い記事をスクレイピングして取得する。

##おわりに
今後の展望として、検討・実装中の機能。

####星空解説
ゆめみちゃんさながら、プラネタリウムの説明みたいなのを実装する。
神話もセットでできればいいな。
→これを活用させてもらいましょう！[星座解説 - コニカミノルタ](https://www.konicaminolta.jp/planetarium/program/constellation/index.html)

####NASAとかの最新情報取得
RSS取得はできたけど、最新情報だけ通知するようにしたいので
そこをどうするか検討中。

####今日の一句
オーキド博士のアレみたいなもの。
実装方式を検討するところからスタート。

[^1]: Line WebhookObjectでのLineId。デフォルトのPush先はここになる。
[^2]: diagramutil.js
[^3]: treasureutil.js