Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/leonardodalinky/easylist-project
Homework for graduate course.
https://github.com/leonardodalinky/easylist-project
Last synced: about 1 month ago
JSON representation
Homework for graduate course.
- Host: GitHub
- URL: https://github.com/leonardodalinky/easylist-project
- Owner: leonardodalinky
- License: mit
- Created: 2022-10-27T11:44:38.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2022-10-30T16:48:10.000Z (about 2 years ago)
- Last Synced: 2024-10-28T04:48:10.698Z (3 months ago)
- Language: Jupyter Notebook
- Size: 73.2 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# easylist-project
Homework for graduate course.## 预备工作
目前已经将 [easylist](https://github.com/easylist/easylist) 和 [easylistchina](https://github.com/easylist/easylistchina) 都加为子模块。
easylist 以及 easylistchina 都需要**固定**到其 master 分支的一个比较新的 commit。之后的所有工作仅此 commit 之前的版本:
* easylist: bb058be
* easylistchina: 23537fb由于可能会涉及多版本回溯,子模块仅作为版本的 anchor,起提示作用。实际代码中可能并不会涉及到子模块中的内容,并且可能需要自行在其他版本中自行重新克隆子模块的项目。
easylist 的文件结构在[此处查阅](https://adblockplus.org/filter-cheatsheet)。
## TODO-List
- [x] 找到现成的或者自己实现一个 easylist filter 解析器
- 独立域名统计
- [ ] 最新版本的独立域名统计,包括有多少个不同的域名,每个二级/三级域名下,又有多少个规则等
- [ ] 对历史版本都进行统计
- filter 差分统计
- [ ] 对各个版本中的 filters 进行差分过滤,得到每个版本中的变化情况。我们只记录 filter 的增加与删除,对于 filter 的修改,我们将其当作一次删除与一次增加。使用 JSON 形式记录。
- 根据上面所获得的各个版本的变更信息,并分析一些信息:
- 新增和删去的规则中,其数量多少,normal rule 和 html rule 各有多少
- 平均每个 commit 之间的时间差
- 所认为的新增的 Exception rule 的数量
- 单独的 EX rule 的添加时间,与其 base rule 的添加时间的时间差
- easylist 失效的情景
- [ ] 找一些 easylist 失效的场景,这里可以使用一些现成的广告拦截插件(例如 AdBlock)来寻找
- [ ] 总结多方面的失败原因
- To be continued.## 域名过滤的规则
由于 easylistchina 中存在着太多不完整的域名,以及存在着许许多多的通配域名,例如:
```
*.ad.baidu.com
adyss.
```对于这种域名,我们采取以下策略:
- 不完整域名:直接丢弃,当做没看见
- 通配域名:尽可能保留域名最后面不带通配域名的部分## Rule parser 用法
`Rule` 和 `Rules` 的定义参考 `filter_parser` 模块。
主要通过 `repo_utils` 模块中的函数来读取 `easylistchina` 中所包含的各个历史版本的 filter 数据。
Examples:
```python
import repo_utilsrepo = repo_utils.get_git_repo("/tmp/easylistchina")
# 读取当前 repo 的规则
rules = repo_utils.get_rules_rel_from_repo(repo, "easylistchina.txt")
# 读取当前 repo 下所有历史版本的规则数据
rules_list = list(repo_utils.iter_all_rules_from_repo(repo, "easylistchina.txt"))
````Rule` 对象下面最重要的是 `domain`,里面会可能有不完整或者通配域名等怪异状况,急需一个过滤手段。
如果已有 `extract_easylists.py` 预处理好的 easylist 大全,那么可以手动加载 `Rules`:
```python
from datetime import datetime
from filter_parser import Rulesrules = Rules.from_file("/tmp/easylistchina.txt", time=datetime.utcnow(), commit_hash="1H34SD8A0")
```## Scripts 用法
### `scripts/extract_easylists.py`
这个脚本用来提取所有的历史 easylistchina 中的 `easylistchina.txt` 文件,并存储在指定目录下。
Usage:
```bash
# 提取 easylistchina 中的 easylistchina.txt 文件
python scripts/extract_easylists.py -r /tmp/easylistchina -f easylistchina.txt -o /tmp/all_easylists
```### `scripts/diff.py`
这个脚本用来执行不同版本的 `easylistchina.txt` 的差分操作,必须用于 `extract_easylists.py` 所生成的目录。
```bash
python scripts/diff.py -d /tmp/all_easylists -o /tmp/easylists_diff
```## easylistchina 失效的情景
1. 有一些域名未被列入 easylist 中,而是委托给一些小广告商,然后他们经常改变域名,使得难以被追踪
2. 有一些网站加载了 anti-adblock 的脚本,这些脚本会检测广告是否正常加载,如果没有加载,那么就会显示一些提示,或者直接阻止网页的正常加载
3. To be continued.