前回はサーバで起動してLINE通知するところまで。 このままだとサーバ側で手動で起動しないといけない。これを解決する。

起動タイミング

仕様

cronで周期的に実行する仕様や、手動で合図してから一定時間だけ連続起動する仕様など、いくつか考えたが、 結局は手動で合図したタイミングで1度だけ起動する仕様にした。

LINEでタイミングを通知する方法であれば、手動でも大した手間ではない。

妥協案とも言える仕様だが、この仕様にした一番の理由は、 頻繁にアクセスすると、ロボットと疑われてCAPTCHAでブロックされてしまうため。 これを解除することもできるとは思うが、一気に難易度が上がるので今回は見送ることにした。

流れ

以下のような流れで起動要求を伝達する。

LINEで起動要求

LINEからGoogle Apps Scriptのスクリプト実行

ソケット通信でスクレイピング開始要求

実装

まずは前回まで作ったクローラーを、ソケット通信をトリガにして動作するようにする。

+require 'socket'

+gs = TCPServer.open(12345)
+addr = gs.addr
+addr.shift
+printf("server is on %s\n", addr.join(":"))

 crawler = LineKindleHighlights.new

+loop do
+  s = gs.accept
+  print(s, " is accepted\n")
+
   crawler.scrape
+
+  print(s, " is gone\n")
+  s.close
+end

これでポート12345番でアクセスされると1度だけ動作するようになる。

つづいて、LINEをトリガにして動作するスクリプトをGoogle Apps Scriptとして作成する。

function doPost(e) {
  Logger.log('doPost')
  var events = JSON.parse(e.postData.contents).events;
  events.forEach (function(event) {
    if (event.type == "message") { UrlFetchApp.fetch("http://your_server_address.com:12345"); }
  });
}

こんな感じでウェブアプリケーションとして導入して、LINE側のWebhookアドレスに紐付けると、 BOTに話しかけたタイミングでソケット通信が飛ぶようになる。

続きはこちら