你必須很努力

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

2022/12/17
字數統計: 667閱讀時間: 3 min

前言

用 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
57
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 是否會變

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

改成打 POST 測試

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

1
2
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
    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 地址

這邊紀錄幾個比較常用的

  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/2022/12/17/Protecting-Your-Real-IP-When-Hitting-APIs-with-Ruby-and-Tor/

發表日期:2022-12-17

更新日期:2022-12-31

CATALOG
  1. 1. 前言
  2. 2. 說明
  • 方法一
    1. 0.1. 改成打 POST 測試
  • 方法二
    1. 1. 如何查自己 IP 地址
    2. 2. 小結