heroku+S3で遅延証明書をクローリングするアプリを作った話

この記事は[フィードフォースエンジニア Advent Calendar 2015 - Adventar](http://www.adventar.org/calendars/906)13日目です

昨日、12日目は [今年ソーシャルPLUSで捨てられた技術たち | feedforce Engineers' blog](http://tech.feedforce.jp/socialplus-rip-technologies.html) でした!

#自己紹介

ドーモ、社内ニンジャスレイヤー推進おじさんのかせいさんです
普段はアプリケーションエンジニアとして、Railsアプリの運用、改善を進めております

#今日は何話すの？

heroku+S3で動作する遅延証明書クローラーを作ったので、それの技術的要素についてのお話をします

# 遅延証明クローラー?

[小田急線の遅延証明書のページ](http://www.odakyu.jp/program/emg/index.html)は過去1週間分しか残しておらず、月末にまとめて印刷しようとすると困ったことになるので、定期的にクローリングしてS3に保存してくれるスクリプトを作ってみました

クロールした後、こんな感じにクロールした結果の一覧を生成してくれます
(リンクをクリックすると、遅延証明のスクリーンショットが表示される仕様です)

![odakyu_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/5329/20227a03-e2d2-34b2-0d29-22eff31e2287.png "odakyu_-_Vimperator.png")


コードはこちら → https://github.com/kasei-san/delay_certificates

# どんな仕様なの?

- 小田急線の遅延証明書のページを定期的にクローリングすること
    - 小田急線以外も簡単に追加できること
- クローリングした結果を保存して、簡単に見れること
- **なるたけ金銭的なコストは掛けたくない**

# 技術的要素

上記を考慮した結果、こんなかんじになりました

- 遅延証明書は **PhantomJS** でスクリーンショットを取る 
    - HTMLのままだとcssとか画像の保持など考える事が多いので、
- **Heroku** で動作させる (無料なので)
- スクリーンショットの格納先は **AmazonS3** (安いので)

以下、技術的要素で自分がハマった所や知らなかった所をご紹介します

# 遅延証明書はPhantomJSでスクリーンショットを取る 

[Selenium](http://www.seleniumhq.org/) を使えば簡単にできます
こんなかんじ

```.rb
driver = Selenium::WebDriver.for(:phantomjs)
driver.get("http://www.google.co.jp/)
driver.save_screenshot(File.join("./google.png"))
```

こんな風に取れます(画面サイズなどはデフォルトのまま)

![google.png](https://qiita-image-store.s3.amazonaws.com/0/5329/d5189311-e407-0d40-1ee9-0495e81bd253.png "google.png")


# Herokuで動作させる

Herokuで動作させるにあたって、いくつか課題がありました

- HerokuでPhantomJSを動かす
- Herokuで単純なrubyスクリプトを定期的に実行させる

## HerokuでPhantomJSを動かす

Herokuのサーバには、標準でPhantomJSは入っていないので、インストールする必要があります

### PhantomJSのbuildpackを追加する

https://devcenter.heroku.com/articles/buildpacks

Herokuにはbuildpacksという、あらかじめビルドされたバイナリパッケージのコンテナがあります

普通は、こんな感じに使用する言語のbuildpackを指定するのですが...

```sh-session
heroku create myapp --buildpack heroku/python
```

PhantomJSのbuildpackもあるので、rubyとPhantomJSそれぞれをインストールしなければなりません

### 複数のbuildpackをHerokuに入れたい

[heroku-buildpack-multi](https://github.com/ddollar/heroku-buildpack-multi)を使います


### heroku-buildpack-multiを使う旨を宣言する

```
heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git
```

### .buildpacks ファイルに、インストールしたいbuildpackを記述する


```.buildpacks
https://github.com/heroku/heroku-buildpack-ruby
https://github.com/stomita/heroku-buildpack-phantomjs
```

あとは普通に `git push heroku master` すればrubyとPhantomJSがインストールされます。簡単!

### スクリーンショットが文字化けする!!

Herokuのサーバには日本語フォントがないらしく、PhantomJSで日本語のページのスクリーンショットを取ると文字化けします
そのため、`.fonts` ディレクトリを用意して日本語フォントを置いてあげる必要があります

- [heroku で phantomjs を使用した時に日本語が文字化けするのを解決する - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20130626/1372210417)

## Herokuで単純なrubyスクリプトを定期的に実行させる

こちらについては別記事にまとめたので、そちらをご参照下さい

- [Herokuで単純なrubyスクリプトを定期的に実行する - Qiita](http://qiita.com/kasei-san/items/909f17c2c42b7e3a8489#heroku%E5%81%B4%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99)

# 感想

HerokuではRails以外を動かしたことが、いままで無かったので色々わからない所が多かったのですが、いざやってみると色々な事が(無料で!)できるのだなぁと思いました
今まで、趣味でアプリを作るならwebサービスだろ! などと息巻いておりましたが、それにこだわらず、日々の不便を解消するようなスクリプトを作るのも中々楽しかったです
みなさんもよろしかったら、Heroku+S3で便利スクリプトライフを是非!


明日、14日目は [koshigoe](http://www.adventar.org/users/8658)さんのGraphQL話です!