Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
28
Help us understand the problem. What are the problem?
@wallkickers

【個人開発】ごみのお知らせをしてくれるLINEBot「ごみのお知らせくん」を作りました。

ゴミ情報をお知らせしてくれる LINEBotを作った話。.png

「あ、今日燃えるごみの日か...!」

朝の通勤中、ごみ捨て場を見て「今日が何のごみの日なのか」を思い出す...。
皆さんはこんな経験ありませんか?

「朝の7時頃に『今日は燃えるごみの日だよ!』とLINEで通知してくれたら嬉しいのになぁ...。」

という訳で今回作ったのが「ごみのお知らせくん」です。

■「ごみのお知らせくん」とは

ごみくん紹介.png

LINEBot『ごみのお知らせくん』は「今日が何のごみの日なのか」と「このごみはどの日に出せば良いのか」ということを教えてくれるLINEBotです。

機能1. 朝通知 ⏰

朝の7時頃に「当日のごみ区分」を通知してくれます。
「燃える」「燃やせない」「ペットボトル・有害」「資源」「プラスチック類」の5種類のごみに対応しています。

メッセージ例
燃えるごみの日
→「今日は燃えるゴミの日です。」

プラスチックの日
→「今日はプラスチック類の日です。」
...

僕の地域では地区によってごみの収集日が違うので、朝通知機能を利用する場合は住んでいている地区の登録が必要です。もし、3区に住んでいる場合は「3区」のようにLINEでメッセージをすると登録がされるようになっています。
ごみくん_区登録.png

機能2. ごみ出し検索 🔍

出したいごみをメッセージすると「ごみ区分」と「ごみを出すときのポイント」について教えてくれます。現在は「ひらがな」での検索のみ対応しています。

(例)
「かさ」とメッセージを送る
↓
検索結果:2件
・傘・パラソル(傘布)
埋立ごみ(燃やせないごみ)
※ビニール・プラスチック製の物はプラスチックごみに出す。

・傘・パラソル(傘骨)
金属類(資源物)
傘布は取り、プラスチックなど分別できる物は取る。

ごみくん_区登録.png

■システム構成

ごみくん_システム構成.png
LINEBot『ごみのお知らせくん』はAWS上に構築しました。

DynamoDBは朝通知を行うための地区情報の保存、CloudWatchは朝7時に朝通知を行うメソッドの実行に使用しています。

ごみの収集日やごみ区分については年度内は変わる情報ではないはずなので、それぞれ「ごみの収集日」ファイルと「ごみ区分情報」ファイルから読み取るようにしています。

■時間をかけた点

1. 「分かりやすさ」の追求

多くの人に使って欲しいと考えていたので「文章の分かりやすさ」「説明を必要最低限にする」「機能を盛り込み過ぎない」というのを念頭に置いて開発を進めました。文章については何度も読み直し、他の人にも分かりやすいかチェックしてもらいました。

LINEを使うサービスで注意しないといけないと考えているのは下記のようなことです。
・画面上にメニューを表示するとトーク画面が狭くなる
・トーク履歴を遡ることは滅多に無いので見たい内容は常に下にある
・ブラウザバックのように表示している画面の内容を丸々変えることはできない
そのため、ユーザーとのやり取りはできる限り少なく済むようにしています。

2. 町内すべての地区に対応

初めは自分の住んでいる地区だけに対応したLINEBotを作る方針で進めていたのですが、「せっかく作るなら他の地区にも対応させたい!」「ゆくゆくはもっとユーザーを増やしていきたい!」という欲が湧いてきました。そこで、ユーザーの住んでいる地区を登録できるようにし、地区ごとに対応したごみの情報を配信できるようにしました。可能な限りシンプルに登録ができるように「3区」とメッセージをすれば登録できるようにしています。

3. Dockerによる開発環境構築で他のLINEBot開発にも応用可能

これは開発面での工夫になりますが、他のLINEBot開発にも使えるようにするため、Dockerでの開発環境の構築を行いました。

今回、Lambdaを使うため、LINEBotのソースとライブラリをzip化する必要がありました。そこでDockerで開発環境を作り、ライブラリのインストール場所をホームディレクトリにしてzip化するという方法を取りました。そのため、このテンプレートがあれば「functions.pyの変更」と「ライブラリのインストール先をルートディレクトリにする」だけで他のLINEBot開発にも使えるはずです。

テンプレートについては後日、githubにアップする予定です。

■苦労した点

各ごみの収集日を記載したファイルの用意

僕が住んでいる所ではごみの地区、ごみ区分が複数あります。ごみの種類のうち、「不燃ごみ」「ペットボトル・有害ごみ」「資源ごみ」については月に2回ほど収集日があり、地区によって収集日が異なります。

区ごとに各ごみの収集日をファイルにして、今日の日付がファイル内に存在するか否かで今日のごみの日を判別する、というように作ったため、日付を入力したファイルを「区*ごみ区分」の数だけ用意するという作業が必要でした。これはひたすら、ごみ収集カレンダーとにらめっこしながら日付を打ち込みました。

『なるべくシンプルにスモールに』で進めていたため、このようなことが起きましたが、今後も発展していくようであれば『収集日はDBに保存。区と日付を渡せば今日のごみを返してくれるAPI』があればもう少しシンプルになるのかと考えています。

メッセージのおうむ返しまで時間がかかった

はじめは処理速度を考慮してGoによる実装を検討していたのですが、「送ったメッセージ内容をそのまま返答する」というシンプルな「オウム返し」機能ですら時間がかかってしまいました。Go,Lambda,LINEBotについて実装経験が豊富な訳ではなかったため、事例が豊富にあったPythonによる実装に切り替えました。

メッセージのオウム返しができてからはスムーズに開発が進んだかなと思います。最初の一歩が大変でした。

■なぜ作ったのか

身近な人に役立つものを作りたかった

最近訪れた所でとても面白い場所がありました。
そこでは「自分が住んでいる地域の発展のためにみんな"何か"をやっている」という場所です。本業とは別でいろいろなことをやっている方々と出会い、「自分も何か身近な人のために役立つものを作りたい!」と思ったのが、本記事のLINEBot『ごみのお知らせくん』を作ったきっかけです。

LINEBotを作りたかった

「多くの人に使って欲しい」という思いがあったので、多くのスマホにインストールされているであろうLINEを活用しました。LINEBotであれば友達追加をするだけで使うことができる、アプリのようにストアからインストールを行うという手間も省けると考えていました。結果、QRコードを読むだけで友達追加画面になるので、このお手軽さを使ってもっと広めていきたいです。

■まとめ

これが今回一番の気づきだったのですが、高いモチベーションを維持したまま開発できたのは、僕が「作りたいもの」について、他の人に「あったらいいね!」と言ってもらえたのが大きかったと思っています。実際のユーザーが身近であればあるほど、サービスを使ってもらえるイメージがしやすいので最後まで情熱を持って開発しきれました。

「やっぱり、個人開発は楽しいなぁ」としみじみ思いました。次はこのLINEBot『ごみのお知らせくん』を多くの人に使ってもらえるように動いていきます。

それでは!

■参考リンク

API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]
https://qiita.com/w2or3w/items/1b80bfbae59fe19e2015

API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [後編]
https://qiita.com/w2or3w/items/fbe588d7147bb8e65628

line-bot-sdk-pythonを使ってみた
https://keinumata.hatenablog.com/entry/2018/05/08/122348

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
28
Help us understand the problem. What are the problem?