Как подключиться к HTTPS-прокси (безопасный веб-прокси) в Pycurl? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь подключиться к защищенному веб-прокси с помощью pycurl. При попытке установить соответствующий тип прокси доступны следующие параметры, которые соответствуют параметрам прокси-сервера curl (в скобках):

 - "PROXYTYPE_HTTP" (CURLPROXY_HTTP)
 - "PROXYTYPE_HTTP_1_0" (CURLPROXY_HTTP_1_0)
 - "PROXYTYPE_SOCKS4" (CURLPROXY_SOCKS4)
 - "PROXYTYPE_SOCKS4A" (CURLPROXY_SOCKS4A)
 - "PROXYTYPE_SOCKS5" (CURLPROXY_SOCKS5)
 - "PROXYTYPE_SOCKS5_HOSTNAME" (CURLPROXY_SOCKS5_HOSTNAME)

Но есть также опция curl под названием CURLPROXY_HTTPS, как указано в документы , которые, по-видимому, недоступны.

При обычном завитке я использую эту команду для подключения к прокси:

curl --proxy https://proxy-host:proxy-port --proxy-insecure -U username:password https://target.com

И все работает как положено. Но не с pycurl.

Как я могу добиться того же поведения в pycurl?

1 Ответ

0 голосов
/ 20 апреля 2020

Следуя предложению Я попал в вопросы о Pycurl Github, я нашел код опции для CURLPROXY_HTTPS, и это 2.

Мне удалось отправить запрос через защищенный веб-прокси с помощью pycurl, используя следующий код:

import pycurl
from io import BytesIO
import certifi


def request_with_pycurl(username, password, host, port, target_url='https://api.ipify.org/'):
    buffer = BytesIO()
    c = pycurl.Curl()

    c.setopt(pycurl.CAINFO, certifi.where())

    # set proxy-insecure
    c.setopt(c.PROXY_SSL_VERIFYHOST, 0)
    c.setopt(c.PROXY_SSL_VERIFYPEER, 0)

    # set headers
    c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0')

    # set proxy
    c.setopt(pycurl.PROXY, f"https://{host}:{port}")

    # proxy auth
    c.setopt(pycurl.PROXYUSERPWD, f"{username}:{password}")

    # set proxy type = "HTTPS"
    c.setopt(pycurl.PROXYTYPE, 2)

    # target url
    c.setopt(c.URL, target_url)

    c.setopt(c.WRITEDATA, buffer)
    c.perform()
    c.close()

    body = buffer.getvalue()
    return body


response = request_with_pycurl("proxy_username", "proxy_password", "proxy_host", "proxy_port").decode()

print(response)
...