前言
用 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
1
docker run -d -p 5566:5566 -p 4444:4444 --env tors=25 mattes/rotating-proxy
在 Command-line 測試
1
curl --proxy 127.0.0.1:5566 https://api.my-ip.io/ip
以下是自己寫的 Ruby Class,方便可以用 GET 或 POST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57require '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 是否會變
1
TorHTTP.new.get('https://ifconfig.me')
改成打 POST 測試
可以參考之前寫的這篇 如何看自己打出去的 request 完整資訊,以 PostBin 和 Webhook.site 為例
這邊以 PostBin 為例
1
2data = { hello: 'world' }
TorHTTP.new.post('https://www.toptal.com/developers/postbin/1671278873904-9991861544549', data: data)
方法二
- 用別人寫好的 Docker image Tor-socks-proxy
- 除了上述步驟外,也要安裝 socksify gem
1
2
3
4
5
6
7
8
9# 也有其他方式能做到,請看官方文件
# 進入 IRB
$ socksify_ruby localhost 9150
require 'http'
HTTP.get('https://ipinfo.io/ip').to_s
# 或跑腳本
socksify_ruby localhost 9150 script.rb
可以發現,它不像方法一的每次 request 的 IP 位址都不同,可看需求使用
如何查自己 IP 地址
這邊紀錄幾個比較常用的
- https://ipinfo.io/ip
- https://ipecho.net/plain
- https://api.my-ip.io/ip
- https://ifconfig.me
- https://ipinfo.tw/ip
- https://www.whatismyip.com/
- https://ipecho.net/plain
- https://check.torproject.org/api/ip
小結
在爬網站資料時,若不想讓人知道實際 IP 時,這是一個還不錯的方法,並租一台機器在雲端上跑,就更難被發現了 XD
medium 文章連結:https://link.medium.com/Aw09O7sMPvb
本文同步發布於 小菜的 Blog https://riverye.com/
備註:之後文章修改更新,以個人部落格為主