Qt WebEngine设置socks5代理

Posted

技术标签:

【中文标题】Qt WebEngine设置socks5代理【英文标题】:Qt WebEngine set socks5 proxy 【发布时间】:2017-03-28 08:18:18 【问题描述】:

我想为我的 Qt WebEngine 应用程序设置 socks5 代理。我使用 PyQt5.8 ,QT5.8

我通过 danted v1.4.1 设置了一个 socks5 服务器。我测试了我的 socks5 服务器,它运行良好。但是当我在我的应用中使用它时,danted 记录错误:

在 0 秒内读取 3 个字节后出错:客户端提供了不可接受的身份验证方法

这是我的代码:

def set_proxy():
    from PyQt5.QtNetwork import QNetworkProxy
    proxy = QNetworkProxy()

    from six.moves.urllib import parse as urlparse
    string_proxy = "socks5://username:password@ip:port"
    urlinfo = urlparse.urlparse(string_proxy)
    proxy = QNetworkProxy()
    if urlinfo.scheme == 'socks5':
        proxy.setType(QNetworkProxy.Socks5Proxy)
    else:
        proxy.setType(QNetworkProxy.NoProxy)
    if urlinfo.hostname != None:
        proxy.setHostName(urlinfo.hostname)
    if urlinfo.port != None:
        proxy.setPort(urlinfo.port)
    if urlinfo.username != None:
        proxy.setUser(urlinfo.username)
    else:
        proxy.setUser('')
    if urlinfo.password != None:
        proxy.setPassword(urlinfo.password)
    else:
        proxy.setPassword('')
    QNetworkProxy.setApplicationProxy(proxy)

谁能帮帮我?


2017 年 3 月 29 日更新

添加 proxyAuthenticationRequired 信号

def set_proxy(string_proxy):
    proxy = QNetworkProxy()
    urlinfo = urlparse.urlparse(string_proxy)
    if urlinfo.scheme == 'socks5':
        proxy.setType(QNetworkProxy.Socks5Proxy)
    elif urlinfo.scheme == 'http':
        proxy.setType(QNetworkProxy.HttpProxy)
    else:
        proxy.setType(QNetworkProxy.NoProxy)
    proxy.setHostName(urlinfo.hostname)
    proxy.setPort(urlinfo.port)
    proxy.setUser(urlinfo.username)
    proxy.setPassword(urlinfo.password)
    QNetworkProxy.setApplicationProxy(proxy)

def handleProxyAuthReq(url, auth, proxyhost):
    auth.setUser(username)
    auth.setPassword(password)

webView = QtWebEngineWidgets.QWebEngineView()
#proxy_string = "http://username:password@ip:port"
proxy_string = "socks5://username:password@ip:port"
set_proxy(proxy_string)
webView.page().proxyAuthenticationRequired.connect(handleProxyAuthReq)

我通过我的 Http 代理 对其进行了测试,它的措辞。但是当我使用 Socks5 代理 时,proxyAuthenticationRequired 信号无法发出。

【问题讨论】:

【参考方案1】:

QtWebEngine does not handle 来自 QNetworkProxy 的用户名/密码信息:

QNetworkProxy::rawHeader()、QNetworkProxy::user() 或 QNetworkProxy::password() 等所有其他代理设置都将被忽略。

您需要处理proxyAuthenticationRequired 并在那里处理身份验证。


2017 年 3 月 30 日更新

看起来像Chromium does not support 使用 SOCKS 代理进行身份验证。

【讨论】:

我已将它添加到我的代码中。我通过我的 Http 代理对其进行了测试,它的措辞。但是当我使用 Socks5 代理时,无法发出 proxyAuthenticationRequired 信号。 看起来像Chromium does not support this。

以上是关于Qt WebEngine设置socks5代理的主要内容,如果未能解决你的问题,请参考以下文章

Qt5.9 WebEngine 概述

如何使用 Qt webEngine 而不是 Qt webkit

手机浏览器如何设置socks5代理?

用于 javascript 的 QT 5.4 WebEngine 开发工具

怎么开socks5代理,!

Qt基础之十八:WebEngine与JavaScript交互