如何在 PyQt 中屏蔽广告

Posted

技术标签:

【中文标题】如何在 PyQt 中屏蔽广告【英文标题】:How Do I block ads in PyQt 【发布时间】: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? 【参考方案1】:

这就是我最终实现 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)

【讨论】:

以上是关于如何在 PyQt 中屏蔽广告的主要内容,如果未能解决你的问题,请参考以下文章

如何关掉屏蔽电脑桌面的弹窗广告

苹果自带浏览器怎么设置广告屏蔽

如何在颤动的 webView 中屏蔽广告(移动应用中的网页)

iOS支持Safari广告屏蔽 移动广告行业并不怕

广告商哭了:iOS 9 Safari 或屏蔽广告

优酷视频Mac版怎么去广告?Mac屏蔽优酷广告方法介绍