如何在PyQ中阻止广告

2024-04-29 01:57:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个网络浏览器,我想在其中启用广告拦截。 我读过多个答案,但都没能成功实施。你知道吗

我已经成功地加载了adFilter和ad匹配工作良好。你知道吗

我认为这与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方法。广告被检测到,但那些广告请求实际上没有被阻止。你知道吗

我如何做到这一点。你知道吗


Tags: selfurlgetinitrequestdefreplyheaders
1条回答
网友
1楼 · 发布于 2024-04-29 01:57:16

这就是我最终实现AdBlocker的方式。您只需要重写QWebEnginePage类中的acceptNavigationRequest方法。我就是这样实现的

class WebPage(QWebEnginePage):

    adblocker = Filter(open('easylist.txt', encoding="utf8"))

    def __init__(self, parent=None):
        super().__init__(parent)

    def acceptNavigationRequest(self, url,  _type, isMainFrame):

        urlString = url.toString()
        resp = False
        resp = WebPage.adblocker.match(url.toString())

        if resp:
            print("Blocking url  - "+url.toString())
            return False
        else:
            print("TYPE", _type)
            return True

        return QWebEnginePage.acceptNavigationRequest(self, url,  _type, isMainFrame)

相关问题 更多 >