在 Ruby 中用 Tor 打 API:如何隱藏真實 IP

被端走的小菜
6 min readDec 17, 2022

前言

用 Ruby 在打 API 時,若不想讓人知道請求的 IP (request IP),可以搭配用 Tor 來實踐。

Tor (The Onion Router) 是一個用於匿名通訊的網絡,可以用來瀏覽網頁、傳輸數據和通訊。
本文將介紹如何在 Ruby 中使用 Tor 進行匿名瀏覽和通訊。

說明

這邊以 Ruby 3.1.2 為範例,並提供 2 種方法作為參考

方法一

用別人寫好的 Docker image docker-rotating-proxy
note: 我個人比較習慣用這個

照著官方文件下載與執行 Docker container

docker run -d -p 5566:5566 -p 4444:4444 - env tors=25 mattes/rotating-proxy

在 Command-line 測試

curl - proxy 127.0.0.1:5566 https://api.my-ip.io/ip

以下是自己寫的 Ruby Class,方便可以用 GET 或 POST

require 'net/http'
require 'json'

class TorHTTP
attr_reader :proxy_address, :proxy_port

# 在這裡指定 Tor 的 SOCKS 代理的位置
def initialize(proxy_address: '127.0.0.1', proxy_port: 5566)
@proxy_address = proxy_address
@proxy_port = proxy_port
end

def get(url, data: nil)
send_request(:get, url, data)
end

def post(url, data: nil)
send_request(:post, url, data)
end

private

def send_request(request_method, url, data)
uri = URI(url)
http = init_http(uri)
request = build_request(request_method, uri)
add_request_body(request, data) if data
send_request_and_return_response(http, request)
end

def init_http(uri)
http = Net::HTTP.new(uri.host, uri.port, proxy_address, proxy_port)
http.use_ssl = uri.scheme == 'https'
http.open_timeout = 10
http.continue_timeout = 10
http
end

def build_request(request_method, uri)
case request_method
when :get
Net::HTTP::Get.new(uri.request_uri)
when :post
Net::HTTP::Post.new(uri.request_uri)
end
end

def add_request_body(request, data)
request.body = data.to_json
request.content_type = 'application/json'
end

def send_request_and_return_response(http, request)
response = http.request(request)
response.body
end
end

測試打查詢 IP 看 IP 是否會變

TorHTTP.new.get('https://ifconfig.me')

改成打 POST 測試

可以參考之前寫的這篇 如何看自己打出去的 request 完整資訊,以 PostBin 和 Webhook.site 為例
這邊以 PostBin 為例

data = { hello: 'world' }
TorHTTP.new.post('https://www.toptal.com/developers/postbin/1671278873904-9991861544549', data: data)

方法二

  1. 用別人寫好的 Docker image Tor-socks-proxy
  2. 除了上述步驟外,也要安裝 socksify gem
# 也有其他方式能做到,請看官方文件
# 進入 IRB
$ socksify_ruby localhost 9150

require 'http'
HTTP.get('https://ipinfo.io/ip').to_s

# 或跑腳本
socksify_ruby localhost 9150 script.rb

可以發現,它不像方法一的每次 request 的 IP 位址都不同,可看需求使用

如何查自己 IP 地址

這邊紀錄幾個比較常用的

  1. https://ipinfo.io/ip
  2. https://ipecho.net/plain
  3. https://api.my-ip.io/ip
  4. https://ifconfig.me
  5. https://ipinfo.tw/ip
  6. https://www.whatismyip.com/
  7. https://ipecho.net/plain
  8. https://check.torproject.org/api/ip

小結

在爬網站資料時,又不想讓人知道實際 IP 時,這是一個還不錯的方法,並租一台機器在雲端上跑,就更難被發現了 XD

medium 文章連結:https://link.medium.com/Aw09O7sMPvb
本文同步發布於 小菜的 Blog https://riverye.com/

備註:之後文章修改更新,以個人部落格為主

--

--

被端走的小菜

大家好,我是被端走的小菜。以個人部落格更新為主:https://riverye.com/