LINE BOTでしゃべるイッヌ飼いはじめたよ!

暴力はよくないヨォ君ィ!

前々から父親が母親に対して精神的DV気味でしてね…
7〜8月入ってからはちょっと落ち着いてはいるんですが、
度々起こると家の空気が悪くて体調に響くんですよ…
で、自分にもちょっと何かできないかということで、
不満だとか言われた主にお掃除周りで「クエストを発行してポイントを貯めて、貯まったポイントでご褒美をもらおう!」的なアレのソレを作ることに相成りました。いや子供か!(

正直人によって得意不得意や体力気力のリソース量は違うんやから、
自分以外の人間と共生する場合は「やれる人間がやる」のスタンスでいいと思うんですけどね。
あと目に見えないからってやってないって決めつけるの良くないよね。子供か!(

人が多いんだから汚れるスピード速いのは当然ですやん…?しかも部屋数多いし。

なので見えるようにしてやろうじゃあねーかって事ですわ。
逐一報告すんのはめんどくせーけどご褒美がもらえるならやる( ˘ω˘ )←子供

さー作ってくっぺ!

クエストを発行するにあたってまず皆のスマホに入っている共通のアプリは〜と考えた結果、
LINEなら既に導入していて新しくアプリ入れる必要もないのでLINEでやることにしました。

とりあえずクエスト報告用のLINEグループを作って、
そこにLINE BOTを導入してみようと思います。
報告したら褒めちぎりつつポイントくれる感じがいいすね。コウぺんちゃんみたいな可愛いのがいい。

BOTはDiscordとSlackのをググってちょっといじった事があるのでまぁ大丈夫だろう…
とりあえず検索で出てきた中では新しいっぽいこちらの記事を参考に導入を試みてみました。

「LINE BOTの作り方 -Messaging APIで開発編-」の欄ですね。
ちょっとプログラム使う方と使わない方の区別がぱっと見わかりにくいから、使わない編(LINE管理画面で作成編Iの場合)、使う編(Messaging APIの場合・FirstContactの場合)みたいな感じで分けてくれたらいいのになって思いました。
Messaging APIを利用してのBOT作成には「LINE Developers」への登録も必要みたいっす。

ていうか「LINE公式アカウントの作成」の欄も馬鹿正直にやったら重複して公式アカウント作っちゃったので、「LINE BOTの作り方 -Messaging APIで開発編-」の欄だけみてけばいいのでは…
新規プロバイダー作成で生み出したBOTは「Messaging API設定」タブの「グループ・複数人チャットへの参加を許可する」を有効にした上で、同ページにあるQRコードを自分のLINEのお友達追加QRコードカメラで読み込めば友達追加できるので、そしたらグループに招待すればOKでした。
LINE公式アカウント名は「キャラクター名+アプリ名」にしとくとよりわかりやすくて良き。

リクエスト制限とか諸々確認

利用規約をそれとなく読んでいきます。この規約ちょっと上からな感じがしますね(
リクエスト制限について規約内では具体的な数が分からなかったので調べてみました。
家族6人で使用する場合、現時点では一人当たり10リクエスト/日で考えておけばひっかからなさそうなので行けそうです。

禁止事項とかなんかいろいろ書いてありましたが、
詰まるところLINEの資産情報を漏洩したり負荷かけすぎたりだとか、
悪いことやLINEにとって迷惑なことをやらなければ大丈夫なんでしょうね。
今回は家族内の問題解決のための非営利個人利用なので大丈夫でしょう。うん。

余談:いつも思うんですけど、こういう規約系はもっと自分みたいに頭悪い人にも理解できるような言葉で示してあげた方がいいと思うんですよね。疲れるんや。読むの。Skebさんとか秀逸ですよ。ちゃんと読ませる努力してる。えらい。

ちなみにラインアカウントの無料プランは現時点では1000通/月のメッセージが返せるようですね。

とりあえず開発者アカウント

名前とEメール入れて、規約の同意にチェックを入れればアカウントの発行は完了です。
DeveloperIDとかみれるプロフィールページが表示されました。
メールのとこに「Your email is not yet verified」と出てたので、
隣のボタン押す→送られてきたメール内のリンクへ飛ぶでベリファイもしときました。
※プロフィール確認終わった後に見つけたけど、画面右下に言語選択あったわ…そうだよな日本の会社だもんな日本語あるよな…規約も日本語あったしな…

あとは記事を読んだりググりながらBot作成やで

BOTを稼働させる

「新規プロバイダー作成」押すと、画面の下の方にプロバイダー名入れる欄とか出てきてました。
ボタン押したら多少画面スライドさせるとかして欲しいなー(*´ ˘ `*)?
初見で画面になんのアクションもないから焦ったやん^p^

「プログラムの内容を書き込む」の欄に出てくる「アクセストークン(ロングターム)」というのはおそらく「Messaging API設定」タブの「チャネルアクセストークン(長期)」のことと思われる。

スプレッドシートのセル取得やらなんやらはこれらの記事がわかりやすかった。感謝ーーー
(最後の記事はコード内に全角スペース入ってたりコロンの省略の可否とかが不統一なので「コピペでOK」とかいうのはうそまつだた^p^)

特定の文字列に反応して処理を振り分けるようにしたかったので、Switch文上で文字列を検索して該当の処理をする方法も探しました。このあたりの記事がよき感じ〜

父と母は専用クエストを設けているのですが、家庭内なので条件分岐的には専用クエのチェックは省いてしまいます。
(省かない場合は、多分ちゃんと専用の分岐を作った上でIDチェックを挟めば実装できると思う…)

分岐ワードの整備

無事にマメタローがポイントをカウントしてくれるようになったので、あとは正規表現との戦い…
一通りのクエストの正規表現が打ち込めたら、
クエスト一覧表を作りながら動作チェックをしていきます。
case /((バスタブ).*?((|あら)|((|そう)(|))|((||)(|れい|レイ))))/.test(input.text):
最初の状態だとレベル2のやつがレベル1のワードに
引っかかっちゃったりしてたんですが、
caseのところの正規表現はこんな感じで一つの()内に
反応させたいワードの塊を入れていくとちゃんと反応してくれました。この辺は国語力が問われます(

クエスト一覧作成

※これはこれで面白いけど、この後スタンプには反応返さないように調整したりしました

字詰めとかはめんどくs…時間という名のコスト削減のため等幅フォントを使いました。
ロゴ少し凝ったからゆるして(

画像は完成したのでこいつを印刷して冷蔵庫やトイレの壁にペタッと貼る予定ですが、せっかくならLINEからも確認できるようにしたい。
ただ、なんかGoogleフォトの写真を直接貼り付けるGASの記事はなかったので、とりあえず共有アルバムを作ってそのURLをマメに教えることにしました。

わざわざPC開いてクエ報告はしないと思うので今回は見なかったことにします( ˘ω˘ )

検証時には表示されていたグーグルフォトの共有画像が何故だかボケボケのボケで、ろくに使えないことになってしまったのでググったらもっと脳死で実装できる楽な方法があった…!
「Bloggerを利用したGoogleフォト画像の貼り付け方法」という項目を応用すれば、
Bloggerへの埋め込み用画像URL(とサムネ用のURL)が抜き出せます!
これで抜き出したURLをメッセージに配列で突っ込んでやればうまく行きました…長かった…。

ヤッタゼ!

定期メッセージの設定

調べたら普通にこれもGASとかで実装っぽい。
LINEのメイン機能には繰り返し通知がないっぽかった…
ゴミの日とか緊急クエストの通知とか、お知らせしたい通知を時限式で設置。
トリガー便利ね…感謝

おそらく完成!

2〜3ヶ月は試運転しておかしなことが起きないか見てみようと思います。
多分GASのトリガーさえちゃんと動いてれば完成だ…( ˘ω˘ )

問題なさそうだったらお友達も使いたいって言ってたので、
そのうちテンプレデータを一般公開したり、
技術的に自分で弄れない場合は、
タダでは人件費的な意味でちょっとムリですが
スプレッドシートとスクリプトの初期データ作りだけ
テンプレデータ使って各自ご用意いただいて、
後の初期設置を私がやるのもいいかもですね。
おそらく2〜3日もあればそれぞれのご家庭用にカスタマイズ可能だと思うので…^p^

試運転開始当日に早速バグリズムwww

ポイント計算まではうまく行ってたんですが、
いざ皆で使ってみるとシートの一番上の人以外の得点をシートに再記入する際に、
「記入するセルが10行ずれる」というバグがありました…
原因はFor文で回していた「i」に「parseInt」をかましていなかったことでした…
「parseInt(i, 10)」にしたら動いたよ……

どうやらスプレッドシートの情報を引っ張ってきていたからか、
「i」が「文字列」として推論されていたようです。
作ってる時には自分のIDは0番目に格納されていたので、
「0+1=1」ではなく「0+1=01」のようになっていたのですが、
それをスプレッドシートが勝手に「1」に直してくれやがったから
正常に動いてしまいバグに気づかなかったようです。

これ上から2番目のユーザーとしてチェックしてれば、
「1+1=11」でそのまま事件起こって、初っ端からバグとりできてたよね…

今後なにか作る際は2番目の人のチェックも怠ってはいけませんね。
あと「i」に何か数字を足す際は「parseInt(i, 10)」の事を思い出すようにしよう⊂≦(:3⊂⌒ゞ~

20/10/08追記:曜日判定バグ

第1水曜日とか第2水曜日とかの判定が
イマイチうまくいかない時があったので調べたところ、
以下の2記事の複合が最適解のようです。

年末年始はゴミ収集ないから
これに「!="12/31"」を追加で条件付けしてあげれば良さげ?