在我的系统上,我目前运行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
还要注意带有选项的规则;最好删除它们,因为语义是不同的。
希望这有帮助。