ごみ収集日前にアラートを出すLINEbot

meet line-bot

最近 引越をした友人から「ごみ出しリマインダーを作って」と言われ模索することに。

ポイントは既存かつよく使用するアプリでリマンドできること。
APIもSDKも用意されているLINEがぴったりだと思い、挑戦しました。

構想

  • Springのスケジュール機能(cron)を使って、ごみ収集日前に該当者へリマインドをプッシュ
  • 該当者から何かメッセージが来たらレスポンス
  • ごみ捨てが終わっていたら褒め、まだだったら捨てようねと励ます(大事)

レスポンスに応対する箇所は「Webhook」、リマインド箇所は「Messaging API」で実装します。

環境

  • jdk1.8
  • Spring Boot
  • Heroku

herokuでアプリケーションの作成、LINEでチャンネルの作成、Webhookの有効化、Webhookのurlの登録が必要です。

SDKの使い方に慣れる

まずLINEでチャンネルを解説し
SDKのページにあるサンプル「echo」をherokuにデプロイし、エコーバックを楽しみました。
続いてサンプル「kitchensink」をherokuにデプロイしどのように作ればいいかを理解。
機能が網羅されているので、掴みやすかったです。

プロジェクト構成

依存関係

1
2
3
4
5
<dependency>
<groupId>com.linecorp.bot</groupId>
<artifactId>line-bot-spring-boot</artifactId>
<version>1.11.0</version>
</dependency>

LINE Messaging API SDKを追加します。

プロパティ

1
2
3
line.bot.channelSecret = XXXXX
line.bot.channelToken = XXXXX
line.bot.handler.path = /callback

LINEで開設したチャンネルの情報を設定します。

プッシュの実装

confirm.png
ごみ出しが完了したか確認するため、確認テンプレートを使用します。

コントローラ化する必要はありませんが、GETで呼び出せるようにすると確認する時に楽です。

余談ですが作っている当初、この部分ははSDKを使わずに地道実装していました…w
#こちらでも動作はします。

レスポンスの実装

Webhookはメッセージやスタンプなど何か送られた際に応答を返すことができます。
確認で「はい」もしくは「いいえ」が返却されるようにしたので、この2つのワードを拾い
スタンプとメッセージを返すようにします。

replyにreplyTokenとメッセージを設定します。
メッセージはコードに記述しているようにリストで複数設定することができます。

スケジューリング

Springのスケジュール機能@Scheduledを利用します。

※@EnableSchedulingアノテーションをmain関数のあるクラスにつけるのを忘れずに

備考

環境変数

1
2
3
4
line.bot.channelSecret = ${LINE_BOT_CHANNEL_SECRET}
line.bot.channelToken= ${LINE_BOT_CHANNEL_TOKEN}
cron.setting = ${LINE_CRON}
garbage.reminder.id = ${LINE_ID}

環境変数は全てherokuに持たせるようにしました。
コンソールで変更できるのでらくちんですね!

botのアイコン

アイコンはtabagotchiから拝借。
お気に入りの拡張機能です

動作確認

まとめ

SDKを使用すると、すっきり書けて楽ですね。

自前実装ではOkHttp3ClientHttpRequestFactoryを用いたRestTemplateの実装ができました。
こういう小さな達成感は大事(笑

楽しく書けました X)
あとは気に入ってくれるといいなぁ

ソースコード

https://github.com/aytdm/garbage-reminder-bot

参考

okHttpに触れてみる

先日、JJUG CCC 2017 Springへ行った際に
ANDRESさんの講演で紹介されたライブラリの1つokHttp

これまでHttpURLConnectionで
地道に頑張っていたので、これを機に触ってみようと思います
#2017残り半分のテーマは最近のライブラリに触れることだなぁ…

レシピを見ながら実装してみたところ
ごちゃーと書いていたものが、かなりすっきりする印象

RequestBodyを送らないPOSTで
詰まったけど、こうしたら大丈夫でした

1
2
3
4
5
6
Request request = new Request.Builder()
.url("https://hogehoge.com")
.header("Accept-Charset", "UTF-8")
.addHeader("Content-Type", "application/json; charset=UTF-8")
.post(RequestBody.create(null, new byte\[0\]))
.build();

可読性も上がるし、これは使えるようになりたい
あとは講演で紹介されていたRetrofitの組み合わせでできたら素敵
もうちょっと触って慣れたら挑戦してみようと思います

Spring BootとThymeleaf、lombokに触れてみる(2)

昨日は一覧表示部分のみ作成したので
ボタン押下遷移先などを引き続き制作します。

ボタンのリンク先設定でつまりました。
みんなformのacitionで送ってるけど、
ボタン押下で飛ばしたい場合は表記をどうすれば・・・

いろいろ検索してボタンをaタグで括る方法を見つけました。

1
2
3
<a href="" data-th-href="@{/show/__${user.id}__}">
<button class="btn btn-info" >Query</button>
</a>

いけた・・・!

思うところがあり、最終的にこうしました。

1
<button class="btn btn-info" th:attr="onclick='location.href=\\'/show/__${user.id}__\\''">Query</button>

エスケープ処理の多さよ。。。
もっといい書き方あるんだろうけど、今はこれが限界。

Thymeleafのタグの理解がまだまだ浅いなぁ。

Spring BootとThymeleaf、lombokに触れてみる

MkyongさんのMVC解説「Spring MVC form handling example」の
ソースをベースにSpring BootとThymeleaf、lombokに触れてみる。

具体的には以下4つに取り組みます。

  1. Spring Boot使用
  2. jspをThymeleafを用いたhtmlへ変換
  3. lombok使用
  4. O/RマッパーにDomaを使用

これまでSpringはMVCを扱っていたので、流行のBootを触ってみたい、
画面もjspを扱っていたので、Thymeleaf使ってみたいという衝動に駆られ。
lombokも扱ったことがないので(ry

Domaはlombok相性が悪いと聞いたけれど
公式にサポート概要が出ていたので実践!

一覧だけ作成。
ちゃんと表示できた:)

今日の所感:
lombokすごい。
bootも楽ちん。
Thymeleafはまだよく分からない・・・。

ビルド時にwebpack、webpackしたものをwarに含める

mavenでビルド時にwebpackしてwarに含める方法ないかなぁ・・・と
思っていたら良さげなプラグインを発見。

1
2
3
4
5
6
7
8
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<!\-\- Use the latest released version:
https://repo1.maven.org/maven2/com/github/eirslett/frontend-maven-plugin/ -->
<version>1.4</version>


これでいけるのね、便利。
package.jsonで依存関係のあるモジュールのバージョン差異も起きない(`・ω・´)


2018/5/10 追記

使用例:
https://github.com/aytdm/study-springboot-mongodb-angular/blob/master/backend/pom.xml