rubyを書いてNexus6をゲットしよう!

いきなり釣りっぽいタイトルで恐縮です!

Google PlayのNexus6の在庫がなかなか安定せず、やきもきしてる方も多いと思う今日このごろですが、気まぐれに在庫が復活してはまた売り切れというのが続いているみたいですね。

こんなサイトもありました。

とはいえ、Google Playのサイトを常にチェックするのも面倒なので、ボットに働いてもらいましょう!

ということで、在庫をチェックするrubyスクレイピングスクリプトレンタルサーバさくらインターネット)にcronで設定してみました。

環境設定

さくらインターネットrubyのバージョンは1.8で、2.0以上を使いたいので、まずはrubyをインストールしましょう。折角なのでrbenv上にインストールします。

### 最初にインストール場所を作っておく
$ mkdir ~/local
$ mkdir ~/tmp

### rbenvをダウンロード
$ git clone git://github.com/sstephenson/rbenv.git rbenv

### ruby-buildをダウンロード
$ mkdir ~/local/rbenv/plugins
$ cd  ~/local/rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git ruby-build

### ~/.bash_profileなどの起動用のシェルにrbenv設定のため、下記を追加
$ vi ~/.bash_profile
export RBENV_ROOT=$HOME/local/rbenv
export PATH=/bin:$RBENV_ROOT/bin
eval "$(rbenv init -)"

### 上記設定の反映
$ sourch ./.bash_profile

### rubyをインストールする前にtmpディレクトリを一時的に下記に設定しておきます
$ export TMPDIR=/home/spree/tmp

### rubyをインストール
$ rbenv install  2.0.0-p598
$ rbenv rehash
$ rbenv global 2.0.0-p598

### gem installでSSLエラーになってしまうのを回避
$ gem source --add http://rubygems.org

### スクレイピング用のgemをインストール
$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --no-rdoc --no-ri

### メールを送信するgemをインストール
$ gem install mail

これでrubyを使う環境は揃いました。

Google Playスクレイピングスクリプト

Google Playの在庫情報を取得して、在庫の状態が変わった時にメールするようにします。

get_nexus6.rb

require 'open-uri'
require 'nokogiri'
require 'mail'

# メールのFrom, toを設定
mail = Mail.new do
  from    'xxxx@gmail.com'
  to      'xxxx@gmail.com'
end

# あまりよろしくないみたいですが、SSL通信でエラーが出るのを回避するための設定
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

# gmailのsmtpを利用します
mail_options = { :address              => "smtp.gmail.com",
                          :port                    => 587,
                          :domain               => "smtp.gmail.com",
                          :user_name            => 'xxxx@gmail.com',
                          :password             => 'password',
                          :authentication       => :plain,
                          :enable_starttls_auto => true  }

# nexus6のGoogle Playサイト
urls = {
  "Nexus6 32GB White"    => "https://play.google.com/store/devices/details?id=nexus_6_blue_32gb&hl=ja",
  "Nexus6 32GB DarkBlue" => "https://play.google.com/store/devices/details/?id=nexus_6_white_32gb&hl=ja",
  "Nexus6 64GB White"    => "https://play.google.com/store/devices/details?id=nexus_6_blue_64gb&hl=ja",
  "Nexus6 64GB DarkBlue" => "https://play.google.com/store/devices/details?id=nexus_6_white_64gb&hl=ja",
}

charset = nil
urls.each do |name, url|
  # HTMLを読み込み、nokogiriを使ってdocオブジェクトを作成します
  html = open(url) do |f|
    charset = f.charset
    f.read
  end
  doc = Nokogiri::HTML.parse(html, nil, charset)
  
  # 在庫状態部分のHTMLを監視します
  doc.xpath('//div[@class="shipping-status-align"]').each do |node|
    # p node.inner_text
    if node.inner_text != " 現在在庫切れです。しばらくしてからもう一度ご確認ください。 "
      mail.subject = name + " ステータス変わりました!"
      mail.body = name + "\n" + url
      mail.delivery_method(:smtp, mail_options)
      mail.deliver
    end
  end
  # あまり迷惑を掛けない程度に・・・
  sleep(1)
end

Google Playのデザインや仕様が変わったら、xpath部分など対応する必要あります。

メールじゃなくて、Twitterに投稿させたりするのもいいかもしれません。

crontabの設定

頻度は人それぞれですが、何かバグがあったりでメールがいっぱいくると辛いので、10分に1回起きている時間で設定しました。

*/10 0-3,7-23 * * * /usr/local/bin/bash -lc '/home/xxxx/local/rbenv/versions/2.0.0-p598/bin/ruby /home/xxxx/cron/get_nexus6.rb'

rubyをフルパスで書かないと何故か動かず、こんなダサい設定になってます。

1回起動で4回アクセスするくらいなので、神経質になる必要もないかもしれないですが、あまり頻度を上げると、Googleさんにブロックされてしまう可能性もあるのでほどほどに。夜中の3時台に在庫復活することが多いという情報もあるので3時台までチェックしました。

そして・・・

昨日の夜(1/30)に夜な夜なこんなスクリプトを作って、テストしてたんですね。

そしたら早速メールがきて、ああ〜バグってるなと思いつつサイトを見てみるとなんと

1〜2営業日で出荷表示!!!

早速ポチッと完了しました!

f:id:bonnaroo:20150131232958p:plain

まさか作ったその日に買えるようになるとは!まさに奇跡。

買った後は、crontabの設定を消しましょう。


本来はGoogleさまが予約受け付けてくれればいいんですが、しばらくは在庫切れが続きそうなので、手持ちのレンタルサーバがあれば、ぜひ試してみてください。