競プロの日程を通知する Line Bot を作った話

久しぶりの更新になりました. みなさんこんにちは granddaifuku です.
この度, 競プロ (AtCoderCodeforces) のコンテスト情報を教えてくれる Bot を作ったので少しだけそれについて書きたいと思います.

送ってくれる情報

  • AtCoder
    • コンテスト名
    • コンテストの開始, 終了時間 (JST)
    • Rated 対象となるレート
  • Codeforces
    • コンテスト名
    • コンテストの開始, 終了時間 (JST)
  • yukicoder
    • コンテスト名
    • コンテストの開始、終了時間 (JST)

使い方

  1. Line アプリをインストールします
  2. Bot を友達追加します(以下にQRコードがあります)
  3. 友達追加した Bot をグループや個人トークに呼びます
  4. トークルーム内で "コンテスト"(現在はカタカナにのみ対応)が含まれる文章を打つとBot が反応して メッセージを送ってきます.
    f:id:granddaifuku:20200515233327p:plain

使用した言語や仕様, お世話になったサービス

  • PythonGolang
    Bot 自体の開発の言語として使いました. Flask を主に使っています. また, Codeforces は公式の API を叩いてコンテスト情報を得ているのですが, AtCoder にはそういったものが存在しないため, Beautiful Soup を用いて, AtCoder のコンテストページをスクレイピングして情報を取ってきています。 基本的な機能をそのままGolangでの実装に移し替えました。
  • Heroku
    デプロイ先として heroku を使用しました. 初めて使ったんですがコマンドラインからめっちゃ簡単にデプロイできたのでおすすめです。
  • ngrok
    ローカルのサービスを一時的に外パブリックに公開できるサービスで, Bot を本番環境にデプロイする前にテストとして使用しました. めちゃ便利でした。

つまづいたところ

  • スクレイピングなり, API を叩くなりして得た結果を Line で送信する際に, text 形式でトークルームに送信するのではなく flex メッセージという送信する際の見た目を整えてくれる形式で送信することにしました. flex メッセージは json 形式で箱型などメッセージの形を指定するのですが テンプレートにテキストを追加したりするのが面倒でした.

改善点

Codeforces の情報を公式の API を叩くことで取得しているのですが, API を叩く際にコンテストを指定できないため, 過去全ての分が送られてきます. そのため, API 自体が遅くデータを得てから送信するまでにも時間がかかってしまうので何とか高速化をしたいなと思っているところです.
Postgresql を用いて高速化しました。

実際の使用感

f:id:granddaifuku:20200122210155p:plain
このような感じで "コンテスト" という文字列を含んだ文章を送ると Bot が上記の情報を送ってきます.

関連リンク