Bỏ qua, tới nội dung chính
Esc

Tự động đổi IP proxy bằng API — ví dụ curl, Python và Node.js

Cài đặt và sử dụng 4 phút đọc

Trong bài này
  1. 01 Cách hoạt động: một link, một request GET
  2. 02 Đổi IP bằng curl
  3. 03 Python với requests
  4. 04 Node.js với undici
  5. 05 Playwright và Puppeteer
  6. 06 Mẹo khi tự động hoá

Mở link đổi IP trên trình duyệt thì dễ, nhưng khi bạn chạy tool, script thu thập dữ liệu hay một chuỗi hồ sơ trình duyệt, việc đổi IP nên được tự động hoá: gọi link, chờ proxy kết nối lại, xác nhận IP đã đổi, rồi mới làm tiếp. Bài này có code mẫu chạy được ngay cho curl, PowerShell, Python và Node.js, cùng cách dùng proxy có mật khẩu với Playwright và Puppeteer.

Cách hoạt động: một link, một request GET

Với proxy 4G của 65Proxy, mỗi proxy có một link đổi IP riêng trong mục Proxy của tôi. "API đổi IP" chính là link đó: gửi một request GET tới link (gọi thẳng, không cần đi qua proxy), thiết bị 4G kết nối lại mạng di động và nhận IP mới.

Mọi đoạn code dưới đây làm theo cùng một nhịp:

  1. Lấy IP hiện tại qua proxy (dùng https://api.ipify.org, trang chỉ trả về địa chỉ IP).
  2. Gọi link đổi IP.
  3. Chờ và kiểm tra lại vài giây một lần, cho tới khi IP khác IP cũ hoặc hết thời gian chờ.

Bước 3 quan trọng hơn bạn nghĩ: thiết bị cần vài giây để kết nối lại, và trong lúc đó các request qua proxy có thể lỗi. Đừng dựa vào nội dung mà link đổi IP trả về — hãy kiểm tra IP thật sự đã đổi.

Trong các ví dụ, USER, PASS, HOST, PORT là thông tin proxy của bạn, và link đổi IP được đọc từ biến môi trường ROTATE_URL. Đừng viết thẳng link vào code: ai có link đều đổi được IP của bạn.

Đổi IP bằng curl

Trên macOS, Linux hoặc Git Bash trên Windows:

Terminal
export PROXY="http://USER:PASS@HOST:PORT"
export ROTATE_URL="LINK_DOI_IP_CUA_BAN"

old=$(curl -s -m 15 -x "$PROXY" https://api.ipify.org)
curl -s -m 60 "$ROTATE_URL" > /dev/null

# Kiểm tra lại 3 giây một lần, tối đa khoảng 1 phút
for i in $(seq 1 20); do
  sleep 3
  new=$(curl -s -m 10 -x "$PROXY" https://api.ipify.org)
  if [ -n "$new" ] && [ "$new" != "$old" ]; then
    echo "$old -> $new"
    break
  fi
done

Trên Windows PowerShell

Trong Windows PowerShell, curl là tên gọi tắt của một lệnh khác (Invoke-WebRequest), nên hãy gõ curl.exe — chương trình curl có sẵn trên Windows 10 và 11:

PowerShell
$proxy  = "http://USER:PASS@HOST:PORT"
$rotate = $env:ROTATE_URL

$old = curl.exe -s -m 15 -x $proxy https://api.ipify.org
curl.exe -s -m 60 $rotate | Out-Null

foreach ($i in 1..20) {
  Start-Sleep -Seconds 3
  $new = curl.exe -s -m 10 -x $proxy https://api.ipify.org
  if ($new -and $new -ne $old) { "$old -> $new"; break }
}

Python với requests

Cài thư viện bằng pip install requests, đặt hai biến môi trường PROXY và ROTATE_URL, rồi chạy:

Python
import os
import time

import requests

PROXY = os.environ["PROXY"]            # http://USER:PASS@HOST:PORT
ROTATE_URL = os.environ["ROTATE_URL"]  # link đổi IP trong mục Proxy của tôi
PROXIES = {"http": PROXY, "https": PROXY}


def current_ip() -> str:
    r = requests.get("https://api.ipify.org", proxies=PROXIES, timeout=15)
    r.raise_for_status()
    return r.text.strip()


def rotate(wait: float = 60) -> str:
    """Gọi link đổi IP rồi chờ tới khi proxy ra IP mới."""
    old = current_ip()
    requests.get(ROTATE_URL, timeout=60).raise_for_status()
    deadline = time.monotonic() + wait
    while time.monotonic() < deadline:
        time.sleep(3)
        try:
            new = current_ip()
        except requests.RequestException:
            continue  # proxy đang kết nối lại
        if new != old:
            return new
    raise TimeoutError("IP chưa đổi sau %d giây" % wait)


if __name__ == "__main__":
    print("IP mới:", rotate())

Muốn dùng SOCKS5 thay cho HTTP: cài thêm pip install "requests[socks]" và đặt PROXY dạng socks5h://USER:PASS@HOST:PORT. Chữ h giúp proxy tự phân giải DNS, tránh rò rỉ DNS — giải thích trong bài SOCKS5 và HTTP proxy.

Đặt biến môi trường trên Windows PowerShell: $env:PROXY = "http://USER:PASS@HOST:PORT"; trên macOS, Linux: export PROXY="http://USER:PASS@HOST:PORT".

Node.js với undici

Hàm fetch có sẵn trong Node.js không tự đi qua proxy. Thư viện undici (do chính đội Node.js phát triển) có ProxyAgent nhận được proxy kèm tài khoản, mật khẩu ngay trong URL. Cài bằng npm install undici, lưu file dưới tên rotate.mjs và chạy node rotate.mjs:

JavaScript
import { fetch, ProxyAgent } from "undici";

const proxy = new ProxyAgent(process.env.PROXY); // http://USER:PASS@HOST:PORT
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

async function currentIp() {
  const res = await fetch("https://api.ipify.org", { dispatcher: proxy, signal: AbortSignal.timeout(15000) });
  return (await res.text()).trim();
}

async function rotate(waitMs = 60000) {
  const old = await currentIp();
  const res = await fetch(process.env.ROTATE_URL, { signal: AbortSignal.timeout(60000) });
  if (!res.ok) throw new Error("Link đổi IP trả về mã " + res.status);
  for (const end = Date.now() + waitMs; Date.now() < end; ) {
    await sleep(3000);
    try {
      const ip = await currentIp();
      if (ip !== old) return ip;
    } catch {
      // proxy đang kết nối lại
    }
  }
  throw new Error("IP chưa đổi kịp");
}

console.log("IP mới:", await rotate());

Playwright và Puppeteer

Khi điều khiển trình duyệt bằng code, hãy dùng HTTP proxy: Chromium không hỗ trợ SOCKS5 có mật khẩu.

Playwright (Python) nhận proxy kèm tài khoản, mật khẩu ngay khi khởi động trình duyệt (cài bằng pip install playwright rồi playwright install chromium):

Python
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://HOST:PORT",
        "username": "USER",
        "password": "PASS",
    })
    page = browser.new_page()
    page.goto("https://api.ipify.org")
    print(page.inner_text("body"))
    browser.close()

Puppeteer (Node.js) truyền địa chỉ proxy qua tham số khởi động, còn tài khoản và mật khẩu qua page.authenticate:

JavaScript
import puppeteer from "puppeteer";

const browser = await puppeteer.launch({ args: ["--proxy-server=http://HOST:PORT"] });
const page = await browser.newPage();
await page.authenticate({ username: "USER", password: "PASS" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Để mỗi phiên trình duyệt có một IP: đóng trình duyệt, đổi IP, rồi mới khởi động lại. Trình duyệt giữ kết nối cũ tới proxy, nên đổi IP khi trình duyệt còn mở có thể làm các trang đang tải bị lỗi.

Mẹo khi tự động hoá

  • Một proxy là một IP tại mỗi thời điểm. Mọi luồng chạy song song qua cùng proxy dùng chung IP, và cùng bị ngắt khi đổi IP. Chỉ đổi IP khi không còn request nào đang chạy; cần nhiều IP cùng lúc thì dùng nhiều proxy.
  • Luôn đặt thời gian chờ (timeout) và thử lại. Mạng di động có lúc chậm; một request treo mãi sẽ làm cả script đứng.
  • Ghi lại IP cũ và IP mới mỗi lần đổi — rất có ích khi cần tìm lỗi.
  • Không đổi IP liên tục khi không cần. Mỗi lần đổi là một lần ngắt kết nối; hãy đổi khi công việc cần, ví dụ khi chuyển tài khoản hoặc khi trang bắt đầu giới hạn truy cập.
  • Tôn trọng website bạn truy cập: đọc điều khoản, giữ tốc độ request ở mức hợp lý.

Chưa rõ cơ chế đổi IP hoạt động ra sao? Đọc proxy xoay là gì. Script báo lỗi kết nối? Xem các lỗi proxy thường gặp.