PythonとMySQLで、雨が降る前教えてくれるLINEBotを作った

PythonとMySQLを使ってLINEBotをつくりました。

今回作ったBotアプリはこちら!

雨が降ってきたのに気づかなくて干してた布団がびしょ濡れになった恨みをぶつけて開発しました笑
今回このBotをつくるにあたって、ユーザーの位置情報を登録するためにDBを使う必要があったので、SQLについて一から勉強しました。
学習&制作期間はおよそ一週間でした。

学んだことや教材などを初日から振り返っていきます。

もくじ

  1. 1日目:LINEBotでDBを使おうと思い立つ
  2. 2日目:DBの環境構築に手こずる
  3. 3日目:PytonでSQLを操る
  4. 4日目:SQLを学びつつYahooAPIと接続
  5. 5日目:Heroku上にMySQLの環境構築
  6. 6日目:BOTが完成するも、謎のバグに苦しむ
  7. あまがえるBOT

1日目:LINEBotでDBを使おうと思い立つ

思えばあれは、Javascriptの勉強をしている最中でした…。
イヤホンをして勉強をしていたら、いつの間にか雨が降っていたことに気づかず、干していた布団がびしょ濡れになっていたのです…・

そこで僕は思いました。
自宅で雨が降る直前に通知をくれるアプリさえあれば…!

ここから僕の一週間の戦いが幕を開けたのです。

天気を知るAPIはいくつかありましたが、今回はYahooAPIを使用することにしました。
理由は、Pythonでの使い方がわかりやすく書かれた記事を見つけたからです笑

参考にした記事はこちら。
Yahoo! Open Local Platform (YOLP) を使ってお天気情報を取得したついでにラズパイにAquesTalkPiで喋らせてみる

さて、気象情報を取得するAPIは簡単に使えたのですが、ここで1つ問題がありました。
DBを触ったことのなかった僕は、APIを利用するための位置情報を保存する手段がなかったのです。

これはSQLについて学ぶチャンス!
というわけで早速勉強をはじめました。

SQLの教材はとりあえずProgateを使いました。
ここまでが初日。

2日目:DBの環境構築に手こずる

SQLについて概要はつかめたものの、どうやらDBには色々な種類があることがわかりました。
SQLite、MySQL、PosgreSQLなどなど他にもたくさんあり、何を使ったらいいかよくわからない状況でした。

色々調べた結果、Herokuで使用できて、かつシンプルで使いやすいMySQLを使うことにしました。
MySQLはシンプルで早いのが売りらしく、GoogleやYahooのサービスでも利用されているという記事も見かけました。

しかし、早速使ってみようと試みるも例によってローカルの開発環境構築でつまづきました…。
どうして環境構築って毎回こう大変なのでしょう。

Ubuntu18.04にMySQLの環境をつくる【備忘録】

なんとかローカルでのMySQLの環境構築を終えたものの、さらなる難関が待っていたのです。

3日目:PytonでSQLを操る

さてさて、無事にローカルにSQL環境が構築されたわけですが、BOTで使うにはこれをPythonで操作できるようにしなければいけません。
Pythonで簡単なSQL操作を行うコード自体は難しくはなかったのですが、一切ログインできないという問題が発生しました。

エラーログを見てもさっぱりわからず、MySQLのドキュメントを読んだり、エラーログを検索してみたり、試行錯誤すること数時間…。

ついに成功!!
単純に最初の初期設定で、sudoユーザー以外がログインできないような設定にしていたことが原因でした。
エラーって、解決するとなんてことない内容が多いですよね。

ちなみにエラーと格闘する中で知ったことなのですが、MySQLのウェルノウンポートは3306らしいです。
時間はかかりますが、独力でエラー対処をしていると色んな学びがありますね。

さて、話はそれましたが、3日かけてようやくPythonでMySQLを操作するスキルを身に着けたので、いよいよ4日目からはBOT開発に着手していきます。

4日目:SQLを学びつつYahooAPIと接続

SQLの書籍も購入し、調子よくユーザー情報登録機能とWEBアプリ連携の実装を進めていきました。

ちなみに、YahooAPIを使った天気情報の取得はめちゃめちゃ簡単でした。

なんやかんやでアプリの大枠ができたので、Herokuへのデプロイをしていきます。
しかし、今度はHeroku上でMySQLの環境構築を行う必要があり、またしてもハマってしまったのです…。

5日目:Heroku上にMySQLの環境構築

MySQLの用意自体は比較的簡単にできたのですが、Pythonとの接続で何故か弾かれるエラーが発生しました。

試行錯誤した結果無事解決したのですが、どうやらPythonでSQLに接続するために使っていたモジュールの最新版がHerokuで使用できないのが原因でした。

前にもwhitenoiseの導入の時に似たようなエラーにぶつかったことがあったので、スムーズに解決できました。
やっぱりエラー対処の経験は蓄積しますね。
たくさんデバッグしましょう。

あと一歩のところまできてテンションが上がってます。
趣味プログラマは、どうしても仕事が中心になるので時間の確保大事ですね。
プログラミングは朝が捗るのです。

6日目:BOTが完成するも、謎のバグに苦しむ

その後無事にBOTが完成し、公開にこぎつけたのですが、待っていたのはバグ地獄でした笑

最初にぶつかったのは、DBに2回以上接続しようとすると弾かれるという謎のバグでした…。
全然原因わからなくてMySQLのドキュメントを頑張って解読しようとしてました。

1人で開発するときって、プログラミングだけでなくてインフラやDB、ネットワークなんかの知識もある程度必要になりますね。
今のテクノロジーって高度にブラックボックス化されてて、中々全容を把握できないので大変です…。

とはいえ、このバグも原因はなんてことないシンプルなものでした。

一旦接続を切らなきゃいけなかったんですね。
そりゃ、接続しっぱなしのところにもう一度接続しようとしたらエラーになりますよね。

一難去ってまた一難、接続の問題は解決したのですが、今度は別のエラーが発生しました。
原因は言語化しづらいんですが、どうもDBに短時間に連続して接続するとエラーが発生するようで、DBへの接続と切断をメソッドごとに行っていたらエラーが発生するようになったようです。

今回のBOT開発を通して、設計の重要さを痛感しました。
どんな技術を使うか、どんなアルゴリズムを組むか、どんな流れで動かすか、無数の選択肢の中から目的に合わせて最善の選択をするには広く深い知識が必要なんだろうなぁと感じます。

あまがえるBOT

ちなみに完成したBOTはこちらです。

トライアル版なので最大50人しかユーザー登録できないのですが、まだ空きがあるので、よければ友達追加してみてください笑
サービスが終了してリンク先にいけない場合がありますがご容赦ください。