# Cách dùng proxy di động trong Python với xoay IP

> Code Python cho proxy di động 4G/5G: requests và httpx qua HTTP hoặc SOCKS5, xoay IP qua API, xử lý hạn mức 429, phiên làm việc dính. Không cần KYC.

- URL: https://cellmast.com/vi/guides/python-mobile-proxy/
- Cập nhật lần cuối: 2026-10-13
- Publisher: CellMast (https://cellmast.com)

Code Python sẵn sàng dùng cho cổng dành riêng CellMast hoặc pool proxy di động xoay vòng: kết nối, xoay IP, chờ địa chỉ mới, thử lại mà không quá tải API.

**Trả lời nhanh — Làm sao dùng proxy di động trong Python với xoay IP?**

Truyền URL proxy `http://USERNAME:PASSWORD@gw.cellmast.com:7777` vào `requests` hoặc `httpx`, rồi gọi `POST /api/v1/mobile/{portId}/rotate` với API key khi cần IP nhà mạng mới. Chờ phản hồi thường 5–15 giây, tôn trọng khoảng cách 30 giây giữa các lần xoay. Các cổng riêng CellMast 4G/5G bắt đầu từ 2,63$/ngày, không cần KYC, trả bằng crypto.

## Bạn cần gì

| Thuộc tính | Giá trị |
| --- | --- |
| Python | Phiên bản 3.10 trở lên |
| Thư viện | `requests` (HTTP), `requests[socks]` hoặc `httpx[socks]` cho SOCKS5 |
| Gateway | `gw.cellmast.com`, cổng HTTP 7777, cổng SOCKS5 7778 |
| Thông tin đăng nhập cổng | Tên người dùng và mật khẩu trong khu vực khách hàng; sau khi bộ phận hỗ trợ chuyển cổng, xem lại host, cổng và mật khẩu trong khu vực khách hàng vì có thể thay đổi |
| API key | Với phạm vi `proxies`, dùng cho xoay IP |
| Tên người dùng pool xoay IP | `USERNAME-country-{cc}-session-{id}-ttl-{minutes}` |

## Làm thế nào để tôi gửi yêu cầu qua một cổng di động?

Đặt cùng một URL proxy cho `http` và `https`. Với các mục tiêu HTTPS, `requests` mở một kênh CONNECT qua cổng, nên mục tiêu sẽ thấy IP của nhà mạng và TLS của bạn vẫn là đầu cuối.

*yêu cầu qua HTTP*

```python
import requests

PROXY = "http://USERNAME:PASSWORD@gw.cellmast.com:7777"
proxies = {"http": PROXY, "https": PROXY}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
print(r.json())  # {'ip': '<carrier IP>'}
```

*SOCKS5 (cài đặt pip "requests[socks]")*

```python
import requests

# socks5h: the proxy resolves the hostname, not your machine
PROXY = "socks5h://USERNAME:PASSWORD@gw.cellmast.com:7778"
r = requests.get("https://api.ipify.org", proxies={"http": PROXY, "https": PROXY}, timeout=30)
print(r.text)
```

## Làm thế nào để tôi xoay IP từ Python?

Đóng gói cuộc gọi xoay trong một trợ giúp hiểu được câu trả lời 429. Trợ giúp dưới đây chờ `Retry-After` khi bạn xoay quá sớm, sau đó kiểm tra xem nhà mạng có thực sự cung cấp địa chỉ mới.

*Trợ giúp xoay*

```python
import time
import requests

API = "https://cellmast.com/api/v1"
KEY = "API_KEY"

def rotate(port_id: str, tries: int = 3) -> str:
    """Ask the modem for a new carrier IP and return it."""
    for _ in range(tries):
        r = requests.post(f"{API}/mobile/{port_id}/rotate",
                          headers={"Authorization": f"Bearer {KEY}"}, timeout=60)
        if r.status_code == 429:  # rotation_too_soon
            time.sleep(int(r.headers.get("Retry-After", "30")))
            continue
        r.raise_for_status()
        data = r.json()
        if data["ip"] != data.get("previousIp"):
            return data["ip"]
        time.sleep(30)  # same IP from the carrier: wait and try again
    raise RuntimeError("no new IP after several tries")

print("new IP:", rotate("PORT_ID"))
```

## Làm thế nào để tôi xoay giữa các công việc, không xoay bên trong?

Chạy toàn bộ công việc trên một địa chỉ, rồi xoay trước công việc kế tiếp. Điều này giữ cookie và đăng nhập ổn định trong một công việc và cung cấp địa chỉ mới cho mỗi công việc.

*Một IP cho mỗi công việc*

```python
import requests

PROXY = "http://USERNAME:PASSWORD@gw.cellmast.com:7777"

def run_job(urls):
    with requests.Session() as s:
        s.proxies = {"http": PROXY, "https": PROXY}
        for url in urls:
            resp = s.get(url, timeout=30)
            print(resp.status_code, url)

jobs = [["https://example.com/a", "https://example.com/b"],
        ["https://example.com/c"]]
for urls in jobs:
    run_job(urls)
    rotate("PORT_ID")  # helper from the previous example
```

## Làm thế nào để tôi sử dụng hồ bơi xoay với các phiên dính trong httpx?

Trên hồ bơi theo GB không có cuộc gọi xoay: tên người dùng quyết định. Nếu không có id phiên, mỗi kết nối mới được cấp IP mới. Các client HTTP giữ kết nối mở (keep-alive), nên mỗi yêu cầu IP mới hãy mở client mới cho mỗi yêu cầu, hoặc gửi `Connection: close`. Với `session-<id>-ttl-<minutes>`, yêu cầu giữ một IP trong thời gian đó.

*httpx (cài đặt pip httpx)*

```python
import uuid
import httpx

def pool_client(country: str = "us", minutes: int | None = None) -> httpx.Client:
    user = f"USERNAME-country-{country}"
    if minutes:
        user += f"-session-{uuid.uuid4().hex[:8]}-ttl-{minutes}"
    proxy = f"http://{user}:PASSWORD@gw.cellmast.com:7777"
    return httpx.Client(proxy=proxy, timeout=30)

with pool_client("gb", minutes=10) as c:   # same UK mobile IP for 10 minutes
    print(c.get("https://api.ipify.org").text)
    print(c.get("https://api.ipify.org").text)
```

## Script của tôi nên xử lý lỗi nào?

- **HTTP 429 từ API xoay:** bạn đã xoay chưa đủ 30 giây. Chờ `Retry-After`.
- **HTTP 409 `port_not_active`:** cổng đã hết hạn hoặc bị tạm ngưng. Kiểm tra khu vực khách hàng.
- **Lỗi kết nối proxy ngay sau khi xoay:** bình thường; modem đang kết nối lại. Thử lại sau một khoảng tạm dừng ngắn.
- **HTTP 407 từ cổng:** tên người dùng hoặc mật khẩu cổng sai.
- **Mục tiêu trả lời 403 hoặc 429:** giảm tốc trước, sau đó xoay một lần. IP di động được chia sẻ, và làm chậm lại sửa được đa số các lỗi này.

## Python và proxy di động: các câu hỏi

### Tôi nên dùng HTTP hay SOCKS5 trong Python?

HTTP đơn giản và làm việc với `requests` thuần túy. SOCKS5 cần thêm `requests[socks]` nhưng truyền mọi lưu lượng TCP, và `socks5h://` phân giải DNS trên proxy thay vì máy của bạn. Cả hai tới cùng một modem CellMast: HTTP qua cổng 7777, SOCKS5 qua cổng 7778.

### Tôi có thể dùng asyncio với proxy di động không?

Có. `httpx.AsyncClient(proxy=...)` và `aiohttp` đều chấp nhận URL proxy HTTP. Giữ độ đồng thời vừa phải trên một cổng chuyên dụng: đó là một modem trên một kết nối nhà mạng, nên hàng chục yêu cầu song song cùng chia sẻ kênh sóng.

### Làm thế nào để tôi dùng Selenium hoặc Playwright với cổng này?

Trong Playwright, truyền `proxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"}` vào `launch()` hoặc `new_context()`. Tùy chọn proxy của Selenium không có mật khẩu: trả lời xác thực mạng proxy qua Selenium 4 BiDi, hoặc dùng Playwright. Xoay giữa các context trình duyệt, không xoay khi trang đang tải.

**Nhận một cổng và một khóa API** Cổng 4G/5G chuyên dụng từ 2,63$/ngày, dữ liệu di động xoay từ 1,50 US$/GB. Thanh toán bằng crypto. [Xem giá](https://cellmast.com/vi/pricing/) · [Tham khảo API di động](https://cellmast.com/docs/api/mobile/)

---

CellMast: CellMast là nhà cung cấp proxy di động 4G/5G: modem nhà mạng chuyên dụng với lưu lượng không giới hạn, cùng với pool proxy dân cư di động quay vòng tính theo GB, thanh toán bằng crypto và không cần tải lên ID.
