Туннелирование httplib через прокси-сервер
Я пытаюсь выяснить, как отправлять данные на сервер через прокси. Я надеялся, что это будет возможно через tor, но, поскольку tor использует SOCKS, это, по-видимому, невозможно с httplib (исправьте меня, если я ошибаюсь)
Это то, что я имею прямо сейчас
import httplib
con = httplib.HTTPConnection("google.com")
con.set_tunnel(proxy, port)
con.send("Sent Stuff")
Проблема заключается в том, что она замерзает, когда туннель установлен. Благодарим за помощь.
Ответы
Ответ 1
Если вы хотите использовать http proxy, он должен выглядеть следующим образом:
import httplib
conn = httplib.HTTPConnection(proxyHost, proxyPort)
conn.request("POST", "http://www.google.com", params)
Если вы хотите использовать SOCKS proxy, вы можете использовать SocksiPy, как в этом вопросе: Как использовать прокси SOCKS 4/5 с urllib2?
Ответ 2
Похоже, правильный ответ:
http://bugs.python.org/issue11448#msg130413
import httplib
con = httplib.HTTPConnection(proxyHost, proxyPort)
con.set_tunnel("www.google.com", 80)
con.send("Sent Stuff")
Ответ 3
В качестве продолжения ответа Хуэ Ву, здесь полный пример, подробности получения этой работы с прокси-сервером SOCKS были более сложными, чем ожидалось.
Сначала установите PySocks с помощью:
pip install PySocks
Затем вам нужно вручную настроить свой SOCKS-прокси после создания HTTPConnection и сообщить ему, что он будет использовать прокси-сервер:
from http.client import HTTPConnection
from urllib.parse import urlparse, urlencode
import socks
url = urlparse("http://final.destination.example.com:8888/")
conn = HTTPConnection('127.0.0.1', 9000) # use socks proxy address
conn.set_tunnel(url.netloc, url.port) # remote host and port that you actually want to talk to
conn.sock = socks.socksocket() # manually set socket
conn.sock.set_proxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9000) # use socks proxy address
conn.sock.connect((url.netloc, url.port)) # remote host and port that you actually want to talk to
request_path = "%s?%s" % (url.path, url.query)
conn.request("POST", request_path, post_data)
Обратите внимание, что вышеприведенные им значения - python3.x