【问题标题】:Http Request through proxy in python having @ in password在密码中有@的python中通过代理的Http请求
【发布时间】:2018-02-09 03:47:15
【问题描述】:

如何转义代理密码中的@字符。这样python就可以正确创建请求。我尝试了\\,但仍然无法正确访问网址。

 proxy = {
        "http": "http://UserName:PassWord@X.X.X.X:Port_No"
    }

更新问题:

我正在为 http 请求使用 python 请求模块。它将字符串(以获取主机)从第一次出现的@中拆分出来,因为它应该从第二个@拆分。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 335, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 438, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 327, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='XXXXXXXX@X.X.X.X', port=XXXXX): Max retries exceeded with url: http:/URL (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)

【问题讨论】:

  • @ 在您的问题中第二次出现在哪里?
  • 第一个密码,第二个是密码和ip的分隔符,即'username:st@ckoverflow@192.168.1.200:12345'
  • 嗯?我在你的问题的任何地方都看不到这一点。无论如何,这个代理也适用于我:http://username:st@ckoverflow@127.0.0.1:12345。你试过http://username:st%40ckoverflow@127.0.0.1:12345 了吗?

标签: python proxy


【解决方案1】:

你必须像这篇文章中那样做 urlencoding:

Escaping username characters in basic auth URLs

这样PW中的@就变成了%40

【讨论】:

    【解决方案2】:

    你没有提到你使用哪个库来执行你的 HTTP 请求,所以你应该考虑使用requests,不仅是为了解决这个问题,而且因为它是一个很棒的库。

    下面是如何使用 proxy 和基本身份验证:

    import requests
    
    proxy = {'http': 'http://UserName:PassWord@X.X.X.X:Port_No'}
    r = requests.get("http://whereever.com", proxies=proxy)
    

    更新

    使用请求和代理 URL 成功测试:

    • http://UserName:PassWord@127.0.0.1:1234
    • http://UserName:PassWord@@127.0.0.1:1234
    • http://User@Name:PassWord@1234@127.0.0.1:1234

    如果您需要使用 Python 的 urllib2 库,则可以这样做:

    import urllib2
    
    handler = urllib2.ProxyHandler({'http': 'http://UserName:PassWord@X.X.X.X:Port_No'})
    opener = urllib2.build_opener(handler)
    r = opener.open('http://whereever.com')
    

    请注意,在这两种情况下都不需要转义@

    第三种选择是设置环境变量HTTP_PROXY 和/或HTTPS_PROXY(在*nix 中)。

    【讨论】:

    • 我已经更新了问题,当我使用请求模块时我确实收到了错误。如果我在没有@ 的情况下更改密码,它工作正常
    • @Naresh:好的,我明白我误解了@ 包含在密码字段中的问题。您是否尝试按照 jhinghaus 的建议对 URL 进行 urlencode?​​span>
    • @Naresh:实际上,它确实可以在密码中使用 @,即 2 个 @ 字符,例如 http://UserName:PassWord@1234@127.0.0.1:1234http://User@Name:PassWord@1234@127.0.0.1:1234 等。我使用的是请求版本 1.2.3 .你用的是什么版本?
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多