python3 и ipv6-прокси

Discussion in 'PHP' started by Дикс, 4 Sep 2012.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    сделал тестовый скрипт на питон 3.2, который через ipv6-прокси скачивает страницу

    но даже там где к прокси точно есть доступ, он валится с ошибкой 403 forbidden

    есть ли какие-нибудь тонкости в бейсик-авторизации ipv6? или вообще в подключении к ним?

    скрипт:
    PHP:
    import urlliburllib.request

    request 
    urllib.request.Request('http://internet.yandex.ru')

    hnds = []
    proxy_map = {'http''2a01:230:2::1ae:3128'}

    hnd urllib.request.ProxyHandler(proxy_map)
    hnds.append(hnd)

    auth_handler urllib.request.HTTPBasicAuthHandler()
    auth_handler.add_password('realm''host''bsbdpul''123123')
    hnds.append(auth_handler)

    opener urllib.request.build_opener(*hnds)
    urllib.request.install_opener(opener)


    response urllib.request.urlopen(requesttimeout=20)

    page response.read()
    page page.decode('utf-8''ignore')

    print(
    'downloaded {0} bytes'.format(len(page)))
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Дикс покажите дамп запросов при работе с прокси.

    Ну или попробуйте заменить урл прокси на правильный согласно RFC. IP адрес должен быть заключен в квадратные кавычки, после которых через двоеточие может идти номер порта. Как-то так:
    Code:
    proxy_map = {'http': 'http://[2a01:230:2::1ae]:3128/'} 
     
    _________________________
    #2 Gifts, 4 Sep 2012
    Last edited: 4 Sep 2012
  3. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    заработало когда изменил тип на https

    proxy_map = {'https': 'http://[2a01:230:2::2a3]:3128/'}
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Дикс Вы уверены, что подключение к http://internet.yandex.ru идет через прокси с таким изменением?
     
    _________________________
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    да, облажался =\

    сейчас у меня постоянно


    Traceback (most recent call last):
    File "/usr/lib/python3.2/urllib/request.py", line 1135, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
    File "/usr/lib/python3.2/http/client.py", line 967, in request
    self._send_request(method, url, body, headers)
    File "/usr/lib/python3.2/http/client.py", line 1005, in _send_request
    self.endheaders(body)
    File "/usr/lib/python3.2/http/client.py", line 963, in endheaders
    self._send_output(message_body)
    File "/usr/lib/python3.2/http/client.py", line 808, in _send_output
    self.send(msg)
    File "/usr/lib/python3.2/http/client.py", line 746, in send
    self.connect()
    File "/usr/lib/python3.2/http/client.py", line 1100, in connect
    self.timeout, self.source_address)
    File "/usr/lib/python3.2/socket.py", line 404, in create_connection
    raise err
    File "/usr/lib/python3.2/socket.py", line 395, in create_connection
    sock.connect(sa)
    socket.error: [Errno 101] Network is unreachable

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "ipv6.py", line 30, in <module>
    response = urllib.request.urlopen(request, timeout=20)
    File "/usr/lib/python3.2/urllib/request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
    File "/usr/lib/python3.2/urllib/request.py", line 369, in open
    response = self._open(req, data)
    File "/usr/lib/python3.2/urllib/request.py", line 387, in _open
    '_open', req)
    File "/usr/lib/python3.2/urllib/request.py", line 347, in _call_chain
    result = func(*args)
    File "/usr/lib/python3.2/urllib/request.py", line 1171, in https_open
    context=self._context, check_hostname=self._check_hostname)
    File "/usr/lib/python3.2/urllib/request.py", line 1138, in do_open
    raise URLError(err)
    urllib.error.URLError: <urlopen error [Errno 101] Network is unreachable>


    может ли это быть потому что у меня нет внешнего ipv6?
    сайт с тестами говорит что у меня есть ipv4, но нет v6
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Дикс
    Если любое железо между вами и сервером, к которому подключаетесь не умеет ipv6 - вы туда не подключитесь. Это очевидно.

    Однако - вы можете подключаться к прокси, умеющей в ipv6, и это уже она будет общаться с тем же яндексом по нужному адресу. Однако - вам будет сложно получить любой IPv6 адрес. Питон из коробки не умеет делать цепочки проксей (плюс HTTP-прокси вроде как не могут образовывать цепочки в принципе)
     
    _________________________
    1 person likes this.
  7. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    заработало
    что потребовалось:
    - хостинг на firstvds.ru, там в при создании вирт. сервера добавляем ему ipv6-адреса
    - конфигурировать питон с --enable-ipv6
    - указать ип прокси согласно стандарта

    рабочий код - http://pastebin.com/gCZcJnhV
     
    #7 Дикс, 11 Sep 2012
    Last edited by a moderator: 11 Sep 2012
    1 person likes this.