我使用的是Rails 4.2.7,我安装了几个Tor宝石.
gem 'tor' gem 'tor_requests' gem 'tor-privoxy' gem 'net-telnet'
我启动了我的Tor浏览器(在Mac El Capitan上运行),我想定期(每20个请求)更改我的TOR Web请求所在的IP地址.所以我尝试了这个
agent = TorPrivoxy::Agent.new '127.0.0.1','',{8118 => 9151} do |agent| sleep 1 puts "New IP is #{agent.ip}" end
但是,这会导致以下错误.我很困惑我还需要配置什么以便我可以完成上述工作.
Error during processing: Failed to open TCP connection to 127.0.0.1:8118 (general SOCKS server failure) /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:882:in `rescue in block in connect' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:879:in `block in connect' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:101:in `timeout' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:878:in `connect' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:863:in `do_start' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:858:in `start' /Users/davea/.rvm/gems/ruby-2.3.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:700:in `start' /Users/davea/.rvm/gems/ruby-2.3.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:631:in `connection_for' /Users/davea/.rvm/gems/ruby-2.3.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:994:in `request' /Users/davea/.rvm/gems/ruby-2.3.0/gems/mechanize-2.7.5/lib/mechanize/http/agent.rb:274:in `fetch' /Users/davea/.rvm/gems/ruby-2.3.0/gems/mechanize-2.7.5/lib/mechanize.rb:464:in `get' /Users/davea/.rvm/gems/ruby-2.3.0/gems/tor-privoxy-0.1.1/lib/tor-privoxy/agent.rb:38:in `ip' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:57:in `block in get_content' /Users/davea/.rvm/gems/ruby-2.3.0/gems/tor-privoxy-0.1.1/lib/tor-privoxy/agent.rb:11:in `initialize' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:55:in `new' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:55:in `rescue in get_content' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:50:in `get_content' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:14:in `get_url' /Users/davea/Documents/workspace/myproject/app/services/onlinerr_race_finder_service.rb:41:in `get_race_list' /Users/davea/Documents/workspace/myproject/app/services/abstract_race_finder_service.rb:26:in `process_data' /Users/davea/Documents/workspace/myproject/app/services/run_crawlers_service.rb:18:in `block in run_all_crawlers' /Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each' /Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each' /Users/davea/Documents/workspace/myproject/app/services/run_crawlers_service.rb:5:in `run_all_crawlers' (irb):2:in `irb_binding' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/workspace.rb:87:in `eval' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/workspace.rb:87:in `evaluate' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/context.rb:380:in `evaluate' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:489:in `block (2 levels) in eval_input' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:623:in `signal_status' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:486:in `block in eval_input' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/ruby-lex.rb:232:in `loop' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/ruby-lex.rb:232:in `block in each_top_level_statement' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/ruby-lex.rb:231:in `catch' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/ruby-lex.rb:231:in `each_top_level_statement' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:485:in `eval_input' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:395:in `block in start' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:394:in `catch' /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:394:in `start'
如何使用Ruby / Tor以编程方式强制更改IP地址?
require 'rubygems' $:.unshift "./tor/lib" require 'tor' … cookie_file = '/Users/davea/Library/Application Support/TorBrowser-Data/Tor/control_auth_cookie' file = File.open(cookie_file,'rb') cookie = file.read # read contents of auth cookie to string file.close Tor::Controller.connect(:port => 9150,:cookie => cookie) do |tor| tor.signal('NEWNYM') # send NEWNYM signal (gets new IP) end
导致rails控制台的错误…
Error during processing: undefined method `signal' for #<Tor::Controller:0x007fe044b1e550> /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:87:in `block in get_content' /Users/davea/.rvm/gems/ruby-2.3.0/gems/tor-0.1.2/lib/tor/control.rb:38:in `connect' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:86:in `rescue in get_content'
编辑2:
gem 'tor',:git => 'https://github.com/dryruby/tor.rb.git'
Error during processing: end of file reached /Users/davea/.rvm/gems/ruby-2.3.0/bundler/gems/tor.rb-08e589d17196/lib/tor/control.rb:301:in `readline' /Users/davea/.rvm/gems/ruby-2.3.0/bundler/gems/tor.rb-08e589d17196/lib/tor/control.rb:301:in `read_reply' /Users/davea/.rvm/gems/ruby-2.3.0/bundler/gems/tor.rb-08e589d17196/lib/tor/control.rb:194:in `authenticate' /Users/davea/.rvm/gems/ruby-2.3.0/bundler/gems/tor.rb-08e589d17196/lib/tor/control.rb:282:in `send_command' /Users/davea/.rvm/gems/ruby-2.3.0/bundler/gems/tor.rb-08e589d17196/lib/tor/control.rb:269:in `signal' /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:90:in `block in get_content'
解决方法
要在Tor中更改IP,您需要直接连接到控制器(它使用类似telnet的命令/响应
protocol.
看起来你正试图通过Privoxy连接,这是不必要的.控制器默认情况下仅允许本地连接.
Tor Browser的Tor配置强制执行身份验证使用cookie方法,而无需更改torrc中的任何选项,您需要读取要连接的auth cookie的内容.
我能够使用以下代码更改IP:
require 'rubygems' $:.unshift "./tor/lib" require 'tor' # the cookie file contains a "password" for authentication,32 random bytes cookie_file = '/home/me/tor-browser_en-US/Browser/TorBrowser/Data/Tor/control_auth_cookie' file = File.open(cookie_file,'rb') cookie = file.read # read contents of auth cookie to string file.close Tor::Controller.connect(:port => 9151,:cookie => cookie) do |tor| p tor.signal('NEWNYM') # send NEWNYM signal (gets new IP) end
tor.signal返回一个字符串,如果NEWNYM命令成功,则该字符串应为“250 OK”.有一些内部速率限制可以防止这种情况经常运行(比如我认为每10秒钟),这对你来说应该不是问题.
编辑:此Gem的0.1.2(当前版本)不包括来自主分支的信号方法.您需要使用最新的代码或复制their code而不是调用信号.