くりにっき

フルスタックキュアエンジニアです

【今月のgem】apple_system_statusを作った

github.com

経緯

先日iTunes Storeなどで障害が起きていて、弊社でもiOSの課金周りでエラーが多発していました

link-man.net

taisy0.com

上記エントリを見ていてたまたまAppleSystem Statusページがあることを知りました

どういうgem?

Githubみたいにrssが取れれば IFTTT と連携してメール送るようにして障害を検知というのができるのですが*1Appleの方はそういうAPIがなかったのでスクレイピングしてとれるようにしたのが今回のapple_system_statusというgemです

使い方

phantomjs が必要なので別途インストールしてください

Rubyで使う場合にはこんな感じです

crawler = AppleSystemStatus::Crawler.new

pp crawler.perform("jp")

{:title=>"00:53 JST 時点のシステム状況",
 :services=>
  [{:title=>"App Store", :description=>"問題なし: App Store", :status=>"allgood"},
   {:title=>"iCloud ストレージアップグレード",
    :description=>"問題なし: iCloud ストレージアップグレード",
    :status=>"allgood"},
   {:title=>"iTunes Store",
    :description=>"問題なし: iTunes Store",
    :status=>"allgood"},
   # ...
]}

コマンド経由でも実行できます

$ apple_system_status fetch --country=jp --title="iTunes Store"
00:47 JST 時点のシステム状況
iTunes Store,allgood,問題なし: iTunes Store

json出力をサポートしているので jq と組み合わせればこういうこともできます。監視が捗りますNE!

$ apple_system_status fetch --country=jp --format=json --title="iTunes Store" | jq .
{
  "title": "00:51 JST 時点のシステム状況",
  "services": [
    {
      "title": "iTunes Store",
      "description": "問題なし: iTunes Store",
      "status": "allgood"
    }
  ]
}

$ apple_system_status fetch --country=jp --format=json --title="iTunes Store" | jq .services[0].status
"allgood"

他にも

phantomjsインストールするの('A`)マンドクセという人にはAPIサーバもあります。

https://app-stat-api.herokuapp.com/

github.com

SinatraでWeb APIを作ってその中でこのgemを呼んでいるだけです

使い方もさっきとだいたい同じ

$ curl -s https://app-stat-api.herokuapp.com/jp/services.json?title=iTunes+Store | jq .services[0].status
"allgood"

毎回スクレイピングすると重くなるのでスクレイピングの結果は5分間キャッシュしています。

キャッシュを使ってほしくないとかHerokuのインスタンスが起動する時のオーバーヘッドが気になる方はgemの方を使ってください。

余談

趣味で結構スクレイピングしてるのですが、phantomjs + capybara + poltergeist の組み合わせが自分の中で鉄板になりつつあります

昔は mechanize を使ってたんですがjsが実行できないのでbodyに含まれない要素が取得できないというデメリットが。(その分軽量なんですが)

*1:実際に弊社でもやってます

*2:コンソールの中だけで動く画面のないブラウザ