【发布时间】:2018-03-17 18:32:25
【问题描述】:
我正在构建一个网络浏览器,我想在其中启用广告拦截。 看了多个答案,都没有成功实现。
我已成功加载 adFilter 并且广告匹配工作正常。
我认为这与 networkAccessManager 有关,但我无法弄清楚如何。
这是我继承 QNetworkAccessManager 类的类
class NetworkManager(QNetworkAccessManager):
def __init__(self):
super().__init__()
self.adblocker = Filter(open('easylist.txt', encoding="utf8"))
self.finished.connect(self._finished)
def createRequest(self, op, request, device=None):
url = request.url().toString()
if self.adblocker.match(url):
print('blocking url, ', url)
# block ads here
else:
print('good to go', url)
return QNetworkAccessManager.createRequest(self, op, request, device)
def examine(self, url):
self.get(QNetworkRequest(QUrl(url)))
def _finished(self, reply):
headers = reply.rawHeaderPairs()
headers = {str(k):str(v) for k,v in headers}
content_type = headers.get("Content-Type")
url = reply.url().toString()
status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
cookies = headers.get("Set-Cookie")
logger.log('{} --- {} --- {}'.format(str(status), url, content_type), 2)
我尝试覆盖 createRequest 方法。广告正在被检测到,但这些广告请求实际上并未被阻止。
我如何做到这一点。
【问题讨论】:
-
是您的
print('blocking url, ', url)分支永远不会执行的问题,还是您在那里代替# block ads here编写的代码不起作用,或者您希望只是没有进入@987654325 @ 应该足够了,但不是吗? -
如果你使用的是 QWebEngineView,那么 QNetworkAccessManager 类将毫无用处。您需要使用QWebEngineUrlRequestInterceptor。
-
@abarnert 打印语句有效。我确实提到过广告正在被检测到。问题是我不知道如何关闭此类网络请求。并且 createRequest 方法返回一个 NetworkReply 对象,所以我需要编写代码来代替要弄清楚的注释
-
@ekhumoro 你能建议相关的代码编辑吗?
-
@PraneetMehta。不,因为我不知道你打算如何使用它。您是否使用 QWebEngineView?
标签: python qt pyqt qnetworkaccessmanager qwebengineview