Shifterと一緒に使用する Ruby
ShifterのレジデンシャルおよびISP ProxiesをRubyに数分で組み込めます。Net::HTTP、HTTParty、Faraday、Mechanize、Watirに対応し、プレーンスクリプト、Sinatra、Railsで動作します。
クイックスタート
インストール
gem install httparty 基本的な使い方
require 'httparty'
response = HTTParty.get(
'https://ipinfo.io/json',
http_proxyaddr: 'p.shifter.io',
http_proxyport: 443,
http_proxyuser: 'customer-USERNAME-country-us-sid-123ABC',
http_proxypass: 'PASSWORD',
timeout: 30
)
puts response.parsed_response
# {"ip" => "154.16.xxx.xxx", "city" => "New York", "country" => "US", ...} 機能
例
Net::HTTP(依存関係ゼロ)
Rubyの標準ライブラリで十分です。Net::HTTP.startはプロキシのホスト、ポート、ユーザー、パスワードを受け付けます。gemは不要です。小規模なスクリプトやLambda形式の関数に最適です。
require 'net/http'
require 'uri'
require 'json'
PROXY_HOST = 'p.shifter.io'
PROXY_PORT = 443
PROXY_USER = 'customer-USERNAME-country-uk-sid-456DEF'
PROXY_PASS = 'PASSWORD'
uri = URI('https://example.co.uk/products')
http = Net::HTTP.new(
uri.host,
uri.port,
PROXY_HOST,
PROXY_PORT,
PROXY_USER,
PROXY_PASS
)
http.use_ssl = true
http.read_timeout = 30
req = Net::HTTP::Get.new(uri.request_uri)
req['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'
response = http.request(req)
puts "Status: #{response.code}, length: #{response.body.length}" スティッキーセッションを使用したFaraday
FaradayはRubyで最も柔軟なHTTPクライアントです -- ミドルウェアベースで、アダプターを自由に切り替えられます。プロキシのユーザー名に`sid`を追加することで、会話全体を通じて1つのレジデンシャルIPに固定できます。
require 'faraday'
require 'securerandom'
sid = SecureRandom.hex(4)
conn = Faraday.new(
url: 'https://example.de',
proxy: "customer-USERNAME-country-de-city-berlin-sid-#{sid}-ttl-300:PASSWORD@p.shifter.io:443",
request: { timeout: 30 },
headers: { 'User-Agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' }
)
login = conn.post('/login', { email: 'user@example.com', password: 'secret' }.to_json,
'Content-Type' => 'application/json')
dashboard = conn.get('/dashboard')
orders = conn.get('/orders')
puts [login.status, dashboard.status, orders.status].inspect Mechanize(フォーム対応クローリング)
Mechanizeはフォーム送信とリンクのたどりを自動化します。エージェントにプロキシを設定すれば、エージェントが巡回するすべてのページがShifterを経由します。
require 'mechanize'
agent = Mechanize.new
agent.set_proxy('p.shifter.io', 443,
'customer-USERNAME-country-us-city-newyork-sid-789GHI',
'PASSWORD')
agent.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
agent.read_timeout = 30
page = agent.get('https://example.com/login')
form = page.form('login')
form.email = 'user@example.com'
form.password = 'secret'
dashboard = form.submit
dashboard.links_with(href: %r{/orders/\d+}).each do |link|
order = link.click
puts order.search('h1').text.strip
end Rails(本番 HTTP サービス)
小さなRailsサービスの背後にShifterをラップして、すべてのコントローラー/ジョブが同じプロキシ設定を使用するようにします。リクエストごとにローテーションするか、ユーザーごとに固定します。
# app/services/shifter_client.rb
require 'faraday'
require 'faraday/retry'
class ShifterClient
PROXY_HOST = 'p.shifter.io:443'
def initialize(country: 'us', sid: nil)
sid_part = sid ? "-sid-#{sid}" : ''
proxy_url = "customer-USERNAME-country-#{country}#{sid_part}:PASSWORD@#{PROXY_HOST}"
@conn = Faraday.new(proxy: proxy_url, request: { timeout: 30 }) do |f|
f.request :retry, max: 3, interval: 1.0, backoff_factor: 2
f.response :json
f.adapter Faraday.default_adapter
end
end
def get(url)
@conn.get(url)
end
end
# In a controller or job:
class ProductsController < ApplicationController
def index
client = ShifterClient.new(country: 'uk', sid: current_user.id)
@products = client.get('https://example.co.uk/products.json').body
end
end よくある質問
Shifter と Ruby の併用に関するよくある質問。
プロキシのホスト、ポート、ユーザー、パスワードをNet::HTTP.newの第3〜第6引数として渡してください。HTTPSターゲットにはuse_ssl = trueを設定します。Ruby標準ライブラリだけで十分 -- 追加のgemは不要です。
HTTParty.get / postの任意の呼び出しにオプションとしてhttp_proxyaddr、http_proxyport、http_proxyuser、http_proxypassを渡してください。またはクラスレベルのdefault_optionsに含めることで、そのクラスのすべてのリクエストでShifterが使用されます。
Yes. Pass a `proxy` option when constructing the Faraday connection. The format is `http://USER:PASS@p.shifter.io:443`. Faraday's middleware stack — retry, JSON parsing, logging — composes on top.
プロキシのユーザー名にセッションIDを追加してください。例:`customer-USERNAME-country-us-sid-123ABC`。同じプロキシURLを使用するすべてのRubyリクエストは同じレジデンシャルIPを再利用します。`ttl-N`を追加すると、そのIPをN秒まで固定できます。
はい。プロキシをサービスクラス(またはイニシャライザー内のFaraday接続)でラップし、コントローラーやActiveJobワーカー全体で再利用できます。同じプロキシURLは、同期および非同期(Sidekiq)のコンテキストの両方で機能します。
gemは不要です。ShifterはプレーンなHTTP / SOCKS5に対応しています。既存のクライアントを`p.shifter.io:443`に向けるように設定するだけで完了です。これによりGemfileをスリムに保ち、バージョンの依存関係を避けられます。
でShifterを使い始める Ruby
Shifterの2億500万件以上のレジデンシャル・ISPプロキシを5分以内にRuby・Railsスタックに追加できます。Net::HTTP・HTTParty・Faraday・Mechanizeに対応しています。