URLのOGP情報をスクレイピングするだけのWebAPIを作った

サイトのOGP情報をスクレイプするのが面倒なので、OGP情報のスクレイピングし、JSONに変換して情報を返すだけのマイクロサービスを作った。 マイクロサービスというか、用途的にはDockerが向いていると思ったので、Dockerイメージにもしてあります。

WebAPIから利用する

$ curl https://powerful-sierra-79664.herokuapp.com/?url=http://ogp.me | jq

{
  title: "Open Graph protocol",
  description: "The Open Graph protocol enables any web page to become a rich object in a social graph.",
  image: "http://ogp.me/logo.png",
  url: "http://ogp.me"
}

リポジトリにあるDockerComposeから利用する

同梱されているDockerComposeを利用して簡単に使い始めることも可能です。

$ docker-compose up

$ curl http://localhost:8080?url=http://ogp.me | jq

{
  title: "Open Graph protocol",
  description: "The Open Graph protocol enables any web page to become a rich object in a social graph.",
  image: "http://ogp.me/logo.png",
  url: "http://ogp.me"
}

Dockerイメージから利用する場合(Redisが必要です)

$ docker pull webuilder240/ogp_parse_api
$ docker run -p 8080:8080 webuilder240/ogp_parse_api

注意事項

  • Productionで利用する場合、サーバーサイドの前段でキャッシュを取ったりはしていないので、このMicroServiceの前にCDNを利用することを推奨しています。
  • バックエンドにRedisを使っているので、Redisを事前に用意してください。*1

その他の詳しい情報についてはGithubあたりに置いているREADMEをご参照頂ければと。

なんか特徴があるとすれば

  • Sinatra使ってる
  • 本体のコードは100行未満で、めっちゃ短い
    • ただ他のライブラリに依存していないとは言っていない。
  • バックエンドにRedisを利用している
    • OGPなんて消えてしまっても別に困らない。再度取得すればOK
    • キャッシュしたデータがもりもりになっても困るし、7日くらいで勝手に削除されるようにしてる。*2
  • 前段にNginxを噛ませてない
    • なるべくインストールするものを減らしたかったというのと、前段にCDNを置いて運用する前提で作っていたのでそもそも不要と思ったからでした。

作った背景

  • マイクロサービスの題材として最適だった。そのなかで色々な案件で使えそうな便利なものをと考えたらコレになった。
    • 機能単位でWebAPIとして切り出していくメリットはなんとなく掴めた。
  • サーバーサイドで利用するだけだったらGemだけでも良いけど、フロントエンドやRuby以外のサーバーサイドでも利用するのではないかと思うと、JSONでやり取りした方が良いのでは思ったから。
  • あとはリンクを解析して、色々な情報を解析して返してくれるSaasもあるけどなんかべらぼうに髙いように感じたのと、やけに高機能だったのでシンプルにして実装し直した。 というのが作ってみたモチベーション。

コレであれば使われなくても捨てれるサイズだし、何かしらアウトプットしとくか位の気持ちでやっている。*3

今後の展望

  • herokuボタン
  • Rubyではなく、JavaかGoにリプレースしてもいいのかと思っている。
  • これができるのがMicroServiceの強み

*1:開発用にDockerComponseも用意しているけど、それにはRedisのコンテナも定義してあるので。

*2:Dockerから利用する場合、環境変数から変更可能

*3:前に試しに作ってみたものをブログでアウトプットするネタのためにわざわざOSSにするという姑息な手を使ったというのは内緒...