用于转换 Polipo 代理 (regex) 禁止文件中的广告拦截列表的 Python 脚本



在我的系统上,我目前运行Polipo代理,主要用于广告拦截目的。通过在互联网上搜索,我发现许多 shell 脚本可以转换 Polipo 禁止文件格式的广告拦截和列表;这些脚本中的大多数都依赖于 SED、Ruby 或 Python。但是,它们都无法生成有效的禁止文件:当我使用新生成的禁止文件重新启动 Polipo 时,在 Polipo 的日志文件中,我看到消息:"Couldn't compile regex: Unmatched ( or (

">

我尝试使用的以下python脚本旨在将简易列表文件转换为Polipo的禁止文件格式:

#!/bin/python
# convert adblock ruleset into polipo-forbidden format
if __name__ == "__main__":
    import os
    import sys
    import re
    if len(sys.argv) == 1:
        sys.exit("Usage: %s <adblockrules>" % os.path.basename(sys.argv[0]))
    if not os.path.exists(sys.argv[1]):
        sys.exit("The rules file (%s) doesn't exist" % sys.argv[1])
    fhandle = file(sys.argv[1])
    lines = fhandle.readlines()
    fhandle.close()
    dollar_re = re.compile("(.*?)$.*")
    for line in lines:
        if line:
            if (line[0] in ("[", "!", "~", "#", "@") or
                line.startswith("/adverti") or
                "##" in line):
                continue
            line = dollar_re.sub(r"1", line)
#           line = line.replace("|http://", "")
            line = line.replace("|", "")
            line = line.replace("||", "")
            line = line.replace(".", r".")
            line = line.replace("*", ".*")
            line = line.replace("?", r"?")
            line = line.replace("^", r"[/:.=&?+- ]+")
#           line = line.replace("&", r"&")
#           line = line.replace("+", r"+")
#           line = line.replace("-", r"-")
#           line = line.replace(";", r";")
#           line = line.replace("=", r"=")
#           line = line.replace("/", r"/")
            print(line.strip())
    print("")

但正如我所说,当我实现这个禁止的文件时,Polipo会声称" Couldn't compile regex: Unmatched ( or ( ">

这是脚本生成的禁止文件http://wikisend.com/download/494664/forbidden.conf

正如我所说,在线上有很多像我使用的脚本,其中一些也依赖于 sed,但似乎没有人能够生成有效的禁止文件(Polipo 总是声称"无法编译正则表达式"(。这不是 Polipo 的错,因为如果我制作了一个干净的禁止文件,里面有一些 Web url,Polipo 会正确地阻止这些连接。

有人可以帮助我并解释如何修改/制作适当的脚本以转换 Polipo 的有效正则表达式禁止文件中的广告拦截列表吗?

非常感谢。

您可以使用

https://github.com/scrapinghub/adblockparser 库将Adblock规则转换为Python正则表达式:

>>> from adblockparser import AdblockRule
>>> rule = AdblockRule("/ad/loaders/*")
>>> print(rule.regex)
/ad/loaders/.*

我不确定 Polipo 是否支持相同的正则表达式格式;正则表达式可能会变得非常毛茸茸的:

>>> print(AdblockRule("||example.com$").regex)
^(?:[^:/?#]+:)?(?://(?:[^/?#]*.)?)?example.com

还要注意带有选项的规则;最好删除它们,因为语义是不同的。

希望这有帮助。

最新更新