特異点の向こう公式LINE bot

「特異点の向こう」開設1周年を記念して、特異点の向こうの新着記事を毎朝通知するLINE botを作った(誰得)。

登録は以下のQRコードから。無料版なので先着50名です。あまりにも需要があるようであれば課金して無制限にするかもしれない。

f:id:pepsisoda:20200620003208p:plain

動機

サークルの先輩達がコロナ関連のLINE botを作っていてすげーとなったので、俺も作ってみたくなった。

「俺がみんなに届けたい情報とは何か?」と考えた時に、真っ先に思い付いたのはこのブログの情報を広めることだった。自己顕示欲の塊なので。

ということでスクレイピングの練習も兼ねてこのブログの最新記事を取得して通知するLINE botを作ることにした。

やったこと

LINE botなんて3時間もあればつくれるだろ!wと思っていたが、3日くらいかかってしまった。やったことをメモしておく。

まずLINE botの作り方を学ぶ。ググります。アカウント作ってサーバー立てて適当に連携させればよいらしい。Pythonと結婚しているのでPythonで書く。調べていくと、Flaskで書くのが楽そうでいい感じ。スクレイピングの方は、以前サークルでスクレイピングの紹介をやっていたのを思い出して、その時のプログラムを引っ張ってきていじった。基本的にはrequestsで https://randomthoughts.hatenablog.com/archive のHTMLを取得して、BeautifulSoupでそっから要素を取ってくるという感じである。

動くものができたのちHerokuでデプロイしたが、Herokuの無料版は一定時間トラフィックがないとアイドリングになってしまうので、毎朝8時にスケジュールしていたタスクが実行されなかった。お金を払えということですね。ごめんなさい…。

代わりに他の無料のPythonサーバーであるPythonanywhereを使うことにした。しかしプログラムから外部のサイトにアクセスすることができない。無料版ではホワイトリストに登録されているドメインにしか接続することができず、任意のサイトにアクセスするには課金する必要があるらしい。お金を払えということですね。ごめんなさい…。

俺は泣きながらPythonと離婚式を挙げ、Google Apps Scriptで書くことにした。これは無料、サーバー立て放題、スケジュールも簡単、外部のサイトにアクセスし放題という神サービスである。PythonのプログラムをJavaScriptに書き換えるのは面倒だったが何とか動くものができた。

主な機能は、

  • 毎朝8時にスクレイピングをして前日に公開された記事を取得し、それを通知する。
  • ユーザーからクエリが飛んできたときもスクレイピングをして最新記事を取得する。

というものである。

ひまだったら他の機能も追加するかもしれない。

ちなみに最初やろうと思っていたことは、30分に1回くらいスクレイピングをして新着記事があれば通知し、クエリが飛んできたときはスクレイピングをせずDBから引っ張ってくるというものだったが、めんどくさいのでやめた。DBを使わないとなると、前回のスクレイピング以降に公開された記事があればそれを返す(例えば30分ごとにスクレイピングするのであれば、過去30分以内に公開された記事があればそれを返す)みたいなことをすることになると思うけど、公開時間の判定がめんどくさかったのでそれもやめた。公開日だけならURLに書いてあるので、1日ごと更新という形にした。

使い方

友だち登録
このページのQRコードから登録してください。誰が友だち登録したかが開発者に知られることはありません。
(知るプログラムを書くことはできるが、それは新しく登録されたときしか知ることができないので、すでに登録している人を知ることはできないし、知ったところで無意味なのでやりません)

チャット
「使い方」と送信すると、このbotの使い方が表示されますが、ここでも簡単に説明しておきます。
「トップ」と送信すると、このブログのトップページのリンクを返信します。
「最新記事」と送信すると、最新記事を取得してそのリンクを送ります。
「メッセージ:(任意の文字列)」と送信すると、コロン以下の文字列が筆者に匿名で送信されます。コロンは全角でも半角でも構いません。
その他の文字列を送信すると、オウム返し笑をします。
ユーザーのチャットの内容を開発者が知ることはありません。これも、知るためのプログラムを書くことはできますが、開発者はユーザーのプライバシーを重視するという高尚な理念を持っているため、そのようなことは致しません。

通知
毎朝8時~9時に、前日に公開された記事があればそのリンクを送信します。

最後に

結局開発プロセスがクソofクソになってしまったが、動いてよかった。次はちゃんと調べてから実装しようね。でもいろいろな新しい技術に触れられたのは良かった。

動作例を貼っておく。

f:id:pepsisoda:20200628140924j:plain:w300

f:id:pepsisoda:20200628140938j:plain:w300