Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
Python treq proxy: ProxyAgent, Deferred và giới hạn HTTPS

Python treq proxy: ProxyAgent, Deferred và giới hạn HTTPS

Chuyên viên Kỹ thuật ProxyVN 07-31-2026 Đang tính... phút đọc

Python treq proxy là cách cho thư viện treq, client HTTP bất đồng bộ trên Twisted, gửi request qua máy trung gian. treq không có tham số proxies như Requests. Proxy phải đi qua Agent của Twisted, cụ thể là ProxyAgent. ProxyVN chạy treq 26.7.0 trên Twisted 26.4.0 qua proxy tự dựng, ghi lại 11 ca thử và một giới hạn lớn với HTTPS mà tài liệu không nói thẳng.

Python treq proxy đi qua Agent của Twisted

treq bọc Agent, không bọc requests

treq do nhóm Twisted duy trì, mang cách gọi gần giống Requests lên nền Twisted: treq.get, treq.post, response.text, response.json. Nhưng bên dưới, mọi request do một Agent của Twisted thực hiện. Trang tài liệu treq giới thiệu thư viện là API client HTTP cấp cao cho Twisted, còn trang API của treq mô tả HTTPClient nhận một Agent bất kỳ.

Điểm khác lớn nhất với Requests là treq không đọc biến môi trường proxy và không nhận tham số proxies. Trong lab, mình đặt HTTP_PROXY trỏ về proxy cục bộ rồi gọi treq.get. Kết quả là DNSLookupError: no results for hostname lookup: shop.test, nghĩa là request đi thẳng, biến môi trường bị bỏ qua.

Muốn treq đi proxy, phải tạo HTTPClient với một ProxyAgent. Không có đường tắt bằng biến môi trường hay tham số.

ProxyAgent theo tài liệu Twisted

Hướng dẫn client web của Twisted có mục dùng proxy HTTP. Theo đó, ProxyAgent có cùng giao diện với Agent nhưng nhận endpoint của proxy khi khởi tạo. Tài liệu nhấn mạnh ProxyAgent dành cho máy chủ cài biến thể proxy của giao thức HTTP, còn các kiểu proxy khác thì dùng Agent.usingEndpointFactory.

Ví dụ trong tài liệu tạo TCP4ClientEndpoint tới localhost cổng 8000, truyền vào ProxyAgent, rồi gọi request GET tới https://example.com. Phần sau sẽ cho thấy ví dụ dùng URL https này có một hệ quả cần hiểu rõ trước khi dùng thật.

Ranh giới với bài aiohttp và Requests

Bài aiohttp proxy nói về client bất đồng bộ trên asyncio, có tham số proxy riêng. Bài Python Requests proxy nói về dict proxies. Bài này chỉ nói về treq và Twisted Agent: cách gắn ProxyAgent, cách tự gửi tài khoản proxy, cách hủy Deferred, và giới hạn phạm vi với HTTPS.

Brief của bài yêu cầu giới hạn phạm vi đúng phần hoạt động thay vì mặc định treq giống Requests. Kết quả lab cho thấy đây là yêu cầu đúng: treq qua ProxyAgent chạy tốt với URL http, nhưng với URL https thì hành vi khác hẳn mọi thư viện proxy quen thuộc.

Chuẩn bị lab cho Python treq proxy

Phiên bản và cài đặt

Lab chạy trên Windows 10, Python 3.12 trong môi trường ảo. Cài treq từ PyPI kéo theo Twisted. Bản ghi nhận được là treq 26.7.0 và Twisted 26.4.0.

python -m venv venv
venv\Scripts\python -m pip install treq
venv\Scripts\python -c "import treq, twisted; print(treq.__version__, twisted.__version__)"

Ghi hai số phiên bản này vào README. Hành vi proxy nằm ở Twisted, nên khi nâng Twisted cần chạy lại các ca thử, kể cả khi treq giữ nguyên bản.

Proxy và website thử

Proxy thử là một chương trình Python nghe các cổng riêng: website thử, proxy HTTP cần tài khoản user1 với mật khẩu p@ss#2026. Website tên shop.test, chỉ phân giải được bên trong proxy. Request đi thẳng sẽ báo lỗi DNS, request qua proxy sẽ nhận JSON.

Mọi request tới proxy được ghi vào nhật ký gồm phương thức, đích, có tài khoản hay không. Nhật ký này là nguồn chính để biết treq thật sự gửi gì cho proxy, đặc biệt với URL https.

Khung chạy bằng task.react và async

Twisted chạy trên reactor. Cách gọn để viết lab là dùng task.react với một hàm async, bên trong await các Deferred mà treq trả về. Mỗi ca được bọc trong hàm case để in mã trạng thái hoặc tên ngoại lệ.

from twisted.internet import defer, task
 
async def case(name, d):
    try:
        r = await d
        body = await r.text()
        print(name, "OK", r.code, body[:70])
    except Exception as e:
        print(name, "ERR", type(e).__name__, str(e)[:160])
 
async def main(reactor):
    ...
 
task.react(lambda r: defer.ensureDeferred(main(r)))

Cách viết async này cho mã dễ đọc hơn chuỗi addCallback. Bên dưới vẫn là Deferred, nên hủy và timeout vẫn theo cơ chế của Twisted.

Cấu hình Python treq proxy tường minh

HTTPClient với ProxyAgent

treq cần HTTPClient có ProxyAgent

treq cần HTTPClient có ProxyAgent

Đoạn dưới là cấu hình mình chạy trong lab. Endpoint trỏ tới proxy, ProxyAgent bọc endpoint, HTTPClient của treq bọc ProxyAgent.

from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.web.client import ProxyAgent
from treq.client import HTTPClient
 
endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 8942)
proxied = HTTPClient(ProxyAgent(endpoint))

Từ đây, proxied.get, proxied.post dùng giống treq.get, treq.post. Hàm cấp module như treq.get vẫn dùng Agent mặc định đi thẳng. Nhầm giữa treq.get và proxied.get là lỗi dễ mắc nhất khi chuyển mã có sẵn sang proxy.

Tự gửi Proxy-Authorization

ProxyAgent không có tham số tài khoản proxy. Gọi proxied.get mà không thêm gì, proxy trả 407 và treq trả response có code 407, không ném lỗi. Nhật ký proxy ghi request không có tài khoản.

Cách làm là tự gắn tiêu đề Proxy-Authorization kiểu Basic vào từng request. Vì ProxyAgent gửi request dạng địa chỉ đầy đủ tới proxy, tiêu đề này đi thẳng tới proxy cùng request.

import base64
 
def proxy_auth(user, password):
    token = base64.b64encode(f"{user}:{password}".encode()).decode()
    return {"Proxy-Authorization": ["Basic " + token]}
 
r = await proxied.get("http://shop.test:8941/c", headers=proxy_auth("user1", "p@ss#2026"), timeout=3)

Với tài khoản đúng, response 200 và thân là JSON của shop.test. Với mật khẩu sai, response 407. Vì tài khoản là chuỗi riêng mã hóa base64, mật khẩu có @ hay # không cần mã hóa phần trăm. Bài sửa lỗi 407 Proxy Authentication Required có danh sách nguyên nhân phía nhà cung cấp.

Tiêu đề proxy đi theo redirect

Trang /redir trả 302 sang /after-redirect. treq mặc định theo redirect, response cuối 200. Nhật ký proxy ghi cả hai request, request sau vẫn có tài khoản. Nghĩa là tiêu đề Proxy-Authorization được giữ qua redirect.

Điều này tiện khi redirect trong cùng website. Nhưng nếu redirect sang host khác mà vẫn qua cùng proxy, tiêu đề vẫn đi theo, không vấn đề gì vì đích của tiêu đề là proxy. Vấn đề chỉ xuất hiện nếu ai đó dùng Agent đi thẳng mà vẫn gắn tiêu đề này, khi đó tài khoản proxy bị gửi tới website. Đừng gắn proxy_auth cho request đi thẳng.

Giới hạn HTTPS của Python treq proxy

ProxyAgent gửi GET https dạng rõ

GET https đi dạng rõ

GET https đi dạng rõ

Đây là kết quả quan trọng nhất của lab. Gọi proxied.get tới https://example.com với tài khoản đúng, response 200 với HTML của example.com. Nhìn qua tưởng chạy tốt. Nhưng nhật ký proxy ghi phương thức GET với đích https://example.com/, không phải CONNECT example.com:443.

Nghĩa là ProxyAgent không mở đường hầm cho HTTPS. Nó gửi request dạng địa chỉ đầy đủ có tiền tố https tới proxy qua kết nối thường, không mã hóa. Proxy thử của mình chỉ biết chuyển tiếp HTTP, nên nó tách URL, kết nối tới example.com cổng 80 bằng HTTP thường, và example.com trả trang qua HTTP. Không có TLS nào giữa treq và example.com.

Với treq qua ProxyAgent, URL https không bảo đảm mã hóa đầu cuối. Kết quả thực tế phụ thuộc vào proxy: proxy có thể tự bắt tay TLS với website rồi trả nội dung rõ cho treq, có thể từ chối, hoặc như lab của mình là đi HTTP thường.

Vì sao điều này nguy hiểm

Với đường hầm CONNECT theo RFC 9110, proxy chỉ chuyển byte đã mã hóa, không đọc được nội dung, không thấy cookie hay khóa API. Với cách của ProxyAgent, proxy nhận request dạng rõ, thấy mọi tiêu đề kể cả Authorization của website, thấy toàn bộ thân request và response.

Nếu treq gửi khóa API của một dịch vụ qua proxy thương mại theo cách này, nhà cung cấp proxy và bất kỳ ai trên chặng từ máy tới proxy đều đọc được khóa. Chưa kể chặng từ proxy tới website có được mã hóa hay không phụ thuộc vào proxy. Proxy không làm gì sai ở đây. ProxyAgent được thiết kế như vậy, tài liệu Twisted nói nó dành cho biến thể proxy của HTTP.

Giới hạn phạm vi đúng phần hoạt động

Kết luận cho phạm vi dùng: treq qua ProxyAgent phù hợp với URL http, hoặc với proxy nội bộ do chính anh em quản lý, nơi anh em chấp nhận để proxy thấy toàn bộ nội dung. Không dùng treq qua ProxyAgent cho URL https qua proxy thương mại hay proxy công cộng khi request chứa bí mật.

Nếu cần HTTPS qua proxy với Twisted, cần một agent mở đường hầm CONNECT. Tài liệu Twisted gợi ý Agent.usingEndpointFactory cho các kiểu proxy khác, nơi anh em tự cung cấp endpoint. Mình chưa viết hay thử endpoint đường hầm trong lab, nên không đưa mã ở đây. Với dự án cần HTTPS qua proxy ngay, cân nhắc client khác có hỗ trợ CONNECT rõ ràng như aiohttp hay httpx.

Tài liệu Twisted dùng URL https trong ví dụ ProxyAgent, nhưng nhật ký proxy cho thấy request đi dạng GET https rõ, không có CONNECT. Kiểm nhật ký proxy trước khi tin rằng HTTPS được mã hóa đầu cuối.

Hủy request và timeout trong Python treq proxy

Tham số timeout của treq

treq nhận tham số timeout tính bằng giây. Với trang chờ 5 giây và timeout 2, treq ném ResponseNeverReceived chứa CancelledError. Đây là cách treq cài timeout: khi hết giờ, nó hủy Deferred của request.

Trong lab, nhật ký proxy vẫn ghi request tới /slow, nghĩa là request đã tới proxy và proxy đã chuyển tới website trước khi bị hủy ở phía treq. Hủy ở phía client không thu hồi request đã gửi. Với POST tạo dữ liệu, timeout không có nghĩa là website chưa xử lý.

Hủy Deferred thủ công

Hủy Deferred khi không cần nữa

Hủy Deferred khi không cần nữa

Brief yêu cầu test hủy request. Mình gửi một request tới /slow không đặt timeout, rồi gọi reactor.callLater(0.5, d.cancel) để hủy sau nửa giây. Kết quả giống timeout: ResponseNeverReceived chứa CancelledError.

d = proxied.get("http://shop.test:8941/slow", headers=proxy_auth("user1", "p@ss#2026"))
reactor.callLater(0.5, d.cancel)
try:
    await d
except Exception as e:
    print(type(e).__name__, e)

Hủy thủ công hữu ích khi một luồng nghiệp vụ biết không cần kết quả nữa, ví dụ người dùng đã rời trang hay một request khác đã trả lời trước. Hủy giải phóng kết nối tới proxy thay vì giữ nó chờ website chậm.

Phân biệt lỗi khi qua proxy

Bảng dưới gom kết quả 11 ca trong lab, kèm kiểu kết quả và ý nghĩa.

Bảng: Phân biệt lỗi khi qua proxy

Ca

Kết quả

Ý nghĩa

treq.get, có HTTP_PROXY

DNSLookupError

treq bỏ qua biến môi trường

ProxyAgent, không tài khoản

Response 407

Proxy đòi xác thực

ProxyAgent, tài khoản đúng

Response 200

Đi qua proxy

ProxyAgent, mật khẩu sai

Response 407

Proxy từ chối

POST JSON

Response 200, thân đúng

Đi qua proxy

URL https

Response 200, nhật ký ghi GET https

Không có CONNECT

timeout 2 với trang chậm 5 giây

ResponseNeverReceived, CancelledError

Hết giờ

Redirect

Response 200, tài khoản giữ qua redirect

Theo redirect qua proxy

Proxy không mở cổng

ConnectionRefusedError

Sai cổng hoặc proxy chết

Hủy thủ công

ResponseNeverReceived, CancelledError

Đã hủy

Website trả 503

Response 503

Website lỗi

Điểm cần nhớ: 407 và 503 đều là response bình thường, không phải ngoại lệ. Mã xử lý phải kiểm response.code. Ngoại lệ chỉ đến từ lỗi mạng, hủy và timeout.

Python treq proxy và Deferred trong ứng dụng lớn

Một HTTPClient dùng chung

HTTPClient bọc Agent, Agent giữ bể kết nối mặc định. Tạo một HTTPClient có proxy dùng chung cho ứng dụng thay vì tạo mới cho mỗi request. Với tác vụ cần nhiều proxy, tạo một HTTPClient cho mỗi proxy và lưu trong dict theo khóa proxy.

Có thể truyền HTTPConnectionPool cho ProxyAgent để kiểm soát số kết nối giữ sẵn. Với proxy có giới hạn luồng, giới hạn số kết nối đồng thời là cách tránh bị proxy từ chối. Mình chưa thử pool trong lab, chỉ dùng mặc định.

Giới hạn đồng thời bằng DeferredSemaphore

Twisted có DeferredSemaphore để giới hạn số Deferred chạy cùng lúc. Bọc mỗi request bằng semaphore.run, đặt số giấy phép bằng hoặc thấp hơn hạn mức luồng của gói proxy.

from twisted.internet.defer import DeferredSemaphore, gatherResults
 
sem = DeferredSemaphore(5)
 
def fetch(url):
    return sem.run(proxied.get, url, headers=proxy_auth("user1", "p@ss#2026"), timeout=10)
 
results = await gatherResults([fetch(u) for u in urls], consumeErrors=True)

consumeErrors tránh lỗi của một request làm cả nhóm báo lỗi chưa xử lý. Sau gatherResults, duyệt kết quả và kiểm code của từng response.

Thử lại có kiểm soát

treq không tự thử lại. Với lỗi mạng tạm thời như ConnectionRefusedError hay ResponseNeverReceived do proxy chập chờn, tự viết vòng thử lại cho GET, có khoảng nghỉ bằng task.deferLater để không chặn reactor. Không dùng time.sleep trong mã Twisted, nó chặn cả vòng sự kiện.

Với POST tạo dữ liệu, không thử lại sau timeout, vì như đã thấy, request có thể đã tới website. Khi website trả 429, đọc Retry-After và giãn nhịp. Bài lỗi 429 khi dùng proxy có cách xử lý.

Chuyển mã từ Requests sang Python treq proxy

Những gì không mang sang được

Nhiều dự án chuyển từ Requests sang treq để tận dụng Twisted, và mang theo thói quen cấu hình proxy. Dict proxies không có tác dụng, biến môi trường HTTP_PROXY không có tác dụng, tài khoản trong URL proxy kiểu http://user:pass@host không có chỗ để đặt. Ba thói quen này đều phải bỏ.

Thứ thay thế là một chỗ duy nhất trong mã tạo HTTPClient có ProxyAgent, cộng một hàm dựng tiêu đề tài khoản. Mã nghiệp vụ nhận HTTPClient qua tham số thay vì gọi treq.get trực tiếp. Cách tổ chức này cũng giúp thay HTTPClient bằng bản giả khi viết test.

Bảng đối chiếu nhanh

Bảng dưới đặt cách làm của Requests cạnh cách làm tương ứng với treq qua ProxyAgent, theo những gì lab đã xác nhận.

Bảng: Bảng đối chiếu nhanh

Việc cần làm

Requests

treq qua ProxyAgent

Chọn proxy

proxies={"http": ..., "https": ...}

HTTPClient(ProxyAgent(endpoint))

Tài khoản proxy

Trong URL proxy

Tự gắn tiêu đề Proxy-Authorization

Đọc biến môi trường

Có, mặc định

Không

URL https

Đường hầm CONNECT

GET https dạng rõ tới proxy

Lỗi 407

Thường là ngoại lệ ProxyError

Response có code 407

Timeout

Tham số timeout

Tham số timeout, hủy Deferred

Dòng URL https là dòng quan trọng nhất khi chuyển mã. Mã chạy đúng với Requests có thể trở nên kém an toàn với treq mà không có lỗi nào báo ra. Rà lại mọi URL https trước khi chuyển.

Giữ hành vi kiểm lỗi

Với Requests, nhiều dự án dựa vào raise_for_status để biến 4xx, 5xx thành ngoại lệ. treq có hàm tương tự trên response, nhưng cần gọi rõ ràng. Đặc biệt với 407, nếu không gọi, mã sẽ đọc thân rỗng của response 407 như thể là dữ liệu thật.

Mình khuyên viết một hàm bọc nhận response, kiểm code, ném ngoại lệ riêng cho 407 với thông điệp về proxy, và ngoại lệ khác cho lỗi website. Tách hai loại giúp log rõ lỗi nằm ở đâu.

Đọc thân response khi dùng Python treq proxy

text, json và content

treq có các hàm đọc thân: text cho chuỗi, json cho đối tượng JSON, content cho bytes. Mỗi hàm trả một Deferred, cần await. Trong lab, mình dùng r.text() cho mọi ca để in đoạn đầu thân.

Với response 407 hay 503 từ proxy, thân thường rỗng hoặc là trang HTML ngắn của proxy. Gọi json trên thân đó sẽ lỗi giải mã. Kiểm code trước rồi mới đọc JSON, tránh nhầm lỗi proxy thành lỗi dữ liệu.

Thân lớn và bộ nhớ

Các hàm text, json, content đọc toàn bộ thân vào bộ nhớ. Với tệp lớn tải qua proxy, dùng treq.collect để nhận dữ liệu theo từng khối và ghi dần ra đĩa. Timeout vẫn áp cho cả quá trình, đặt đủ dài cho tốc độ thấp nhất chấp nhận được.

Khi proxy cắt kết nối giữa chừng, collect sẽ báo lỗi. Tệp ghi dở cần xóa hoặc đánh dấu chưa xong. Nếu website hỗ trợ tải tiếp theo khoảng byte, có thể gửi lại request với tiêu đề Range để lấy phần còn lại qua cùng proxy.

Chạy đối chứng Python treq proxy

Đọc nhật ký proxy cho từng ca

Với treq, nhật ký proxy quan trọng hơn kết quả phía client. Ca https cho thấy rõ nhất: phía client thấy 200 và HTML, phía proxy thấy GET https rõ. Không có nhật ký proxy, anh em sẽ tin rằng mọi thứ ổn.

Khi thử với proxy thương mại, thường không có quyền đọc nhật ký phía proxy. Khi đó, dựng proxy cục bộ có nhật ký như lab để xác nhận hành vi của treq, rồi mới đổi sang proxy thật. Hành vi của ProxyAgent không phụ thuộc proxy nào, nên kết quả trên proxy cục bộ áp được cho proxy thật.

Bộ ca tối thiểu trước khi dùng thật

  • treq.get không qua HTTPClient có proxy: phải đi thẳng, xác nhận biến môi trường không có tác dụng.
  • proxied.get không tài khoản: response 407.
  • proxied.get có proxy_auth: response 200, nhật ký có tài khoản.
  • URL https: kiểm nhật ký là GET https hay CONNECT, quyết định phạm vi dùng.
  • timeout ngắn với trang chậm: ResponseNeverReceived.
  • Hủy thủ công: ResponseNeverReceived, kết nối được giải phóng.
  • Kiểm IP ra: gọi dịch vụ trả IP bằng URL http qua proxy, so với IP proxy mong đợi.

Ca kiểm IP dùng URL http vì lý do đã nói. Nếu dùng URL https, kết quả đúng IP nhưng không chứng minh được gì về mã hóa.

Kiểm IP ra

Với proxy thương mại, so IP nhận được với IP mà nhà cung cấp cam kết. Nếu trùng IP máy chủ, request đang đi thẳng, thường do gọi nhầm treq.get thay vì proxied.get. Ghi IP ra vào log khởi động.

Python treq proxy trong dự án Twisted có sẵn

Đặt proxy ở tầng dịch vụ

Trong ứng dụng Twisted lớn, request HTTP thường nằm rải rác ở nhiều module: gọi API thanh toán, lấy dữ liệu từ website đối tác, gửi webhook. Không phải module nào cũng cần proxy. Đặt proxy ở tầng dịch vụ, nơi mỗi module nhận HTTPClient phù hợp qua tham số khởi tạo, giúp tách rõ tuyến nào đi proxy.

Ví dụ dịch vụ lấy dữ liệu đối tác nhận HTTPClient có ProxyAgent, còn dịch vụ webhook nội bộ nhận HTTPClient đi thẳng. Khi đổi nhà cung cấp proxy, chỉ cần sửa chỗ tạo HTTPClient có proxy, không đụng vào logic nghiệp vụ.

Test với HTTPClient giả

treq có công cụ kiểm thử cho phép thay HTTPClient bằng bản trả response giả mà không mở kết nối. Test nghiệp vụ dùng bản giả này, chạy nhanh và không phụ thuộc mạng. Nhưng test kiểu này không chạm tới proxy, nên luôn có xanh dù cấu hình proxy sai.

Vì vậy cần thêm một nhóm test tích hợp nhỏ chạy với ProxyAgent thật và proxy cục bộ có nhật ký, như bộ ca kiểm ở phần trên. Nhóm này có thể chạy ít hơn, ví dụ trước mỗi lần triển khai, nhưng không được bỏ. Đặc biệt ca URL https phải nằm trong nhóm này để không ai vô tình đưa URL https có bí mật vào tuyến proxy.

Ghi lại quyết định phạm vi

Vì giới hạn HTTPS là một quyết định kiến trúc, ghi nó thành văn bản trong README hoặc tài liệu kiến trúc của dự án. Một dòng như chỉ dùng ProxyAgent cho URL http hoặc proxy nội bộ tin cậy giúp người mới không tự thêm URL https vào tuyến proxy.

Khi có nhu cầu HTTPS qua proxy thương mại, mở một đầu việc riêng để đánh giá: viết endpoint đường hầm qua Agent.usingEndpointFactory hay tách phần đó sang client khác. Đừng giải quyết bằng cách chép một đoạn mã trên mạng mà chưa kiểm nhật ký proxy.

Gỡ cấu hình thử và quản lý bí mật trong Python treq proxy

Không in tiêu đề proxy

Tiêu đề Proxy-Authorization chỉ là base64 của tài khoản. In dict headers ra log là lộ mật khẩu. Khi ghi log request, chỉ ghi URL, mã trạng thái và thời gian. Nếu bật log chi tiết của Twisted, kiểm xem tiêu đề có bị in ra không.

Đọc tài khoản proxy từ biến môi trường hoặc kho bí mật, dựng proxy_auth một lần khi khởi động. Không ghi tài khoản trong mã nguồn. Trên CI, đưa tài khoản vào mục secret.

Với URL https, cân nhắc lại cả kiến trúc

Vì ProxyAgent gửi URL https dạng rõ, mọi tiêu đề Authorization của website cũng đi rõ tới proxy. Nếu ứng dụng treq gọi API có khóa qua proxy, khóa đó đã lộ cho proxy. Trước khi đưa vào dùng thật, rà lại mọi URL https mà ứng dụng gọi qua proxied.

Với các URL đó, hoặc gọi đi thẳng không qua proxy, hoặc chuyển sang client có đường hầm CONNECT. Đây là quyết định kiến trúc, không phải tùy chọn cấu hình.

Chọn loại proxy

Với URL http như trang công khai không cần bảo mật hay API nội bộ qua proxy công ty, treq qua ProxyAgent chạy tốt. Proxy tĩnh phù hợp khi cần IP cố định, proxy xoay khi cần chia tải. Với HTTPS, xem lại phần giới hạn ở trên trước khi chọn proxy.

ProxyVN có proxy dân cư tĩnh, datacenter và proxy xoay, hỗ trợ HTTP và SOCKS5, cấp tài khoản user và mật khẩu. Nếu cần proxy HTTP cho phần URL http của ứng dụng treq, anh em có thể mua proxy Việt Nam tại trang chủ ProxyVN rồi chạy lại bộ ca kiểm ở trên.

Câu hỏi thường gặp về Python treq proxy

treq có đọc HTTP_PROXY không. Không. Trong lab, treq.get với HTTP_PROXY vẫn đi thẳng và báo lỗi DNS.

Đặt tài khoản proxy ở đâu. Tự gắn tiêu đề Proxy-Authorization kiểu Basic vào từng request qua HTTPClient có ProxyAgent.

treq có hỗ trợ HTTPS qua proxy không. Qua ProxyAgent, request https được gửi dạng GET https rõ tới proxy, không có CONNECT. Không bảo đảm mã hóa đầu cuối.

407 có phải ngoại lệ không. Không. treq trả response với code 407, phải tự kiểm.

Hủy request thế nào. Gọi cancel trên Deferred, hoặc dùng tham số timeout. Cả hai cho ResponseNeverReceived chứa CancelledError.

Có dùng được SOCKS5 không. treq và ProxyAgent không có hỗ trợ SOCKS sẵn. Cần endpoint riêng qua Agent.usingEndpointFactory, mình chưa thử.

Có nên dùng time.sleep giữa các lần thử lại không. Không. Dùng task.deferLater để không chặn reactor.

Có thể dùng chung một HTTPClient cho nhiều website không. Có. HTTPClient có ProxyAgent gửi mọi request qua cùng proxy, bất kể website nào. Muốn website khác đi proxy khác, tạo HTTPClient khác.

ProxyAgent có giữ kết nối tới proxy không. Có, qua bể kết nối mặc định của Agent. Request sau tới cùng proxy có thể dùng lại kết nối cũ.

Proxy thương mại xử lý GET https thế nào. Tùy nhà cung cấp. Có proxy tự bắt tay TLS với website rồi trả nội dung rõ cho client, có proxy từ chối vì chỉ hỗ trợ CONNECT cho https. Trong cả hai trường hợp, chặng từ treq tới proxy không được mã hóa.

Có nên dùng treq cho crawl trang công khai qua proxy không. Với trang http công khai thì được. Với trang https, mọi nội dung đi rõ tới proxy. Nếu nội dung không nhạy cảm và chấp nhận điều đó thì vẫn chạy, nhưng hãy ghi rõ quyết định này.

Checklist Python treq proxy

Checklist Python treq proxy

Checklist Python treq proxy

Trước khi dùng thật

  • Dùng HTTPClient có ProxyAgent, không dùng treq.get cấp module.
  • Tự gắn Proxy-Authorization cho request qua proxy, không gắn cho request đi thẳng.
  • Kiểm response.code 407.
  • Không gửi bí mật qua URL https bằng ProxyAgent tới proxy không tin tưởng.
  • Đặt timeout cho mọi request.
  • Giới hạn đồng thời bằng DeferredSemaphore.
  • Không thử lại POST sau timeout.
  • Đọc nhật ký proxy ít nhất một lần cho mỗi loại URL.

Giới hạn của lab

Lab chạy treq 26.7.0, Twisted 26.4.0 trên Windows với proxy tự dựng chỉ hỗ trợ HTTP chuyển tiếp và CONNECT. Chưa thử Agent.usingEndpointFactory với endpoint đường hầm, chưa thử HTTPConnectionPool tùy chỉnh, chưa thử SOCKS và chưa thử proxy thương mại. Hành vi của proxy thật với request GET https có thể khác proxy thử.

Python treq proxy và những điều cần nhớ

Python treq proxy chỉ chạy qua HTTPClient có ProxyAgent, không đọc HTTP_PROXY, tài khoản phải tự gắn bằng Proxy-Authorization. Với URL https, ProxyAgent gửi GET https rõ chứ không mở CONNECT. Dùng timeout và hủy Deferred khi cần. Cần proxy HTTP ổn định cho Python treq proxy, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.

TIN TỨC LIÊN QUAN