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営業日で出荷表示!!!
早速ポチッと完了しました!
まさか作ったその日に買えるようになるとは!まさに奇跡。
買った後は、crontabの設定を消しましょう。
本来はGoogleさまが予約受け付けてくれればいいんですが、しばらくは在庫切れが続きそうなので、手持ちのレンタルサーバがあれば、ぜひ試してみてください。