Ruby

こんにちは!

以前こういう記事を書いたのですが、やっと本題

capybara-webkitを導入することが出来たので実際にスクリーンショットを撮ってみましょう。

といってもさすがRubyさん。こういうときにぱぱっと簡単なコードでできちゃうのはとても魅力的ですね! 今回はGUIを持っていない環境でも動くようにheadlessというgemも入れて動かしました。

ちなみに環境としては

  • Ruby・・・2.1.0
  • Gem・・・2.2.0
require 'rubygems'
require 'capybara-webkit'
require 'headless'

driver = Capybara::Webkit::Driver.new('web_capture').browser
driver.visit "http://google.com".to_s
driver.render("google.com", 1080, 550)

なんとこれだけ!なんて簡単!びびる!死んじゃう!!

ってことでこれでスクリーンショットが撮れました。seleniumみたいにセッション残すにはどうしたらいいのかとか調べてみたのですが、出来ないのかな。 誰か知っている方、教えていただけると助かります!!

そろそろやらねば

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 37,078
Read more

RubyのGoogleDrive Gemを使ってGoogleDriveをさわろうとしたところ、OAuthの認証でつまづいたのでそのメモします。

OAuth2.0の流れはこんな感じです。

  1. ClientIDとClientSecretを発行する
  2. 認証する
  3. アクセストークンを取得する
  4. リフレッシュトークンからアクセストークンを再取得する
  5. GoogleDrive gemを使ってみる

ClientIDとClientSecretを発行する

まずはプロジェクトを作成します。 https://cloud.google.com/console/project

APIsから「Drive API」と「Drive SDK」をONにします。

「Credentials」から「CREATE NEW CLIENT ID」から今回のプログラムで使う必要項目を取得します。

以上のような項目を選択

これでClientIDとClientSecretが作成されました。

認証する

ユーザーがAPIアクセスの許可を行い、Authorization codeを取得します。 これにはhttps://accounts.google.com/o/oauth2/authに以下のパラメータを付与したものにブラウザからアクセスします。

  • client_id:さきほど発行したClientID
  • redirect_uri:さきほど発行したRedirectURIs
  • scope:今回はGoogleDriveを使いたいので https://www.googleapis.com/auth/drive
  • response_type:”code”

よって以下のようなURLになります。

https://accounts.google.com/o/oauth2/auth
?client_id=8972549879287.apps.googleusercontent.com
&redirect_uri=http://localhost
&scope=https://www.googleapis.com/auth/drive
&response_type=code

このURLにアクセスすると認証画面になるので承認してください。 redirect_uriに設定したURLにcodeパラメータがついています。それがAuthorization codeになります。

アクセストークンを取得する

Authorization codeからアクセストークンを取得します。 https://accounts.google.com/o/oauth2/token にPOSTで以下のパラメータを送る必要があります。

  • client_id:最初に発行したClientID
  • client_secret:最初に発行したClientSecret
  • redirect_uri:最初に発行したRedirect URIs
  • grant_type: “authorization_code”
  • code: Authorization codeの値

POSTとして送るためcurlを使います。全体として以下のようなものになります。

$ curl -d client_id=[YOUR CLIENT ID] -d client_secret=[YOUR CLIENT SECRET] -d redirect_uri=[YOUR REDIRECT URI] -d grant_type=authorization_code -d code=[YOUR AUTHORIZATION CODE] https://accounts.google.com/o/oauth2/token

結果として以下のようなJSONが返ってきます。

{
    "access_token":"アクセストークン",
    "token_type":"Bearer",
    "expires_in":3600,
    "refresh_token":"リフレッシュトークン"
}

アクセストークンがAPIを使用するための鍵になります。

リフレッシュトークンからアクセストークンを再取得する

アクセストークンには有効期限(expires_in)があるため、有効期限が切れた場合、リフレッシュトークンからアクセストークンを再取得する必要があります。

https://accounts.google.com/o/oauth2/tokenにPOSTで以下のパラメータを送ればアクセストークンを再取得出来ます。

  • client_id:最初に発行したClientID
  • client_secret:最初に発行したClientSecret
  • refresh_token:リフレッシュトークン
  • grant_type:”refresh_token”

全体として以下のようなものになります。

$ curl -d client_id=[YOUR CLIENT ID] -d client_secret=[YOUR CLIENT SECRET] -d refresh_token=[YOUR REFRESH TOKEN] -d grant_type=refresh_token https://accounts.google.com/o/oauth2/token

これでアクセストークンを取得したときと同じJSONが返ってきます。その中のaccess_tokenの値が新しいアクセストークンになります。

GoogleDrive gemを使ってみる

それではアクセストークン、リフレッシュトークンをゲットすることが出来たので最後にgemを使ってみましょう。 詳しいAPI仕様は公式ドキュメントを見てください。

CLIENT_ID = "9874987-ljk4j45n5dhh485014849.apps.googleusercontent.com"
CLIENT_SECRET = "98FZqeIdnz8495"
REFRESH_TOKEN = "5/Qzjrnxhtn;lUidZ"

client = OAuth2::Client.new(
    CLIENT_ID, CLIENT_SECRET,
    :site => "https://accounts.google.com",
    :token_url => "/o/oauth2/token",
    :authorize_url => "/o/oauth2/auth")

# refresh_tokenでログイン
auth_token = OAuth2::AccessToken.from_hash(client,{:refresh_token => REFRESH_TOKEN, :expires_at => 3600})
auth_token = auth_token.refresh!

# ログイン完了!
session = GoogleDrive.login_with_oauth(auth_token.token)

以上でログインが終わりました。

最後に

これでGoogleAPIを自由に使うことが出来ました。 ただ、GoogleDriveにはOAuth2.0認証を簡単に行うためのコードが実はあるのです!(最初からそれ使えよ) 1回手動で大きな流れを理解したあとであれば以下のコードも理解出来ると思います。

client = OAuth2::Client.new(
    your_client_id, your_client_secret,
    :site => "https://accounts.google.com",
    :token_url => "/o/oauth2/token",
    :authorize_url => "/o/oauth2/auth")
auth_url = client.auth_code.authorize_url(
    :redirect_uri => "http://example.com/",
    :scope =>
        "https://docs.google.com/feeds/ " +
        "https://docs.googleusercontent.com/ " +
        "https://spreadsheets.google.com/feeds/")

# 表示されるURLをブラウザで開く
print auth_url

print "authorization code:"
authorization_code = gets.chomp

auth_token = client.auth_code.get_token(
    authorization_code, :redirect_uri => "http://example.com/")
session = GoogleDrive.login_with_oauth(auth_token.token)

また、scopeで注意しなければならないこととしては、

  • scopeを複数連ねる場合はURLの最後に半角スペースを挿入しなければならない

ということです。上記のRubyのコードでもよくみるとscopeのURLの最後に半角スペースが入っているのがわかると思います。 僕はここが理解出来ていなくて1時間くらい無駄にしました(´・ω・`)

ということでこれでもう忘れても大丈夫!お役に立てれば幸いです。

ある程度Rubyが出来るようになったらこれ。頑張ります。

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 19,124
Read more

こんにちは。 前回簡単なSelenium入門をしてみましたが、Seleniumを使っているときに困るのが、ログインをしなければならないサイトをスクレイピングしたりテストを通したいときです。 ログイン処理を何度もまわせばいいのですが、開発途中のプログラムの場合だと短時間に何度も何度もログイン処理をまわすことになり、色々大変です。

そこでログイン処理を省き、通常使っているようにログイン済みのブラウザを使えれば便利ですよね。 Seleniumにはもちろんそういうことも考えられていて、それを設定することがあります。 今回はその設定方法を書いていきます。

Firefoxの設定をする

それではFirefoxの設定をしていきましょう。 Firefoxにはデフォルトでプロファイルが設定されていて、それを設定するとプログラムから使うように出来ます。

それでは設定していきましょう。

といってもとても簡単です。 MacOSX前提で話していますが、以下のコマンドをターミナルから入力してください。

$ /Applications/Firefox.app/Contents/MacOS/firefox-bin -p

そうすると以下のような画面が開くので、新規作成を押しましょう。

プロファイルの名前を決定する画面があるのでそこで決定をクリックすると、その名前のプロファイルが作成されます。 あとはそのプロファイルを選択して、「Firefoxを起動」をクリックし、ログインが必要なサイトで予めログインを完了させておけば完璧です!

今回はプロファイルをちゃんと設定出来たかと確認するために、作ったプロファイルでTwitterにログインしておいてください。

Seleniumから動かしてみる

それでは設定したプロファイルをプログラムから渡してみましょう。

コードは以下のような感じです。

default_profile = Selenium::WebDriver::Firefox::Profile.from_name "auto"
default_profile.native_events = true

driver = Selenium::WebDriver.for :firefox, :profile => default_profile

driver.navigate.to 'http://twitter.com'

こんな感じで使うプロファイル情報を定義してあげて、WebDriverを呼び出すときに変数として渡してあげればそれでOKです! ログイン後のTwitter画面は出てきましたか?出てきたら成功です!

最後に

SeleniumってPHPで動かそうとしてたときはとても苦労した記憶があったのですが、Rubyだと超楽ですね! これでいっぱいテストが書ける気がしてきましたw

そろそろやり始めます。

たのしいRuby 第4版
たのしいRuby 第4版
posted with amazlet at 14.01.05
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 25,239
Read more

こんにちは!

最近、Ruby気持ちいい!!!って思ってるたがみです。 Ruby触りたいけどちょっと・・・とかSeleniumもいじってみようかなぁ・・・と思っている人が、簡単に、手早く、ぱぱっと動かしたい人向けの記事になってます。

それではいってみましょう!

Seleniumを動かす環境をつくる

それでは実際にSeleniumを動かしていきましょう。

Rubyはインストールしてある前提で書いていきます。

Seleniumを動かすためのgemをインストールします。

$ gem install selenium-webdriver

あとはFirefoxをインストールしておいてください。 Chromeでも大丈夫そうですが、自分の環境ではうまく動かなかったので。

これだけです! なんとも簡単!それでは軽く動かしてみましょう!!

実際に動かしてみる

それでは実際にSeleniumでFirefoxを動かしてみましょう。

ここではTwitterのトップページに飛んでみます。

といってもとても簡単で以下のコードで動きます。

twitter.rb

#coding: utf-8

require 'rubygems'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://twitter.com"

たったこれだけです!なんということでしょう〜〜

これだけだとつまんないので今のTwitterのトップページからログインしてみようと思います。

以下のコードでログインすることが出来ます。

id = driver.find_element(:id, "signin-email")
pass = driver.find_element(:id, "signin-password")

id.send_keys("TwitterのID")
pass.send_keys("Twitterのパスワード")

driver.find_element(:class, 'password-signin').find_element(:tag_name, 'button').click

コードもとても直感的で、

  • IDとパスワードを入力する入力欄を取得する
  • 入力欄に対して文字列を流し込む
  • ログインボタンをクリックする

という流れです。どうですか?Rubyだとこんなに簡単に、直感的に書けるんだなぁと改めて感じました。

最後に

超簡単な流れでしたがどうでしたか? 軽くいじれることがわかったかと思います。 他にもデータを取得したり、スクロールしたりすることも出来るので色々触ってみてください。

参考URLは以下になります。

RubyでSeleniumを使ってスクレイピング selenium-webdriverドキュメント

そろそろ僕もRubyを学ばなければならないようです。

たのしいRuby 第4版
たのしいRuby 第4版
posted with amazlet at 14.01.03
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 29,228
Read more