├── .github ├── wiki │ ├── Home.md │ ├── 致谢.md │ ├── 规则集列表.md │ └── 配置示例.md └── workflows │ ├── main.yml │ └── wiki.yml ├── .gitignore ├── LICENSE ├── README.md ├── build_homepage.py ├── config.py ├── go.sum ├── logging.ini ├── main.py ├── models ├── rule.py └── ruleset.py ├── pdm.lock ├── pyproject.toml ├── source ├── apns.txt ├── apple-intelligence.txt ├── apple-music.txt ├── azurlane-en.txt ├── bangdream-jp.txt ├── bilibili.txt ├── cjmarketing.txt ├── heavenburnsred.txt ├── patches │ ├── domestic.txt │ ├── exclude.txt │ └── reject.txt ├── personal │ ├── bypass.js │ ├── direct.txt │ ├── dns.js │ ├── finance.txt │ └── set_bypass.js ├── proxy.txt ├── reserved_cidr.txt ├── steam.txt └── wechat.txt ├── tests ├── __init__.py ├── src │ ├── custom_ruleset │ │ ├── combined.txt │ │ ├── domain.txt │ │ └── ipcidr.txt │ └── patch │ │ └── patch.txt ├── test_0_rule.py ├── test_1_ruleset.py └── test_2_utils.py ├── utils ├── geosite.py ├── log_decorator.py ├── rule.py └── ruleset.py └── workers ├── custom.py ├── domestic_cidr.py ├── domestic_domain.py ├── personal.py ├── reject_exclude.py ├── speedtest.py ├── telegram_cidr.py └── v2fly.py /.github/wiki/Home.md: -------------------------------------------------------------------------------- 1 | 请通过 Wiki 目录查看可用规则集以及配置示例。 -------------------------------------------------------------------------------- /.github/wiki/致谢.md: -------------------------------------------------------------------------------- 1 | 本项目离不开其他优质开源项目的支持,在此对这些项目表示感谢。 2 | 3 | 若有项目官网则贴出官网地址,若无则贴出托管平台上的项目链接,不分顺序。 4 | 5 | # 规则来源 6 | 7 | - [AdGuard](https://adguard.com/) 8 | - [EasyList](https://easylist.to/) 9 | - [NextDNS](https://nextdns.io/) 10 | - [もちフィルタ](https://eeii0a5l.github.io/mochifilter_homepage/mochi.html) 11 | - [秋风广告规则](https://awavenue.top/) 12 | - [NoCoin adblock list](https://github.com/hoshsadiq/adblock-nocoin-list/) 13 | - [CoinBlockerLists](https://gitlab.com/ZeroDot1/CoinBlockerLists) 14 | - [d3Host List by d3ward](https://github.com/d3ward/toolz/blob/master/src/d3host.adblock) 15 | - [Domain list community](https://github.com/v2fly/domain-list-community/) 16 | - [dnsmasq-china-list](https://github.com/felixonmars/dnsmasq-china-list/) 17 | - [中国运营商IP地址库](https://github.com/gaoyifan/china-operator-ip/) 18 | 19 | # 开源项目 20 | 21 | - [python-abp](https://hg.adblockplus.org/python-abp/) 22 | - [Loyalsoldier / domain-list-custom](https://github.com/Loyalsoldier/domain-list-custom/) 23 | - [Loyalsoldier / geoip](https://github.com/Loyalsoldier/geoip/) 24 | 25 | # 曾使用的项目 26 | 27 | 以下项目已不再被本项目使用,但依然感谢这些项目能够支持本项目的发展。 28 | 29 | ## 规则来源 30 | 31 | - [chnroutes2 (better-aggregated chnroutes)](https://github.com/misakaio/chnroutes2/) 32 | - [乘风广告过滤规则](https://github.com/xinggsf/Adblock-Plus-Rule/) 33 | - [banbendalao / ADgk](https://github.com/banbendalao/ADgk/) 34 | 35 | ## 开源项目 36 | 37 | - [aggregate6](https://github.com/job/aggregate6/) 38 | - [SagerNet / sing-geosite](https://github.com/sagernet/sing-geosite/) 39 | - [SagerNet / sing-geoip](https://github.com/sagernet/sing-geoip/) 40 | -------------------------------------------------------------------------------- /.github/wiki/规则集列表.md: -------------------------------------------------------------------------------- 1 | # 广告服务拦截 2 | 纯文本规则集(Surge 标准,点号通配符): 3 | 4 | 纯文本规则集(Clash 标准,加号通配符): 5 | 6 | YAML 规则集: 7 | 8 | Clash 传统规则集: 9 | 10 | Surge 传统规则集: 11 | 12 | sing-box 规则集: 13 | 14 | GeoSite 标签:`reject` 15 | 16 | - 自动生成 17 | - 拦截在中国与日本常见的广告提供商的服务域名。 18 | - **不**拦截这些服务商面向其接入客户的域名(如:官网、控制台)。如果两者相同,将不会拦截。这意味着该规则的去广告能力可能不足,如你不同意,请不要引用此规则及下方的排除规则。 19 | - 应当放在**所有非拦截类(除下方的排除项之外)规则列表之前** 20 | - 数据来源: 21 | - [本仓库](./source/) 22 | - [AdGuard](https://github.com/AdguardTeam/AdguardFilters) 23 | - [banbendalao / ADgk](https://github.com/banbendalao/ADgk/) 24 | - [EasyList China](https://github.com/easylist/easylistchina) 25 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 26 | - [もちフィルタ](https://eeii0a5l.github.io/mochifilter_homepage/mochi.html) 27 | 28 | ## 排除项 29 | 纯文本规则集(Surge 标准,点号通配符): 30 | 31 | 纯文本规则集(Clash 标准,加号通配符): 32 | 33 | YAML 规则集: 34 | 35 | Clash 传统规则集: 36 | 37 | Surge 传统规则集: 38 | 39 | sing-box 规则集: 40 | 41 | GeoSite 标签:`exclude` 42 | 43 | - 自动生成 44 | - 包含一些不应被拦截规则拦截的域名。 45 | - 如:拦截规则拦截了 `googleadservices.com` 域名,这个域名的许多子域名都被用于推送广告,因此将这个域名纳入拦截列表完全合理。但是,`www.googleadservices.com` 这个子域名用于 Google 搜索引擎中广告条目的跳转,不应被拦截;所以,此域名被纳入排除规则中。 46 | - 应当放在**拦截规则列表之前**。 47 | - 数据来源: 48 | - [本仓库](./source/) 49 | - [AdGuard](https://github.com/AdguardTeam/AdguardFilters) 50 | 51 | 52 | # 中国大陆域名 53 | 纯文本规则集(Surge 标准,点号通配符): 54 | 55 | 纯文本规则集(Clash 标准,加号通配符): 56 | 57 | YAML 规则集: 58 | 59 | Clash 传统规则集: 60 | 61 | Surge 传统规则集: 62 | 63 | sing-box 规则集: 64 | 65 | GeoSite 标签:`domestic` 66 | 67 | - 自动生成 68 | - 包含各大中国大陆网络服务提供商的域名。 69 | - 对于由 [CNNIC](https://www.cnnic.net.cn/) 管理的 TLD(如 `.cn`、`.中国`),无论其对应的服务是否在中国大陆境内运营,都将视为中国大陆服务。 70 | - 不包含跨国网络服务提供商对中国大陆提供服务的域名(如微软的 `o365cn.com`)。 71 | - 这是因为,如果将这些域名视为中国大陆服务,用户到服务商的流量就会出现两条不同的路径——部分经代理转发,部分直接到达服务器,这无论对于用户体验还是故障排除都不利;且一些服务商会因为 IP 地址变更而注销用户的会话,导致用户需要频繁地重新验证凭据以登录,甚至直接被封号。 72 | - 数据来源: 73 | - [本仓库](./source/) 74 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 75 | 76 | 77 | # 中国大陆 IP 地址块 78 | - 自动生成 79 | - 包含中国大陆所属 IP 地址块。 80 | - 对于某些内存或存储空间极其有限,难以载入完整的 GeoIP 库(通常重达 3~4MB)的设备,这两个规则集(共 100KB 左右)可能更适合。 81 | - 数据来源: 82 | - [misakaio / chnroutes2](https://github.com/misakaio/chnroutes2/) 83 | - [APNIC](https://ftp.apnic.net/stats/apnic/delegated-apnic-latest) 84 | 85 | GeoIP 标签:`cn` 86 | 87 | ## IPv4 88 | 纯文本规则集: 89 | 90 | YAML 规则集: 91 | 92 | Clash 传统规则集: 93 | 94 | Surge 传统规则集: 95 | 96 | sing-box 规则集: 97 | 98 | ## IPv6 99 | 纯文本规则集: 100 | 101 | YAML 规则集: 102 | 103 | Clash 传统规则集: 104 | 105 | Surge 传统规则集: 106 | 107 | sing-box 规则集: 108 | 109 | 110 | # 建议代理的域名 111 | 纯文本规则集: 112 | 113 | YAML 规则集: 114 | 115 | Clash 传统规则集: 116 | 117 | Surge 传统规则集: 118 | 119 | sing-box 规则集: 120 | 121 | GeoSite 标签:`proxy` 122 | 123 | - 手动维护 124 | - 这些域名通常在中国大陆遭到了广泛地 DNS 劫持,应当将到这些域名的请求直接转发至代理服务器,不在本地进行 DNS 解析。此外,还包括一些未受污染但因种种原因依然建议通过代理访问的域名(如一些服务器在境外却使用 `.cn` eTLD 的域名、以及一些会根据访客 IP 地址决定是否跳转中国大陆境内版本网站的域名) 125 | - 数据来源: 126 | - [GFWatch](https://gfwatch.org/) 127 | - [这个脚本](https://gist.github.com/xkww3n/0d9c8a393d94ed4ebabbb62dbe42da07) 读取 GFWatch 的原始数据,并从中筛选出 [Tranco](https://tranco-list.eu/) 排名 100000 之前的域名。由于 GFWatch 将原始数据保存在 Google Drive 上,下载起来很麻烦,且该列表内容相对固定,因此它不会由本项目的脚本自动更新。 128 | 129 | 130 | # 特定网站/服务 131 | 132 | ## Apple Music 133 | 纯文本规则集(Surge 标准,点号通配符): 134 | 135 | 纯文本规则集(Clash 标准,加号通配符): 136 | 137 | YAML 规则集: 138 | 139 | Clash 传统规则集: 140 | 141 | Surge 传统规则集: 142 | 143 | sing-box 规则集: 144 | 145 | GeoSite 标签:`apple-music` 146 | 147 | - 手动维护 148 | - 包含 Apple Music 和 iTunes Store 的服务域名。 149 | 150 | ## Apple 推送服务 151 | 纯文本规则集: 152 | 153 | YAML 规则集: 154 | 155 | Clash 传统规则集: 156 | 157 | Surge 传统规则集: 158 | 159 | sing-box 规则集: 160 | 161 | - 手动维护 162 | - 包含 Apple 推送服务(Apple Push Network Service, APNS)的 IPv4 和 IPv6 地址块 163 | 164 | ## Apple Intelligence(含 Private Cloud Compute) 165 | 纯文本规则集: 166 | 167 | YAML 规则集: 168 | 169 | Clash 传统规则集: 170 | 171 | Surge 传统规则集: 172 | 173 | sing-box 规则集: 174 | 175 | - 手动维护 176 | - 包含 Apple Intelligence 和 Private Cloud Compute 相关域名。 177 | 178 | ## WeChat 179 | Clash 传统规则集: 180 | 181 | Surge 传统规则集: 182 | 183 | sing-box 规则集: 184 | 185 | - 手动维护 186 | - 包含 WeChat 域名和 IP 地址块(**不含** 中国大陆微信服务) 187 | - 对于 Clash/Stash 等用户而言,这是一个 **“经典” (Classical)** 类型的规则 188 | 189 | ## 巴哈姆特 190 | 纯文本规则集(Surge 标准,点号通配符): 191 | 192 | 纯文本规则集(Clash 标准,加号通配符): 193 | 194 | YAML 规则集: 195 | 196 | Clash 传统规则集: 197 | 198 | Surge 传统规则集: 199 | 200 | sing-box 规则集: 201 | 202 | GeoSite 标签:`bahamut` 203 | 204 | - 自动生成 205 | - 包含巴哈姆特主站和巴哈姆特动画疯的服务域名。 206 | - 数据来源: 207 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 208 | 209 | ## 微软必应搜索 210 | 纯文本规则集(Surge 标准,点号通配符): 211 | 212 | 纯文本规则集(Clash 标准,加号通配符): 213 | 214 | YAML 规则集: 215 | 216 | Clash 传统规则集: 217 | 218 | Surge 传统规则集: 219 | 220 | sing-box 规则集: 221 | 222 | GeoSite 标签:`bing` 223 | 224 | - 自动生成 225 | - 包含微软必应搜索的服务域名。 226 | - 数据来源: 227 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 228 | 229 | ## 哔哩哔哩 230 | 纯文本规则集(Surge 标准,点号通配符): 231 | 232 | 纯文本规则集(Clash 标准,加号通配符): 233 | 234 | YAML 规则集: 235 | 236 | Clash 传统规则集: 237 | 238 | Surge 传统规则集: 239 | 240 | sing-box 规则集: 241 | 242 | GeoSite 标签:`bilibili` 243 | 244 | - 手动维护 245 | - 包含哔哩哔哩面向中国、东南亚和除此上述两者之外地区的服务域名。 246 | - 不含合作 CDN 域名(如与 Akamai 合作的 `upos-hz-mirrorakam.akamaized.net`) 247 | 248 | ## 思杰马克丁 249 | 纯文本规则集(Surge 标准,点号通配符): 250 | 251 | 纯文本规则集(Clash 标准,加号通配符): 252 | 253 | YAML 规则集: 254 | 255 | Clash 传统规则集: 256 | 257 | Surge 传统规则集: 258 | 259 | sing-box 规则集: 260 | 261 | GeoSite 标签:`cjmarketing` 262 | 263 | - 手动维护 264 | - 包含苏州思杰马克丁软件有限公司的公司官网、软件商城和其伪造的各个软件的“中国官网”用于进行**拦截**。 265 | - 请参阅:[《揭开软件行业毒瘤思杰马克丁的虚伪面纱》](https://bbs.kafan.cn/thread-2091351-1-1.html) 266 | 267 | ## DMM 268 | 纯文本规则集(Surge 标准,点号通配符): 269 | 270 | 纯文本规则集(Clash 标准,加号通配符): 271 | 272 | YAML 规则集: 273 | 274 | Clash 传统规则集: 275 | 276 | Surge 传统规则集: 277 | 278 | sing-box 规则集: 279 | 280 | GeoSite 标签:`dmm` 281 | 282 | - 自动生成 283 | - 包含 DMM 主站和 R18 站点(Fanza)的服务域名。 284 | - 数据来源: 285 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 286 | 287 | ## Google FCM 288 | 纯文本规则集(Surge 标准,点号通配符): 289 | 290 | 纯文本规则集(Clash 标准,加号通配符): 291 | 292 | YAML 规则集: 293 | 294 | Clash 传统规则集: 295 | 296 | Surge 传统规则集: 297 | 298 | sing-box 规则集: 299 | 300 | GeoSite 标签:`googlefcm` 301 | 302 | - 自动生成 303 | - 包含 Firebase Cloud Messaging 的服务域名。 304 | - 数据来源: 305 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 306 | 307 | ## Google Deepmind 308 | 纯文本规则集(Surge 标准,点号通配符): 309 | 310 | 纯文本规则集(Clash 标准,加号通配符): 311 | 312 | YAML 规则集: 313 | 314 | Clash 传统规则集: 315 | 316 | Surge 传统规则集: 317 | 318 | sing-box 规则集: 319 | 320 | GeoSite 标签:`google-deepmind` 321 | 322 | - 自动生成 323 | - 包含 Google Deepmind (Gemini 等) 的服务域名。 324 | - 数据来源: 325 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 326 | 327 | ## Microsoft 328 | 纯文本规则集(Surge 标准,点号通配符): 329 | 330 | 纯文本规则集(Clash 标准,加号通配符): 331 | 332 | YAML 规则集: 333 | 334 | Clash 传统规则集: 335 | 336 | Surge 传统规则集: 337 | 338 | sing-box 规则集: 339 | 340 | GeoSite 标签:`microsoft` 341 | 342 | - 自动生成 343 | - 包含微软旗下网络服务的域名。 344 | - 不含 GitHub 的服务域名,因为该服务在中国大陆的连通性与微软的其他服务可能不同。 345 | - 不含必应搜索的服务域名,因为该服务有针对中国大陆的特殊版本。 346 | - 数据来源: 347 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 348 | 349 | ## niconico 动画 350 | 纯文本规则集(Surge 标准,点号通配符): 351 | 352 | 纯文本规则集(Clash 标准,加号通配符): 353 | 354 | YAML 规则集: 355 | 356 | Clash 传统规则集: 357 | 358 | Surge 传统规则集: 359 | 360 | sing-box 规则集: 361 | 362 | GeoSite 标签:`niconico` 363 | 364 | - 自动生成 365 | - 包含 niconico 动画的服务域名。 366 | - 数据来源: 367 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 368 | 369 | ## OpenAI (ChatGPT) 370 | 纯文本规则集(Surge 标准,点号通配符): 371 | 372 | 纯文本规则集(Clash 标准,加号通配符): 373 | 374 | YAML 规则集: 375 | 376 | Clash 传统规则集: 377 | 378 | Surge 传统规则集: 379 | 380 | sing-box 规则集: 381 | 382 | GeoSite 标签:`openai` 383 | 384 | - 自动生成 385 | - 包含 OpenAI 的服务域名。 386 | - 数据来源: 387 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 388 | 389 | ## PayPal 390 | 纯文本规则集(Surge 标准,点号通配符): 391 | 392 | 纯文本规则集(Clash 标准,加号通配符): 393 | 394 | YAML 规则集: 395 | 396 | Clash 传统规则集: 397 | 398 | Surge 传统规则集: 399 | 400 | sing-box 规则集: 401 | 402 | GeoSite 标签:`paypal` 403 | 404 | - 自动生成 405 | - 包含 PayPal 的服务域名。 406 | - 数据来源: 407 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 408 | 409 | ## 测速服务器 410 | 纯文本规则集(Surge 标准,点号通配符): 411 | 412 | 纯文本规则集(Clash 标准,加号通配符): 413 | 414 | YAML 规则集: 415 | 416 | Clash 传统规则集: 417 | 418 | Surge 传统规则集: 419 | 420 | sing-box 规则集: 421 | 422 | GeoSite 标签:`speedtest` 423 | 424 | - 自动生成 425 | - 从 Speedtest.net API 接口爬取部分常用区域的测速服务器,以及 Cloudflare Speed Test 426 | - 爬取地区:中国(两岸四地)、美国、英国、日本、新加坡、土耳其 427 | - **这个列表不包含所有的 Speedtest.net 测速服务器,即使使用此规则,依然可能出现意料之外的分流情况** 428 | 429 | ## Steam 430 | 纯文本规则集(Surge 标准,点号通配符): 431 | 432 | 纯文本规则集(Clash 标准,加号通配符): 433 | 434 | YAML 规则集: 435 | 436 | Clash 传统规则集: 437 | 438 | Surge 传统规则集: 439 | 440 | sing-box 规则集: 441 | 442 | GeoSite 标签:`steam` 443 | 444 | - 手动维护 445 | - 包含 Steam(**非**中国大陆的蒸汽平台)的网络服务 446 | - **不**含资源 CDN 447 | 448 | ## Telegram 449 | 纯文本规则集: 450 | 451 | YAML 规则集: 452 | 453 | Clash 传统规则集: 454 | 455 | Surge 传统规则集: 456 | 457 | sing-box 规则集: 458 | 459 | - 自动生成 460 | - 包含 Telegram 的服务 IP。 461 | - 数据来源: 462 | - [Telegram](https://core.telegram.org/resources/cidr.txt) 463 | 464 | ## YouTube 465 | 纯文本规则集(Surge 标准,点号通配符): 466 | 467 | 纯文本规则集(Clash 标准,加号通配符): 468 | 469 | YAML 规则集: 470 | 471 | Clash 传统规则集: 472 | 473 | Surge 传统规则集: 474 | 475 | sing-box 规则集: 476 | 477 | GeoSite 标签:`youtube` 478 | 479 | - 自动生成 480 | - 包含 YouTube 的服务域名。 481 | - 数据来源: 482 | - [v2fly / domain-list-community](https://github.com/v2fly/domain-list-community/) 483 | 484 | ## 游戏 485 | - 手动维护 486 | - 提供以下游戏的分流规则(**不含**资源 CDN): 487 | - [碧蓝航线(英文版)](https://azurlane.yo-star.com/) 488 | - 纯文本规则集(Surge 标准,点号通配符): 489 | 纯文本规则集(Clash 标准,加号通配符): 490 | YAML 规则集: 491 | Clash 传统规则集: 492 | Surge 传统规则集: 493 | sing-box 规则集: 494 | GeoSite 标签:`azurlane-en` 495 | - [BanG Dream!少女乐团派对!(日文版)](https://bang-dream.bushimo.jp/) 496 | - 纯文本规则集(Surge 标准,点号通配符): 497 | 纯文本规则集(Clash 标准,加号通配符): 498 | YAML 规则集: 499 | Clash 传统规则集: 500 | Surge 传统规则集: 501 | sing-box 规则集: 502 | GeoSite 标签:`bangdream-jp` 503 | - [绯染天空](https://heaven-burns-red.com/) 504 | - 纯文本规则集(Surge 标准,点号通配符): 505 | 纯文本规则集(Clash 标准,加号通配符): 506 | YAML 规则集: 507 | Clash 传统规则集: 508 | Surge 传统规则集: 509 | sing-box 规则集: 510 | GeoSite 标签:`havenburnsred` 511 | 512 | 513 | # 保留 IP 地址块 514 | 纯文本规则集: 515 | 516 | YAML 规则集: 517 | 518 | Clash 传统规则集: 519 | 520 | Surge 传统规则集: 521 | 522 | sing-box 规则集: 523 | 524 | GeoIP 标签:`private` 525 | 526 | - 手动维护 527 | - 包含保留用于特殊用途的 IP 地址块,这些地址块内的 IP 地址通常不应该被代理 528 | -------------------------------------------------------------------------------- /.github/wiki/配置示例.md: -------------------------------------------------------------------------------- 1 | 以下配置仅供参考,你可能需要自行选择需要引用的规则集,并将其与你自己的代理策略匹配。 2 | 3 | # Clash 4 | 致 Stash 用户:Stash 的规则集配置格式和 Clash **不同**,请继续向下阅读以查看 Stash 规则集的配置方法。 5 | 6 | 适用于 Clash Meta (Mihomo) 或 Clash Premium **2023.04.13** 及更新的版本: 7 | 8 | ```yaml 9 | rules: 10 | - RULE-SET,CJMarketing,REJECT 11 | - RULE-SET,Exclude,Final 12 | - RULE-SET,Reject,REJECT 13 | - RULE-SET,WeChat,Proxy 14 | - RULE-SET,CN,DIRECT 15 | - RULE-SET,Microsoft,Proxy 16 | - RULE-SET,niconico,JP 17 | - RULE-SET,BanG Dream,Gaming 18 | 19 | rule-providers: 20 | CJMarketing: 21 | type: http 22 | behavior: domain 23 | format: text 24 | url: https://rules.xkww3n.cyou/text-plus/cjmarketing.txt 25 | path: ./rules/cjmarketing.txt 26 | interval: 86400 27 | Exclude: 28 | type: http 29 | behavior: domain 30 | format: text 31 | url: https://rules.xkww3n.cyou/text-plus/exclude.txt 32 | path: ./rules/exclude.txt 33 | interval: 86400 34 | Reject: 35 | type: http 36 | behavior: domain 37 | format: text 38 | url: https://rules.xkww3n.cyou/text-plus/reject.txt 39 | path: ./rules/reject.txt 40 | interval: 86400 41 | WeChat: 42 | type: http 43 | behavior: classical 44 | url: https://rules.xkww3n.cyou/yaml/wechat.yaml 45 | path: ./rules/wechat.txt 46 | interval: 86400 47 | CN: 48 | type: http 49 | behavior: domain 50 | format: text 51 | url: https://rules.xkww3n.cyou/text-plus/domestic.txt 52 | path: ./rules/domestic.txt 53 | interval: 86400 54 | Microsoft: 55 | type: http 56 | behavior: domain 57 | format: text 58 | url: https://rules.xkww3n.cyou/text-plus/microsoft.txt 59 | path: ./rules/microsoft.txt 60 | interval: 86400 61 | niconico: 62 | type: http 63 | behavior: domain 64 | format: text 65 | url: https://rules.xkww3n.cyou/text-plus/niconico.txt 66 | path: ./rules/niconico.txt 67 | interval: 86400 68 | BanG_Dream: 69 | type: http 70 | behavior: domain 71 | format: text 72 | url: https://rules.xkww3n.cyou/text-plus/bangdream-jp.txt 73 | path: ./rules/bangdream-jp.txt 74 | interval: 86400 75 | ``` 76 | 77 | 适用于 Clash Premium **2023.04.13 以前**的版本: 78 | 79 | ```yaml 80 | rules: 81 | - RULE-SET,CJMarketing,REJECT 82 | - RULE-SET,Exclude,Final 83 | - RULE-SET,Reject,REJECT 84 | - RULE-SET,WeChat,Proxy 85 | - RULE-SET,CN,DIRECT 86 | - RULE-SET,Microsoft,Proxy 87 | - RULE-SET,niconico,JP 88 | - RULE-SET,BanG Dream,Gaming 89 | 90 | rule-providers: 91 | CJMarketing: 92 | type: http 93 | behavior: domain 94 | url: https://rules.xkww3n.cyou/yaml/cjmarketing.yaml 95 | path: ./rules/cjmarketing.yaml 96 | interval: 86400 97 | Exclude: 98 | type: http 99 | behavior: domain 100 | url: https://rules.xkww3n.cyou/yaml/exclude.yaml 101 | path: ./rules/exclude.yaml 102 | interval: 86400 103 | Reject: 104 | type: http 105 | behavior: domain 106 | url: https://rules.xkww3n.cyou/yaml/reject.yaml 107 | path: ./rules/reject.yaml 108 | interval: 86400 109 | WeChat: 110 | type: http 111 | behavior: classical 112 | url: https://rules.xkww3n.cyou/yaml/wechat.yaml 113 | path: ./rules/wechat.yaml 114 | interval: 86400 115 | CN: 116 | type: http 117 | behavior: domain 118 | url: https://rules.xkww3n.cyou/yaml/domestic.yaml 119 | path: ./rules/domestic.yaml 120 | interval: 86400 121 | Microsoft: 122 | type: http 123 | behavior: domain 124 | url: https://rules.xkww3n.cyou/yaml/microsoft.yaml 125 | path: ./rules/microsoft.yaml 126 | interval: 86400 127 | niconico: 128 | type: http 129 | behavior: domain 130 | url: https://rules.xkww3n.cyou/yaml/niconico.yaml 131 | path: ./rules/niconico.yaml 132 | interval: 86400 133 | BanG Dream: 134 | type: http 135 | behavior: domain 136 | url: https://rules.xkww3n.cyou/yaml/bangdream-jp.yaml 137 | path: ./rules/bangdream-jp.yaml 138 | interval: 86400 139 | ``` 140 | 141 | # Stash 142 | ```yaml 143 | rules: 144 | - RULE-SET,CJMarketing,REJECT 145 | - RULE-SET,Exclude,Final 146 | - RULE-SET,Reject,REJECT 147 | - RULE-SET,WeChat,Proxy 148 | - RULE-SET,CN,DIRECT 149 | - RULE-SET,Microsoft,Proxy 150 | - RULE-SET,niconico,JP 151 | - RULE-SET,BanG Dream,Gaming 152 | 153 | rule-providers: 154 | CJMarketing: 155 | type: http 156 | behavior: domain-text 157 | url: https://rules.xkww3n.cyou/text/cjmarketing.txt 158 | path: ./rules/cjmarketing.txt 159 | interval: 86400 160 | Exclude: 161 | type: http 162 | behavior: domain-text 163 | url: https://rules.xkww3n.cyou/text/exclude.txt 164 | path: ./rules/exclude.txt 165 | interval: 86400 166 | Reject: 167 | type: http 168 | behavior: domain-text 169 | url: https://rules.xkww3n.cyou/text/reject.txt 170 | path: ./rules/reject.txt 171 | interval: 86400 172 | WeChat: 173 | type: http 174 | behavior: classical 175 | url: https://rules.xkww3n.cyou/yaml/wechat.yaml 176 | path: ./rules/wechat.yaml 177 | interval: 86400 178 | CN: 179 | type: http 180 | behavior: domain-text 181 | url: https://rules.xkww3n.cyou/text/domestic.txt 182 | path: ./rules/domestic.txt 183 | interval: 86400 184 | Microsoft: 185 | type: http 186 | behavior: domain-text 187 | url: https://rules.xkww3n.cyou/text/microsoft.txt 188 | path: ./rules/microsoft.txt 189 | interval: 86400 190 | niconico: 191 | type: http 192 | behavior: domain-text 193 | url: https://rules.xkww3n.cyou/text/niconico.txt 194 | path: ./rules/niconico.txt 195 | interval: 86400 196 | BanG_Dream: 197 | type: http 198 | behavior: domain-text 199 | url: https://rules.xkww3n.cyou/text/bangdream-jp.txt 200 | path: ./rules/bangdream-jp.txt 201 | interval: 86400 202 | ``` 203 | 204 | # Surge 3+ / Shadowrocket 205 | ``` 206 | [Rule] 207 | DOMAIN-SET,https://rules.xkww3n.cyou/text/cjmarketing.txt,REJECT 208 | DOMAIN-SET,https://rules.xkww3n.cyou/text/exclude.txt,Final 209 | DOMAIN-SET,https://rules.xkww3n.cyou/text/reject.txt,REJECT 210 | RULE-SET,https://rules.xkww3n.cyou/surge-compatible/wechat.txt,proxy 211 | DOMAIN-SET,https://rules.xkww3n.cyou/text/domestic.txt,DIRECT 212 | DOMAIN-SET,https://rules.xkww3n.cyou/text/microsoft.txt,Proxy 213 | DOMAIN-SET,https://rules.xkww3n.cyou/text/niconico.txt,JP 214 | DOMAIN-SET,https://rules.xkww3n.cyou/text/bangdream-jp.txt,Gaming 215 | ``` 216 | 217 | # Quantumult X 218 | 该软件需要使用 Clash 传统规则集。 219 | 220 | **每个策略组都必须指定 `force-policy` 字段!** 221 | 222 | ``` 223 | [filter_remote] 224 | https://rules.xkww3n.cyou/clash-compatible/cjmarketing.txt,tag=CJMarketing,force-policy=Reject,enabled=true 225 | https://rules.xkww3n.cyou/clash-compatible/exclude.txt,tag=Exclude,force-policy=Final,enabled=true 226 | https://rules.xkww3n.cyou/clash-compatible/reject.txt,tag=Reject,force-policy=Reject,enabled=true 227 | https://rules.xkww3n.cyou/clash-compatible/wechat.txt,tag=WeChat,force-policy=Proxy,enabled=true 228 | https://rules.xkww3n.cyou/clash-compatible/domestic.txt,tag=CN,force-policy=Direct,enabled=true 229 | https://rules.xkww3n.cyou/clash-compatible/microsoft.txt,tag=Microsoft,force-policy=Proxy,enabled=true 230 | https://rules.xkww3n.cyou/clash-compatible/niconico.txt,tag=niconico,force-policy=JP,enabled=true 231 | https://rules.xkww3n.cyou/clash-compatible/bangdream-jp.txt,tag=BanG Dream,force-policy=Gaming,enabled=true 232 | ``` 233 | 234 | # Loon 235 | 该软件需要使用 Surge 传统规则集。 236 | 237 | ``` 238 | [Remote Rule] 239 | https://rules.xkww3n.cyou/surge-compatible/cjmarketing.txt,policy=REJECT,tag=CJMarketing,enabled=true 240 | https://rules.xkww3n.cyou/surge-compatible/exclude.txt,policy=Final,tag=Exclude,enabled=true 241 | https://rules.xkww3n.cyou/surge-compatible/reject.txt,policy=REJECT,tag=Reject,enabled=true 242 | https://rules.xkww3n.cyou/surge-compatible/wechat.txt,policy=Proxy,tag=WeChat,enabled=true 243 | https://rules.xkww3n.cyou/surge-compatible/domestic.txt,policy=DIRECT,tag=CN,enabled=true 244 | https://rules.xkww3n.cyou/surge-compatible/microsoft.txt,policy=Proxy,tag=Microsoft,enabled=true 245 | https://rules.xkww3n.cyou/surge-compatible/niconico.txt,policy=JP,tag=niconico,enabled=true 246 | https://rules.xkww3n.cyou/surge-compatible/bangdream-jp.txt,policy=Gaming,tag=BanG Dream,enabled=true 247 | ``` 248 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | push: 4 | branches: 5 | - main 6 | paths-ignore: 7 | - '**.md' 8 | schedule: 9 | - cron: '0 12 * * *' 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | 18 | - name: Install PDM 19 | uses: pdm-project/setup-pdm@v4 20 | with: 21 | python-version: '3.11' 22 | cache: 'true' 23 | 24 | - name: Install dependencies 25 | run: pdm install 26 | 27 | - name: Run tests 28 | run: pdm run test 29 | 30 | build: 31 | runs-on: ubuntu-latest 32 | needs: test 33 | steps: 34 | - name: Checkout 35 | uses: actions/checkout@v4 36 | 37 | - name: Install PDM 38 | uses: pdm-project/setup-pdm@v4 39 | with: 40 | python-version: '3.11' 41 | cache: 'true' 42 | 43 | - name: Set up Go 44 | uses: actions/setup-go@v5 45 | 46 | - name: Pull v2fly community domain list 47 | uses: actions/checkout@v4 48 | with: 49 | repository: 'v2fly/domain-list-community' 50 | path: 'domain-list-community' 51 | 52 | - name: Pull Loyalsoldier's geosite tool 53 | uses: actions/checkout@v4 54 | with: 55 | repository: 'Loyalsoldier/domain-list-custom' 56 | path: 'tool_geosite' 57 | 58 | - name: Install Loyalsoldier's geoip tool 59 | run: go install github.com/Loyalsoldier/geoip@latest 60 | 61 | - name: Build rulesets 62 | run: | 63 | pdm run build 64 | cp source/personal/*.js dists/personal/ 65 | 66 | - name: Download MaxMind GeoLite2 Country DB 67 | env: 68 | MAXMIND_KEY: ${{ secrets.MAXMIND_KEY }} 69 | run: | 70 | wget -O ./GeoLite2-Country.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=${MAXMIND_KEY}&suffix=tar.gz" 71 | tar xzvf ./GeoLite2-Country.tar.gz 72 | cp ./GeoLite2-Country_*/GeoLite2-Country.mmdb ./ 73 | 74 | - name: Build Geosite DB 75 | run: | 76 | cd tool_geosite 77 | go run ./ --datapath=../dists/geosite --outputpath=../dists --exportlists="" --togfwlist="" 78 | 79 | - name: Build GeoIP DB 80 | run: | 81 | cat < config.json 82 | { 83 | "input": [ 84 | { 85 | "type": "private", 86 | "action": "add" 87 | }, 88 | { 89 | "type": "maxmindMMDB", 90 | "action": "add", 91 | "args": { 92 | "uri": "./GeoLite2-Country.mmdb" 93 | } 94 | }, 95 | { 96 | "type": "cutter", 97 | "action": "remove", 98 | "args": { 99 | "wantedList": ["cn"] 100 | } 101 | }, 102 | { 103 | "type": "text", 104 | "action": "add", 105 | "args": { 106 | "name": "cn", 107 | "uri": "./dists/text/domestic_ip.txt", 108 | "onlyIPType": "ipv4" 109 | } 110 | }, 111 | { 112 | "type": "text", 113 | "action": "add", 114 | "args": { 115 | "name": "cn", 116 | "uri": "./dists/text/domestic_ip6.txt", 117 | "onlyIPType": "ipv6" 118 | } 119 | } 120 | ], 121 | "output": [ 122 | { 123 | "type": "v2rayGeoIPDat", 124 | "action": "output", 125 | "args": { 126 | "outputName": "geoip.dat", 127 | "outputDir": "./dists" 128 | } 129 | }, 130 | { 131 | "type": "maxmindMMDB", 132 | "action": "output", 133 | "args": { 134 | "outputName": "geoip.mmdb", 135 | "outputDir": "./dists", 136 | "overwriteList": [ 137 | "cn", 138 | "private" 139 | ] 140 | } 141 | } 142 | ] 143 | } 144 | EOF 145 | 146 | geoip convert -c config.json 147 | 148 | - name: Remove tmp files 149 | run: | 150 | rm -rf dists/geosite 151 | rm dists/gfwlist.txt 152 | 153 | - name: Build homepage 154 | run: | 155 | python build_homepage.py 156 | 157 | cat < dists/_headers 158 | /* 159 | X-Robots-Tag: noindex 160 | / 161 | ! X-Robots-Tag 162 | EOF 163 | 164 | cat < dists/404.html 165 | 166 | 167 | 168 | 169 | 404 - xkww3n's Rules 170 | 171 | 172 | 173 | 174 |
175 |

xkww3n's Rules

176 |

xkww3n 维护的,面向多个代理软件的规则集

177 |

支持: Surge、Clash (Premium / Meta)、Stash、Choc、Quantumult (X)、Loon、Shadowrocket、LanceX 等

178 |

179 | 项目源代码托管于 GitHub, 180 | 以 MIT 协议授权 181 |

182 |
183 |

资源不存在

184 |
185 | 186 | 187 | EOF 188 | 189 | - name: Publish to Cloudflare Pages 190 | uses: cloudflare/wrangler-action@v3 191 | with: 192 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 193 | accountId: 2e54d1245681bc04eaa33ed5d68bdfa7 194 | command: pages deploy dists --project-name=xkww3n-rules 195 | -------------------------------------------------------------------------------- /.github/workflows/wiki.yml: -------------------------------------------------------------------------------- 1 | name: Publish wiki 2 | on: 3 | push: 4 | branches: [main] 5 | paths: [.github/wiki/**, .github/workflows/wiki.yml] 6 | concurrency: 7 | group: wiki 8 | cancel-in-progress: true 9 | permissions: 10 | contents: write 11 | jobs: 12 | wiki: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: Andrew-Chen-Wang/github-wiki-action@v4 17 | with: 18 | path: .github/wiki 19 | strategy: init 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | domain-list-community/ 2 | dists/ 3 | __pycache__/ 4 | .pytest_cache/ 5 | .vscode/ 6 | .idea/ 7 | .venv/ 8 | scripts/ 9 | .pdm-python 10 | *.log 11 | *.prof 12 | callgrind.* 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 xkww3n 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rules 2 | 3 | [![Generate](https://github.com/xkww3n/Rules/actions/workflows/main.yml/badge.svg)](https://github.com/xkww3n/Rules/actions/workflows/main.yml) 4 | 5 | 由 xkww3n 维护的,面向多个代理软件的规则集;注重自动更新、精细化分流及最小化规则体积。每日正午 12:00(UTC)自动更新。 6 | 7 | 本仓库提供以下格式的规则集: 8 | 9 | - 纯文本规则集(Surge 标准,点号通配符) 10 | - 适用于 [Surge](https://nssurge.com/)(v3 11 | 及更新的版本)、[Stash](https://stash.ws/)、[Surfboard](https://getsurfboard.com) 12 | 和 [Egern](https://apps.apple.com/us/app/egern/id1616105820)。 13 | - 纯文本规则集(Clash 标准,加号通配符) 14 | - 适用于 Clash Premium(2023.04.13 及更新的版本)和 Clash Meta(v1.14.4 及更新的版本)。 15 | - YAML 规则集 16 | - 适用于 Clash Premium、Clash Meta 和 [Stash](https://stash.ws/)。 17 | - Clash 传统规则集 18 | - 适用于兼容传统 Clash 规则的代理软件,如 [Quantumult](https://quantumult.app/) [(X)](https://quantumult.app/x/)。 19 | - Surge 传统规则集 20 | - 适用于兼容传统 Surge 规则的代理软件,如低于 v3 版本的 21 | Surge、[Loon](https://www.nsloon.com/)、[Shadowrocket](https://apps.apple.com/us/app/shadowrocket/id932747118) 22 | 和 [LanceX](https://shadowboat.app/lancex/)。 23 | - V2Ray GeoSite/GeoIP 数据库 24 | - 适用于 [V2Ray](https://www.v2fly.org/)。 25 | - GeoSite 数据库: 26 | - GeoIP 数据库: 27 | - ~~sing-box GeoSite/GeoIP 数据库~~ 该类型已在 sing-box v1.8.0 28 | 中被弃用,请改用规则集。参阅: 29 | - sing-box 规则集 30 | - 适用于 [sing-box](https://sing-box.sagernet.org/)。 31 | - MaxMind MMDB 数据库 32 | - GeoIP 数据库: 33 | 34 | ## 文档 35 | 36 | 请查看[本项目的 GitHub Wiki](https://github.com/xkww3n/Rules/wiki) 37 | 38 | ## 许可证 39 | 40 | 如无特别声明,本项目的一切内容均使用 MIT 许可证授权。 41 | 42 | ## 致谢 43 | 44 | 本项目离不开其他优质开源项目的支持,请前往 [本项目的 GitHub Wiki](https://github.com/xkww3n/Rules/wiki/致谢) 查看致谢名单。 45 | -------------------------------------------------------------------------------- /build_homepage.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | import config 4 | 5 | 6 | def template(urls: list) -> str: 7 | url_list = f'
  • {urls[0]}
  • \n' 8 | for url in urls[1:-2]: 9 | url_list += f'
  • {url}
  • \n' 10 | url_list += f'
  • {urls[-1]}
  • ' 11 | build_date = str(datetime.utcnow()) + " UTC" 12 | return \ 13 | f"""\ 14 | 15 | 16 | 17 | 18 | xkww3n's Rules 19 | 20 | 21 | 22 | 23 |
    24 |

    xkww3n's Rules

    25 |

    xkww3n 维护的,面向多个代理软件的规则集

    26 |

    支持: Surge、Clash (Premium / Meta)、Stash、Choc、Quantumult (X)、Loon、Shadowrocket、LanceX 等

    27 |

    28 | 项目源代码托管于 GitHub, 29 | 以 MIT 协议授权 30 |

    31 |

    构建日期:{build_date}

    32 |
    33 |
      34 | {url_list} 35 |
    36 |
    37 | 38 | 39 | """ 40 | 41 | 42 | blacklist = ["personal", "index"] 43 | dists_list = [] 44 | for filename in sorted(config.PATH_DIST.rglob("*")): 45 | if filename.is_file() and not any(bl_name in str(filename) for bl_name in blacklist): 46 | if filename.parent.name == "dists": 47 | dists_list.append(f"{filename.name}") 48 | else: 49 | dists_list.append(f"{filename.parent.name}/{filename.name}") 50 | open(config.PATH_DIST/"index.html", mode='w', encoding="utf-8").write(template(dists_list)) 51 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | TARGETS = ["text", "text-plus", "yaml", "surge-compatible", "clash-compatible", "geosite", "sing-ruleset"] 4 | PATH_SOURCE_GEOSITE = Path("domain-list-community/data/") 5 | PATH_SOURCE_CUSTOM = Path("source/") 6 | PATH_SOURCE_PATCH = Path("source/patches/") 7 | PATH_DIST = Path("dists/") 8 | 9 | LIST_REJECT_URL = [ 10 | # AdGuard Base Filter 11 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/BaseFilter/sections/adservers.txt", 12 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/BaseFilter/sections/adservers_firstparty.txt", 13 | # AdGuard Mobile Filter 14 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/MobileFilter/sections/adservers.txt", 15 | # AdGuard Japanese 16 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/JapaneseFilter/sections/adservers.txt", 17 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/JapaneseFilter/sections/adservers_firstparty.txt", 18 | # AdGuard Tracking Protection Filter 19 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/SpywareFilter/sections/tracking_servers_firstparty.txt", 20 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/SpywareFilter/sections/mobile.txt", 21 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/SpywareFilter/sections/tracking_servers.txt", 22 | # AdGuard DNS Additional Filter 23 | "https://raw.githubusercontent.com/AdguardTeam/AdGuardSDNSFilter/master/Filters/rules.txt", 24 | # EasyList China 25 | "https://easylist-downloads.adblockplus.org/easylistchina.txt", 26 | # EasyList third-party 27 | "https://raw.githubusercontent.com/easylist/easylist/master/easylist/easylist_thirdparty.txt", 28 | # EasyList adult third-party 29 | "https://raw.githubusercontent.com/easylist/easylist/master/easylist_adult/adult_thirdparty.txt", 30 | # AWAvenue 秋风广告规则 31 | "https://raw.githubusercontent.com/TG-Twilight/AWAvenue-Ads-Rule/main/AWAvenue-Ads-Rule.txt", 32 | # NoCoin 33 | "https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/nocoin.txt", 34 | ] 35 | 36 | # AdGuard DNS Filter Whitelist 37 | LIST_EXCL_URL = [ 38 | "https://raw.githubusercontent.com/AdguardTeam/AdGuardSDNSFilter/master/Filters/exceptions.txt", 39 | "https://raw.githubusercontent.com/AdguardTeam/AdGuardSDNSFilter/master/Filters/exclusions.txt", 40 | "https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/BaseFilter/sections/allowlist.txt" 41 | ] 42 | 43 | URL_DOMESTIC_IP_V4 = "https://raw.githubusercontent.com/gaoyifan/china-operator-ip/ip-lists/china.txt" 44 | URL_DOMESTIC_IP_V6 = "https://raw.githubusercontent.com/gaoyifan/china-operator-ip/ip-lists/china6.txt" 45 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/Loyalsoldier/domain-list-custom v0.0.0-20240313133505-c080456b3376 h1:b8vH9zHixftAyoHX2veFnIc6BBHuDDk9CIcsIqgJass= 2 | github.com/Loyalsoldier/domain-list-custom v0.0.0-20240313133505-c080456b3376/go.mod h1:3LczWo3VriGPJJKQam50vfB607GgLKFPxqSxwtcFY/I= 3 | github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= 4 | github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= 5 | github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 6 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 7 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 8 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 9 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 10 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 11 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 12 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 13 | github.com/maxmind/mmdbwriter v1.0.1-0.20240104163656-053d70fc8796 h1:yQp7pbPT+ieAOEYUYTTgZS/+bcUSJ4ATYPV+ZAouA2Q= 14 | github.com/maxmind/mmdbwriter v1.0.1-0.20240104163656-053d70fc8796/go.mod h1:6F/4tSDsJ8Y9UFVnehdZEIS220Uz62E7lbo8ZS0DehI= 15 | github.com/metacubex/geo v0.0.0-20240223110454-d76155814f3a h1:sYfnPlUkF/dSMU8CTKbUoIfouXkq/4BKD18CXuJFeto= 16 | github.com/metacubex/geo v0.0.0-20240223110454-d76155814f3a/go.mod h1:Q1pXsSLLP4oTbabrJ74IUrVi54T6EvdiB2J8cJINBbs= 17 | github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs= 18 | github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY= 19 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 20 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 21 | github.com/sagernet/sing v0.3.0 h1:PIDVFZHnQAAYRL1UYqNM+0k5s8f/tb1lUW6UDcQiOc8= 22 | github.com/sagernet/sing v0.3.0/go.mod h1:9pfuAH6mZfgnz/YjP6xu5sxx882rfyjpcrTdUpd6w3g= 23 | github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= 24 | github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 25 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 26 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 27 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 28 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 29 | github.com/v2fly/v2ray-core/v5 v5.4.0 h1:MbsXS8DtjN2HDpmv37ZxuaRhEPshkwYBWPCgzmHKpBA= 30 | github.com/v2fly/v2ray-core/v5 v5.4.0/go.mod h1:VCQWeAX8WIYbptEK+ZnjtNYkFLxZyn6iJQ7jLgiJMu8= 31 | go4.org/netipx v0.0.0-20230824141953-6213f710f925 h1:eeQDDVKFkx0g4Hyy8pHgmZaK0EqB4SD6rvKbUdN3ziQ= 32 | go4.org/netipx v0.0.0-20230824141953-6213f710f925/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= 33 | golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= 34 | golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= 35 | golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 36 | golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= 37 | golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 38 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 39 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 40 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 41 | google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= 42 | google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 43 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 44 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 45 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 46 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 47 | -------------------------------------------------------------------------------- /logging.ini: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys = root 3 | 4 | [handlers] 5 | keys = consoleHandler 6 | 7 | [formatters] 8 | keys = Formatter 9 | 10 | [logger_root] 11 | level = INFO 12 | handlers = consoleHandler 13 | 14 | [handler_consoleHandler] 15 | class = StreamHandler 16 | formatter = Formatter 17 | args = (sys.stdout,) 18 | 19 | [formatter_Formatter] 20 | format = %(asctime)s [%(levelname)s] %(message)s -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import logging.config 2 | from importlib.util import spec_from_file_location, module_from_spec 3 | from os import environ 4 | from pathlib import Path 5 | 6 | logging.config.fileConfig("logging.ini") 7 | logger = logging.getLogger("root") 8 | 9 | if environ.get("DEBUG"): 10 | logger.setLevel("DEBUG") 11 | 12 | workers = Path("workers").rglob("*.py") 13 | for worker in workers: 14 | worker_name = worker.stem 15 | spec = spec_from_file_location(worker_name, Path("workers")/worker.name) 16 | if spec is None: 17 | logger.warning(f"Could not load spec for worker {worker_name}") 18 | continue 19 | module = module_from_spec(spec) 20 | if spec.loader is None: 21 | logger.warning(f"No loader found for worker {worker_name}") 22 | continue 23 | spec.loader.exec_module(module) 24 | module.build() 25 | -------------------------------------------------------------------------------- /models/rule.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | from ipaddress import ip_network, IPv4Network, IPv6Network 3 | 4 | from utils.rule import is_domain 5 | 6 | 7 | class RuleType(Enum): 8 | DomainSuffix = "DOMAIN-SUFFIX" 9 | DomainFull = "DOMAIN" 10 | IPCIDR = "IP-CIDR" 11 | IPCIDR6 = "IP-CIDR6" 12 | 13 | 14 | class Rule: 15 | type: RuleType 16 | tag: str 17 | _payload: str 18 | 19 | def __init__(self, rule_type: RuleType, payload: str = "", tag: str = ""): 20 | self.type = rule_type 21 | self.tag = tag 22 | self.payload = payload 23 | 24 | def __str__(self): 25 | return f'{self.type.name}: {self._payload}{f" ({self.tag})" if self.tag else ""}' 26 | 27 | def __hash__(self): 28 | return hash((self.type, self.tag, self._payload)) 29 | 30 | def __eq__(self, other): 31 | return self.type == other.type and self.tag == other.tag and self._payload == other.payload 32 | 33 | @property 34 | def payload(self) -> str: 35 | return self._payload 36 | 37 | @payload.setter 38 | def payload(self, payload: str): 39 | if self.type in {RuleType.DomainSuffix, RuleType.DomainFull}: 40 | if not is_domain(payload): 41 | raise ValueError(f"Invalid domain: {payload}") 42 | else: 43 | ip_type = ip_network(payload, strict=False) 44 | if self.type == RuleType.IPCIDR6 and isinstance(ip_type, IPv4Network): 45 | raise ValueError(f"IPv4 address stored in IPv6 type: {payload}") 46 | elif self.type == RuleType.IPCIDR and isinstance(ip_type, IPv6Network): 47 | raise ValueError(f"IPv6 address stored in IPv4 type: {payload}") 48 | self._payload = payload 49 | 50 | def includes(self, other): 51 | if self.type == RuleType.DomainSuffix: 52 | if self._payload == other.payload: 53 | return True 54 | return other.payload.endswith("." + self._payload) 55 | elif self.type == RuleType.DomainFull: 56 | return self == other 57 | -------------------------------------------------------------------------------- /models/ruleset.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from enum import Enum 3 | 4 | from models.rule import Rule, RuleType 5 | 6 | 7 | class RuleSetType(Enum): 8 | Domain = 1 9 | IPCIDR = 2 10 | Combined = 3 11 | 12 | 13 | class RuleSet: 14 | type: RuleSetType 15 | _payload: list[Rule] 16 | 17 | def __init__(self, ruleset_type: RuleSetType, payload: list): 18 | self.type = ruleset_type 19 | self._payload = payload 20 | 21 | def __hash__(self): 22 | return hash((self.type, tuple(self._payload))) 23 | 24 | def __eq__(self, other): 25 | return self.type == other.type and self._payload == other.payload 26 | 27 | def __len__(self): 28 | return len(self._payload) 29 | 30 | def __or__(self, other): 31 | payload_set = set(self._payload) 32 | new_rules = [rule for rule in other.payload if rule not in payload_set] 33 | self._payload.extend(new_rules) 34 | return self 35 | 36 | def __contains__(self, item): 37 | return item in self._payload 38 | 39 | def __iter__(self): 40 | return iter(self._payload) 41 | 42 | @property 43 | def payload(self) -> list: 44 | return self._payload 45 | 46 | @payload.setter 47 | def payload(self, payload: list): 48 | if self.type == RuleSetType.Domain: 49 | for item in payload: 50 | if item.type not in {RuleType.DomainSuffix, RuleType.DomainFull}: 51 | raise ValueError(f"{item.type.value} rule found in a domain-type ruleset.") 52 | elif self.type == RuleSetType.IPCIDR: 53 | for item in payload: 54 | if item.type not in {RuleType.IPCIDR, RuleType.IPCIDR6}: 55 | raise ValueError(f"{item.type.value} rule found in a IPCIDR-type ruleset.") 56 | self._payload = payload 57 | 58 | def deepcopy(self): 59 | payload_copied = [] 60 | payload_copied.extend( 61 | Rule(rule.type, rule.payload, rule.tag) 62 | for rule in self._payload 63 | ) 64 | ruleset_copied = RuleSet(self.type, payload_copied) 65 | return ruleset_copied 66 | 67 | def add(self, rule): 68 | if rule not in self._payload: 69 | self._payload.append(rule) 70 | 71 | def remove(self, rule): 72 | self._payload.remove(rule) 73 | 74 | def sort(self): 75 | if self.type == RuleSetType.Combined: 76 | logging.warning("Skipped: Combined-type ruleset shouldn't be sorted as maybe ordered.") 77 | return 78 | 79 | def sort_key(item: Rule) -> tuple: 80 | match item.type: 81 | # Domain suffixes should always in front of full domains 82 | # Shorter domains should in front of longer domains 83 | # For IPCIDR ruleset, default sort method is ok. 84 | case RuleType.DomainSuffix: 85 | sortkey = (0, len(item.payload), item.payload) 86 | case RuleType.DomainFull: 87 | sortkey = (1, len(item.payload), item.payload) 88 | case _: 89 | sortkey = (2, len(item.payload), item.payload) 90 | return sortkey 91 | 92 | self._payload.sort(key=sort_key) 93 | 94 | def dedup(self): 95 | self.sort() 96 | list_unique = [] 97 | for item in self._payload: 98 | flag_unique = True 99 | for added in list_unique: 100 | if added.includes(item): 101 | flag_unique = False 102 | logging.debug(f'Remove "{item}": included in "{added}".') 103 | if flag_unique: 104 | list_unique.append(item) 105 | self._payload = list_unique 106 | -------------------------------------------------------------------------------- /pdm.lock: -------------------------------------------------------------------------------- 1 | # This file is @generated by PDM. 2 | # It is not intended for manual editing. 3 | 4 | [metadata] 5 | groups = ["default"] 6 | strategy = ["inherit_metadata"] 7 | lock_version = "4.5.0" 8 | content_hash = "sha256:e3d10ff794c76e08aeb8e1404ec00cbf2b88fa2c81952986a399ced58b1926f5" 9 | 10 | [[metadata.targets]] 11 | requires_python = "==3.11.*" 12 | 13 | [[package]] 14 | name = "certifi" 15 | version = "2024.8.30" 16 | requires_python = ">=3.6" 17 | summary = "Python package for providing Mozilla's CA Bundle." 18 | groups = ["default"] 19 | files = [ 20 | {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, 21 | {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, 22 | ] 23 | 24 | [[package]] 25 | name = "charset-normalizer" 26 | version = "3.3.2" 27 | requires_python = ">=3.7.0" 28 | summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 29 | groups = ["default"] 30 | files = [ 31 | {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, 32 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, 33 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, 34 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, 35 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, 36 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, 37 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, 38 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, 39 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, 40 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, 41 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, 42 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, 43 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, 44 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, 45 | {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, 46 | {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, 47 | {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, 48 | ] 49 | 50 | [[package]] 51 | name = "colorama" 52 | version = "0.4.6" 53 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 54 | summary = "Cross-platform colored terminal text." 55 | groups = ["default"] 56 | marker = "sys_platform == \"win32\"" 57 | files = [ 58 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 59 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 60 | ] 61 | 62 | [[package]] 63 | name = "idna" 64 | version = "3.10" 65 | requires_python = ">=3.6" 66 | summary = "Internationalized Domain Names in Applications (IDNA)" 67 | groups = ["default"] 68 | files = [ 69 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 70 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 71 | ] 72 | 73 | [[package]] 74 | name = "iniconfig" 75 | version = "2.0.0" 76 | requires_python = ">=3.7" 77 | summary = "brain-dead simple config-ini parsing" 78 | groups = ["default"] 79 | files = [ 80 | {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, 81 | {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, 82 | ] 83 | 84 | [[package]] 85 | name = "packaging" 86 | version = "24.1" 87 | requires_python = ">=3.8" 88 | summary = "Core utilities for Python packages" 89 | groups = ["default"] 90 | files = [ 91 | {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, 92 | {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, 93 | ] 94 | 95 | [[package]] 96 | name = "pluggy" 97 | version = "1.5.0" 98 | requires_python = ">=3.8" 99 | summary = "plugin and hook calling mechanisms for python" 100 | groups = ["default"] 101 | files = [ 102 | {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, 103 | {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, 104 | ] 105 | 106 | [[package]] 107 | name = "pytest" 108 | version = "8.3.3" 109 | requires_python = ">=3.8" 110 | summary = "pytest: simple powerful testing with Python" 111 | groups = ["default"] 112 | dependencies = [ 113 | "colorama; sys_platform == \"win32\"", 114 | "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", 115 | "iniconfig", 116 | "packaging", 117 | "pluggy<2,>=1.5", 118 | "tomli>=1; python_version < \"3.11\"", 119 | ] 120 | files = [ 121 | {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, 122 | {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, 123 | ] 124 | 125 | [[package]] 126 | name = "python-abp" 127 | version = "0.2.0" 128 | summary = "A library for working with Adblock Plus filter lists." 129 | groups = ["default"] 130 | files = [ 131 | {file = "python-abp-0.2.0.tar.gz", hash = "sha256:f36d0e9fdc089587c26036e0403f36d729395fc9f4dbce45baf3a493d1de8112"}, 132 | ] 133 | 134 | [[package]] 135 | name = "requests" 136 | version = "2.32.3" 137 | requires_python = ">=3.8" 138 | summary = "Python HTTP for Humans." 139 | groups = ["default"] 140 | dependencies = [ 141 | "certifi>=2017.4.17", 142 | "charset-normalizer<4,>=2", 143 | "idna<4,>=2.5", 144 | "urllib3<3,>=1.21.1", 145 | ] 146 | files = [ 147 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, 148 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, 149 | ] 150 | 151 | [[package]] 152 | name = "urllib3" 153 | version = "2.2.3" 154 | requires_python = ">=3.8" 155 | summary = "HTTP library with thread-safe connection pooling, file post, and more." 156 | groups = ["default"] 157 | files = [ 158 | {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, 159 | {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, 160 | ] 161 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "Rules" 3 | version = "0.0.0" 4 | description = "" 5 | authors = [ 6 | {name = "xkww3n", email = "xkww3n@outlook.com"}, 7 | ] 8 | dependencies = [ 9 | "pytest~=8.1", 10 | "requests~=2.31", 11 | "python-abp~=0.2", 12 | ] 13 | requires-python = "==3.11.*" 14 | readme = "README.md" 15 | license = {text = "MIT"} 16 | 17 | 18 | [tool.pdm] 19 | distribution = false 20 | 21 | [tool.pdm.scripts] 22 | build = "python main.py" 23 | test = "pytest" 24 | debug.cmd = "python main.py" 25 | debug.env = {DEBUG = "1"} 26 | profile = "python -m cProfile -o performance.prof main.py" 27 | -------------------------------------------------------------------------------- /source/apns.txt: -------------------------------------------------------------------------------- 1 | #@IPCIDR 2 | 17.249.0.0/16 3 | 17.252.0.0/16 4 | 17.57.144.0/22 5 | 17.188.128.0/18 6 | 17.188.20.0/23 7 | 8 | 2620:149:a44::/48 9 | 2403:300:a42::/48 10 | 2403:300:a51::/48 11 | 2a01:b740:a42::/48 12 | -------------------------------------------------------------------------------- /source/apple-intelligence.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | apple-relay.cloudflare.com 3 | apple-relay.fastly-edge.com 4 | cp4.cloudflare.com 5 | apple-relay.apple.com 6 | -------------------------------------------------------------------------------- /source/apple-music.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .applemusic.com 3 | .music.apple.com 4 | aod-ssl.itunes.apple.com 5 | aod.itunes.apple.com 6 | audio-ssl.itunes.apple.com 7 | audio.itunes.apple.com 8 | blobstore.apple.com 9 | mvod.itunes.apple.com 10 | streamingaudio.itunes.apple.com 11 | -------------------------------------------------------------------------------- /source/azurlane-en.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | azurusapi.yo-star.com 3 | blhxusgate.yo-star.com 4 | -------------------------------------------------------------------------------- /source/bangdream-jp.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | api.star.craftegg.jp 3 | -------------------------------------------------------------------------------- /source/bilibili.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | # Bilibili 3 | .biliapi.com 4 | .biliapi.net 5 | .bilibili.com 6 | .biligame.com 7 | .biligame.net 8 | .bilivideo.com 9 | .hdslb.com 10 | 11 | # Bstar International 12 | .bilibili.tv 13 | .biliintl.com 14 | .bstarstatic.com 15 | -------------------------------------------------------------------------------- /source/cjmarketing.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .4009997658.com 3 | .6xigema.com 4 | .abbyychina.com 5 | .alienskins.cn 6 | .anydeskchina.cn 7 | .appscan.net.cn 8 | .bartender.cc 9 | .betterzip.net 10 | .betterzipcn.com 11 | .beyondcompare.cc 12 | .bingdianhuanyuan.cn 13 | .borisfx.com.cn 14 | .boom3dformac.cn 15 | .chemdraw.com.cn 16 | .cjmakeding.com 17 | .cjmkt.com 18 | .codesoftchina.com 19 | .coreldrawchina.com 20 | .crossoverchina.com 21 | .dongmansoft.com 22 | .earmasterchina.cn 23 | .easyrecoverychina.com 24 | .ediuschina.com 25 | .flstudiochina.com 26 | .folxchina.cn 27 | .formysql.com 28 | .goldwavechina.cn 29 | .guitarpro.cc 30 | .huishenghuiying.com.cn 31 | .hypeapp.cn 32 | .hypersnap.net 33 | .iconworkshop.cn 34 | .idapro.net.cn 35 | .idmchina.net 36 | .imazingchina.com 37 | .imindmap.cc 38 | .jihehuaban.com.cn 39 | .keyshot.cc 40 | .logoshejishi.com 41 | .luping.net.cn 42 | .mairuan.cn 43 | .mairuan.com 44 | .mairuan.com.cn 45 | .mairuan.net 46 | .mairuanwang.com 47 | .makeding.com 48 | .makedingtech.com 49 | .mathtype.cn 50 | .mindmanager.cc 51 | .mindmanager.cn 52 | .mindmapper.cc 53 | .mycleanmymac.com 54 | .nicelabel.cc 55 | .ntfsformac.cc 56 | .ntfsformac.cn 57 | .officesoftcn.com 58 | .overturechina.com 59 | .passwordrecovery.cn 60 | .pdfexpert.cc 61 | .pdffactorychina.cn 62 | .photozoomchina.com 63 | .prodad.cn 64 | portraiture.ps-chajian.com 65 | .rayfirechina.com 66 | .shankejingling.com 67 | .studioonechina.cn 68 | .toupin.net.cn 69 | .vegaschina.cn 70 | .vfxforce.net.cn 71 | .xitongqingli.com 72 | .yuanchengxiezuo.com 73 | .zbrushcn.com 74 | .zhzzx.com 75 | .xshellcn.com 76 | .bim4d.com.cn 77 | .soundforge.cn 78 | .tplizi.com 79 | .ultraeditcn.com 80 | .aida64cn.com 81 | -------------------------------------------------------------------------------- /source/heavenburnsred.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | api.heaven-burns-red.wfs.games 3 | -------------------------------------------------------------------------------- /source/patches/domestic.txt: -------------------------------------------------------------------------------- 1 | ADD:masuit.com 2 | ADD:anime1.me 3 | ADD:.push.apple.com 4 | 5 | REM:.wechat.com 6 | REM:.chinamobile.com 7 | -------------------------------------------------------------------------------- /source/patches/exclude.txt: -------------------------------------------------------------------------------- 1 | ADD:ad.doubleclick.net 2 | ADD:ssl.p.jwpcdn.com 3 | ADD:click.mz.simba.taobao.com 4 | ADD:www.cnzz.com 5 | ADD:help.cnzz.com 6 | ADD:open.cnzz.com 7 | ADD:new.cnzz.com 8 | -------------------------------------------------------------------------------- /source/patches/reject.txt: -------------------------------------------------------------------------------- 1 | REM:.jiguang.cn 2 | REM:.bugly.qq.com 3 | REM:.adsense.google.cn 4 | REM:staticsns.cdn.bcebos.com 5 | REM:.optimus-ads.amap.com 6 | REM:.dig.bdurl.net 7 | REM:.grpc.biliapi.net 8 | REM:a0.app.xiaomi.com 9 | REM:.getui.com 10 | REM:.shouji.sogou.com 11 | REM:.crashlytics.com 12 | REM:.crashlyticsreports-pa.googleapis.com 13 | REM:.polaris.zijieapi.com 14 | 15 | ADD:.mediav.com 16 | ADD:.partwithner.com 17 | ADD:.rxeosevsso.com 18 | ADD:.mc7clurd09pla4nrtat7ion.com 19 | ADD:.e67repidwnfu7gcha.com 20 | ADD:.wuzbhjpvsf.com 21 | ADD:iadmusicmat.music.126.net 22 | ADD:ios.bugly.qq.com 23 | ADD:android.bugly.qq.com 24 | ADD:.d.meituan.net 25 | ADD:.dreport.meituan.net 26 | ADD:sq.bls.mdt.qq.com 27 | ADD:api-access.pangolin-sdk-toutiao-b.com 28 | ADD:.yfanads.com 29 | ADD:api-v3.mentamob.com 30 | ADD:sdk.mentamob.com 31 | ADD:.ubixioe.com 32 | ADD:.ad.gameley.com 33 | ADD:ads-sdk-api.ranfenghd.com 34 | ADD:.adx.adwangmai.com 35 | ADD:.vlion.cn 36 | ADD:.1rtb.com 37 | ADD:.adintl.cn 38 | ADD:adx.tuia.cn 39 | ADD:.zhangyuyidong.cn 40 | ADD:msdk.voiceads.cn 41 | -------------------------------------------------------------------------------- /source/personal/bypass.js: -------------------------------------------------------------------------------- 1 | if ($network.wifi.ssid) { 2 | var match = ($persistentStore.read("bypass_wifi") === "true"); 3 | } 4 | else { 5 | var match = ($persistentStore.read("bypass_cellular") === "true"); 6 | } 7 | 8 | $done({matched: match}); 9 | -------------------------------------------------------------------------------- /source/personal/direct.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .steamserver.net 3 | .activation-v2.kaspersky.com 4 | edf.eset.com 5 | epns.eset.com 6 | iploc.eset.com 7 | pki.eset.com 8 | versioncheck.eset.com 9 | -------------------------------------------------------------------------------- /source/personal/dns.js: -------------------------------------------------------------------------------- 1 | if ( 2 | ($network.wifi.ssid && $persistentStore.read("bypass_wifi") === "true") || 3 | (!$network.wifi.ssid && $persistentStore.read("bypass_cellular") === "true") 4 | ) { 5 | $done({servers: [ 6 | "https://cloudflare-dns.com/dns-query", 7 | "quic://ultralow.dns.nextdns.io" 8 | ]}) 9 | } 10 | else { 11 | $done({servers: [ 12 | "quic://dns.alidns.com", 13 | "https://dns.alidns.com/dns-query", 14 | "https://doh.pub/dns-query" 15 | ]}) 16 | } 17 | -------------------------------------------------------------------------------- /source/personal/finance.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .bochk.com 3 | .ncb.com.hk 4 | .cncbinternational.com 5 | .hsbc.com.hk 6 | .hsbc.co.uk 7 | .icbcasia.com 8 | -------------------------------------------------------------------------------- /source/personal/set_bypass.js: -------------------------------------------------------------------------------- 1 | const GLOBAL_WIFI = [ 2 | "BOCHK-WiFi", 3 | "HSBC-Guest", 4 | "MTR-WIFI", 5 | "McDonald's" 6 | ]; 7 | 8 | var bypass_cellular = "true"; 9 | var bypass_wifi = "true"; 10 | 11 | try { 12 | if ($intent.parameter === "内地") { 13 | bypass_cellular = "false"; 14 | } 15 | else if ($intent.parameter === "f0rC3") { //force bypass regardless of network 16 | $persistentStore.write("true", "bypass_wifi"); 17 | } 18 | else { 19 | bypass_cellular = "true"; 20 | } 21 | $persistentStore.write(bypass_cellular, "bypass_cellular"); 22 | } 23 | catch (err) { // triggered by network-changed event, no `$intent` passed in 24 | if ($network.wifi.ssid) { 25 | if (GLOBAL_WIFI.includes($network.wifi.ssid)){ 26 | bypass_wifi = "true"; 27 | } 28 | else { 29 | bypass_wifi = "false"; 30 | } 31 | $persistentStore.write(bypass_wifi, "bypass_wifi"); 32 | } 33 | } 34 | finally { 35 | $done(); 36 | } 37 | -------------------------------------------------------------------------------- /source/proxy.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .000webhost.com 3 | .10minutemail.net 4 | .10tv.com 5 | .11alive.com 6 | .12news.com 7 | .1337x.to 8 | .13newsnow.com 9 | .13wmaz.com 10 | .141hongkong.com 11 | .141jav.com 12 | .18comic.org 13 | .18comic.vip 14 | .18p.fun 15 | .19fortyfive.com 16 | .1inch.io 17 | .1lib.sk 18 | .1point3acres.com 19 | .1pondo.com 20 | .28hse.com 21 | .2beeg.me 22 | .2miners.com 23 | .321sexchat.com 24 | .365488.com 25 | .3movs.com 26 | .4kpornvideos.tv 27 | .4shared.com 28 | .500px.com 29 | .51.ca 30 | .51cg1.com 31 | .51ms.life 32 | .520cc.cc 33 | .5278.cc 34 | .52av.one 35 | .52shuku.vip 36 | .55comic.com 37 | .5newsonline.com 38 | .69vj.com 39 | .6park.com 40 | .6parkbbs.com 41 | .6parknews.com 42 | .7mmtv.sx 43 | .82xnxx.com 44 | .85tube.com 45 | .881903.com 46 | .8muses.com 47 | .8muses.xxx 48 | .8world.com 49 | .91porn.com 50 | .91porny.com 51 | .99itv.net 52 | .9apps.com 53 | .9cache.com 54 | .9gag.com 55 | .9hentai.to 56 | .9news.com 57 | .9news.com.au 58 | .a3erf.com 59 | .aagmaal.com 60 | .aave.com 61 | .aax.com 62 | .abc.es 63 | .abc.net.au 64 | .abc10.com 65 | .abc17news.com 66 | .abebooks.co.uk 67 | .abebooks.com 68 | .abeka.com 69 | .aboluowang.com 70 | .about.me 71 | .abplive.com 72 | .abqjournal.com 73 | .acast.com 74 | .accelevents.com 75 | .acdtop.com 76 | .acg.rip 77 | .acgnx.se 78 | .actionnetwork.org 79 | .actionnewsjax.com 80 | .activatevpn.com 81 | .actualitte.com 82 | .addictpodcast.com 83 | .adultdeepfakes.com 84 | .adultdvdmarketplace.com 85 | .adultempire.com 86 | .adultism.com 87 | .adultsearch.com 88 | .adulttime.com 89 | .adventist.org 90 | .aei.org 91 | .afr.com 92 | .aftenposten.no 93 | .agniban.com 94 | .ahlmasr.net 95 | .aichatting.net 96 | .airav.cc 97 | .ajunews.com 98 | .akhbara24.news 99 | .akinator.com 100 | .aktual24.ro 101 | .albawaba.com 102 | .alchetron.com 103 | .aljazeera.com 104 | .allgaeuer-zeitung.de 105 | .allpoetry.com 106 | .allporncomic.com 107 | .allsides.com 108 | .alotporn.com 109 | .alphaporno.com 110 | .alt.com 111 | .alukah.net 112 | .am730.com.hk 113 | .amaporn.com 114 | .amateuralbum.net 115 | .amazon.co.jp 116 | .ameba.jp 117 | .americanmilitarynews.com 118 | .americanthinker.com 119 | .amgreatness.com 120 | .aminoapps.com 121 | .amnesty.org 122 | .amnesty.org.uk 123 | .amnestyusa.org 124 | .amurz.com 125 | .anacams.com 126 | .analdin.com 127 | .analvids.com 128 | .anchor.fm 129 | .androidadult.com 130 | .androidapksfree.com 131 | .angelfire.com 132 | .anghami.com 133 | .animeidhentai.com 134 | .aninews.in 135 | .anirena.com 136 | .annas-archive.org 137 | .anobii.com 138 | .anonfiles.com 139 | .anonymize.com 140 | .anonymizer.com 141 | .antpool.com 142 | .antronio.cl 143 | .anybunny.tv 144 | .anyporn.com 145 | .anysex.com 146 | .aop.com 147 | .aoxx69.net 148 | .apache-iv.com 149 | .apalon.com 150 | .apetube.com 151 | .apigee.com 152 | .apk.support 153 | .apk.tw 154 | .apkcombo.com 155 | .apkfab.com 156 | .apkgk.com 157 | .apkmirror.com 158 | .apkmonk.com 159 | .apkpure.com 160 | .apksum.com 161 | .app.com 162 | .appadvice.com 163 | .appbrain.com 164 | .appledaily.com 165 | .appledaily.com.tw 166 | .appspot.com 167 | .appsto.re 168 | .apptopia.com 169 | .aptoide.com 170 | .arabxn.com 171 | .archertube.com 172 | .archive-it.org 173 | .archive.fo 174 | .archive.is 175 | .archive.li 176 | .archive.md 177 | .archive.org 178 | .archive.ph 179 | .archive.vn 180 | .archiveofourown.org 181 | .archyde.com 182 | .ardmediathek.de 183 | .armstrong.edu 184 | .artbreeder.com 185 | .arte.tv 186 | .artguru.ai 187 | .article19.org 188 | .artstation.com 189 | .arweave.net 190 | .ascendex.com 191 | .asg.to 192 | .ashemaletube.com 193 | .asianage.com 194 | .asianews.it 195 | .asiannudestube.com 196 | .asiaone.com 197 | .asiasociety.org 198 | .asiatimes.com 199 | .ask.com 200 | .asmhentai.com 201 | .aspi.org.au 202 | .aspistrategist.org.au 203 | .assoass.com 204 | .atlanticcouncil.org 205 | .atlasvpn.com 206 | .atomicwallet.io 207 | .atube.sex 208 | .atube.xxx 209 | .audiobooks.com 210 | .audioboom.com 211 | .auntmia.com 212 | .aus.social 213 | .autobild.de 214 | .av01.tv 215 | .avaaz.org 216 | .avatrade.com 217 | .avbebe.com 218 | .avday.tv 219 | .avg.com 220 | .avgle.com 221 | .avhd101.com 222 | .avira-vpn.com 223 | .avistaz.to 224 | .avple.tv 225 | .axios.com 226 | .azattyq.org 227 | .aznude.com 228 | .babepedia.com 229 | .babesource.com 230 | .babesrater.com 231 | .babestube.com 232 | .baby-kingdom.com 233 | .babylonbee.com 234 | .backchina.com 235 | .bad.news 236 | .badasstorrents.com 237 | .baddiehub.com 238 | .badgirlsbible.com 239 | .badoo.com 240 | .badoocdn.com 241 | .band.us 242 | .bandcamp.com 243 | .bang-movies.com 244 | .bang.com 245 | .bangbros.com 246 | .bangkokpost.com 247 | .bangumi.moe 248 | .baomihua.com 249 | .baramangaonline.com 250 | .bbc.co.uk 251 | .bbc.com 252 | .bbci.co.uk 253 | .bc.game 254 | .bdsmlr.com 255 | .bdsmstreak.com 256 | .bdsmx.tube 257 | .beastiality.tv 258 | .beastiegals.com 259 | .beaumontenterprise.com 260 | .beaxy.com 261 | .beclass.com 262 | .bedpage.com 263 | .beeg.com 264 | .beeg.porn 265 | .beeg.works 266 | .beeg24.org 267 | .beforeitsnews.com 268 | .befuck.net 269 | .behance.net 270 | .belfercenter.org 271 | .beliefnet.com 272 | .bellesa.co 273 | .bellingcat.com 274 | .berkshireeagle.com 275 | .berliner-kurier.de 276 | .berliner-zeitung.de 277 | .bestchange.ru 278 | .bestgore.fun 279 | .bestialitysextaboo.net 280 | .bestporncomix.com 281 | .bestsexpositions.com 282 | .bestvpnreviews.net 283 | .bet365.com 284 | .bet365.it 285 | .betterworldbooks.com 286 | .bg3.co 287 | .bgportable.com 288 | .bhaskarhindi.com 289 | .bigfuck.tv 290 | .biggo.com.tw 291 | .bignewsnetwork.com 292 | .biguz.net 293 | .bild.de 294 | .binance.cloud 295 | .binance.com 296 | .binance.org 297 | .binance.us 298 | .binary.com 299 | .bingoporno.com 300 | .bitbank.cc 301 | .bitbucket.io 302 | .bitchesgirls.com 303 | .bitchute.com 304 | .bitcoin.com 305 | .bitcointalk.org 306 | .bitfinex.com 307 | .bitflyer.com 308 | .bitforex.com 309 | .bitget.com 310 | .bithumb.com 311 | .bitmart.com 312 | .bitmex.com 313 | .bitpanda.com 314 | .bitpay.com 315 | .bitsearch.to 316 | .bitstamp.net 317 | .bittorrent.am 318 | .bittorrent.com 319 | .bittrex.com 320 | .bitvavo.com 321 | .biz-journal.jp 322 | .bkrs.info 323 | .blacked.com 324 | .blackedraw.com 325 | .blacktowhite.net 326 | .blackwells.co.uk 327 | .blockaway.net 328 | .blogarama.com 329 | .blogger.com 330 | .bloglovin.com 331 | .blogspot.ae 332 | .blogspot.ch 333 | .blogspot.co.id 334 | .blogspot.co.ke 335 | .blogspot.co.uk 336 | .blogspot.com 337 | .blogspot.de 338 | .blogspot.fr 339 | .blogspot.hk 340 | .blogspot.ie 341 | .blogspot.it 342 | .blogspot.jp 343 | .blogspot.kr 344 | .blogspot.my 345 | .blogspot.nl 346 | .blogspot.no 347 | .blogspot.ro 348 | .blogspot.ru 349 | .blogspot.sg 350 | .blogspot.tw 351 | .bloomberg.com 352 | .blubrry.com 353 | .blurb.com 354 | .bnbstatic.com 355 | .bnext.com.tw 356 | .bntrace.com 357 | .bobvoyeur.com 358 | .bokepxsex.com 359 | .bokus.com 360 | .bol.com 361 | .bollyinside.com 362 | .bongacams.xxx 363 | .bongacams7.com 364 | .boobpedia.com 365 | .bookbl.com 366 | .bookdepository.com 367 | .booklive.jp 368 | .bookmeter.com 369 | .books.com.tw 370 | .booksamillion.com 371 | .bookwalker.jp 372 | .boomplay.com 373 | .boomplaymusic.com 374 | .bootstrapcdn.com 375 | .borwap.vip 376 | .boston25news.com 377 | .botsin.space 378 | .bounceme.net 379 | .boundhub.com 380 | .boy18tube.com 381 | .boyfriendtv.com 382 | .boylove.cc 383 | .bradenton.com 384 | .brave.com 385 | .bravoporn.com 386 | .bravotube.net 387 | .brazzersnetwork.com 388 | .breaker.audio 389 | .breakingdefense.com 390 | .breitbart.com 391 | .brighteon.com 392 | .brill.com 393 | .brookings.edu 394 | .browsec.com 395 | .broxxx.com 396 | .bt4g.com 397 | .btc.com 398 | .btcturk.com 399 | .btdig.com 400 | .bullguard.com 401 | .bunshun.jp 402 | .buondua.com 403 | .business-humanrights.org 404 | .business-standard.com 405 | .businessinsider.com 406 | .businessinsider.in 407 | .businessinsider.nl 408 | .businesslive.co.za 409 | .businesstoday.com.tw 410 | .businessweekly.com.tw 411 | .bustybus.com 412 | .buyee.jp 413 | .buzzsprout.com 414 | .bworldonline.com 415 | .bybit.com 416 | .c-span.org 417 | .cableav.tv 418 | .cactusvpn.com 419 | .cafelagu.me 420 | .cafepress.com 421 | .calameo.com 422 | .calgarysun.com 423 | .cambro.tv 424 | .camfrog.com 425 | .campaign-archive.com 426 | .camsoda.com 427 | .camster.com 428 | .camstreams.tv 429 | .camwhores.tv 430 | .canal26.com 431 | .canalporno.com 432 | .capital.com 433 | .capradio.org 434 | .caravan.kz 435 | .cari.com.my 436 | .carousell.com.hk 437 | .carrd.co 438 | .cartoon18.com 439 | .cartoonporn.com 440 | .cartoonporno.xxx 441 | .cartoonpornvideos.com 442 | .cartoonstock.com 443 | .castbox.fm 444 | .cato.org 445 | .cbc.ca 446 | .cbs17.com 447 | .cbs42.com 448 | .cbs8.com 449 | .cc.com 450 | .ccn.com 451 | .ccu.edu.tw 452 | .celebjihad.com 453 | .celebritysex.co 454 | .celo.org 455 | .cepa.org 456 | .ceskeporno.cz 457 | .cex.io 458 | .cfr.org 459 | .cg-dialup.net 460 | .change.org 461 | .changeip.net 462 | .changelly.com 463 | .changenow.io 464 | .channelnewsasia.com 465 | .chaos.social 466 | .character.ai 467 | .charentelibre.fr 468 | .charliehebdo.fr 469 | .chartable.com 470 | .chatgpt.ch 471 | .chathamhouse.org 472 | .chatous.com 473 | .chatpdf.com 474 | .chatrandom.com 475 | .chatroulette.com 476 | .chatspin.com 477 | .chaturbate.com 478 | .chaturbate.eu 479 | .chatzy.com 480 | .cheathappens.com 481 | .checkitt.news 482 | .chibanippo.co.jp 483 | .chicagoreader.com 484 | .chickenkiller.com 485 | .chiggywiggy.com 486 | .chinadigitaltimes.net 487 | .chinapress.com.my 488 | .chochox.com 489 | .chordify.net 490 | .christianheadlines.com 491 | .christianpost.com 492 | .chugoku-np.co.jp 493 | .chuporn.net 494 | .chyoa.com 495 | .cia.gov 496 | .ciceksepeti.com 497 | .citizenlab.ca 498 | .city-journal.org 499 | .cityline.com 500 | .civitai.com 501 | .cjb.net 502 | .clipconverter.cc 503 | .clipdrop.co 504 | .clips4sale.com 505 | .clipsvip.com 506 | .cloudflare-ipfs.com 507 | .cloudwards.net 508 | .clporn.com 509 | .clubhouse.com 510 | .clubhouseapi.com 511 | .clyp.it 512 | .cmcmarkets.com 513 | .cmegroup.com 514 | .cna.com.tw 515 | .cnas.org 516 | .cnnphilippines.com 517 | .cnsnews.com 518 | .cnyes.com 519 | .cockdude.com 520 | .coinbase.com 521 | .coincheck.com 522 | .coindcx.com 523 | .coindesk.com 524 | .coingecko.com 525 | .coinmarketcap.com 526 | .coinpedia.org 527 | .coinsbit.io 528 | .coinstore.com 529 | .colegialasdeverdad.com 530 | .collectionofbestporn.com 531 | .comdotgame.com 532 | .come-on.de 533 | .comicbox.xyz 534 | .comixharem.com 535 | .communities.win 536 | .comparitech.com 537 | .compound.finance 538 | .compuserve.com 539 | .computerweekly.com 540 | .conflictnations.com 541 | .connected2.me 542 | .cool18.com 543 | .coolinet.net 544 | .coolrom.com.au 545 | .coolsexnew.com 546 | .coomeet.com 547 | .coopwb.in 548 | .coqnu.com 549 | .cornellsun.com 550 | .correiodopovo.com.br 551 | .cosplaytele.com 552 | .courant.com 553 | .courrierinternational.com 554 | .coursehero.com 555 | .cpj.org 556 | .crabdance.com 557 | .craiyon.com 558 | .crazyporn.xxx 559 | .crazyshit.com 560 | .creaders.net 561 | .createspace.com 562 | .creativefabrica.com 563 | .crikey.com.au 564 | .croxyproxy.com 565 | .croxyproxy.net 566 | .croxyproxy.rocks 567 | .crwflags.com 568 | .crypto.com 569 | .csis.org 570 | .csmonitor.com 571 | .ctee.com.tw 572 | .ctinets.com 573 | .ctinsider.com 574 | .ctwant.com 575 | .cuckoldsporn.com 576 | .cumlouder.com 577 | .currency.com 578 | .cutout.pro 579 | .cutscenes.net 580 | .cw.com.tw 581 | .cyberghostvpn.com 582 | .cyprus-mail.com 583 | .dafabet.com 584 | .daftporn.com 585 | .dagospia.com 586 | .daijiworld.com 587 | .dailyexcelsior.com 588 | .dailyhunt.in 589 | .dailymail.co.uk 590 | .dailymaverick.co.za 591 | .dailymotion.com 592 | .dailypioneer.com 593 | .dailysabah.com 594 | .dailysignal.com 595 | .dalailama.com 596 | .dangerousminds.net 597 | .darknaija.com 598 | .dashlane.com 599 | .daum.net 600 | .dawateislami.net 601 | .dcard.tw 602 | .ddd-smart.net 603 | .ddns.ms 604 | .ddnsking.com 605 | .ddxs.com 606 | .deadhouse.org 607 | .deadline.com 608 | .debate.org 609 | .deccanherald.com 610 | .decentraland.org 611 | .deepai.org 612 | .deepcoin.com 613 | .deepdreamgenerator.com 614 | .deepfakeporn.net 615 | .deepgoretube.site 616 | .defence.pk 617 | .defillama.com 618 | .delawareonline.com 619 | .delta.app 620 | .democracynow.org 621 | .democraticunderground.com 622 | .depositphotos.com 623 | .dergipark.org.tr 624 | .deribit.com 625 | .derpibooru.org 626 | .derstandard.de 627 | .desipornmms.com 628 | .detroitnews.com 629 | .devdiscourse.com 630 | .deviantart.com 631 | .deviantart.net 632 | .dex-trade.com 633 | .dfbocai.net 634 | .dhakatribune.com 635 | .dhcp.biz 636 | .diamond.jp 637 | .diariovasco.com 638 | .digg.com 639 | .digifinex.com 640 | .dimionline.com 641 | .dimsumdaily.hk 642 | .dinotube.com 643 | .dirtydoglinks.com 644 | .dirtyindianporn.info 645 | .dirtyroulette.com 646 | .dirtyship.com 647 | .disconnect.me 648 | .discord.com 649 | .discord.gg 650 | .discordapp.com 651 | .discordapp.net 652 | .discuss.com.hk 653 | .disp.cc 654 | .disqus.com 655 | .dissentmagazine.org 656 | .dissidentvoice.org 657 | .dixyporn.com 658 | .dl-x.com 659 | .dlive.tv 660 | .dlsite.com 661 | .dmc.nico 662 | .dmhy.org 663 | .dns2go.com 664 | .dnsalias.org 665 | .dnyuz.com 666 | .documentcloud.org 667 | .dodoconverter.com 668 | .does-it.net 669 | .dogspics.net 670 | .dokumen.pub 671 | .donaukurier.de 672 | .dorcelclub.com 673 | .dosexvideo.com 674 | .doujins.com 675 | .downloadlagu321z.net 676 | .dporn.com 677 | .dropbox.com 678 | .drpornofilme.com 679 | .drtuber.com 680 | .dtnpf.com 681 | .duckduckgo.com 682 | .duga.jp 683 | .dukascopy.com 684 | .dw.com 685 | .dxpool.com 686 | .dydx.exchange 687 | .dynalias.com 688 | .dyndns-free.com 689 | .dyndns-home.com 690 | .dyndns-ip.com 691 | .dyndns-server.com 692 | .dynu.com 693 | .e-activist.com 694 | .e-hentai.org 695 | .e-ir.info 696 | .earthcam.com 697 | .eastasiaforum.org 698 | .ebaumsworld.com 699 | .ebony8.com 700 | .ebonygalore.com 701 | .echo-online.de 702 | .economica.net 703 | .economist.com 704 | .edge.app 705 | .edgecastcdn.net 706 | .editorji.com 707 | .eggporncomics.com 708 | .egyptindependent.com 709 | .eiga.com 710 | .eightify.app 711 | .einnews.com 712 | .eispop.com 713 | .eksisozluk.com 714 | .elconfidencial.com 715 | .elefant.ro 716 | .ello.co 717 | .elmundoporno.com 718 | .elpais.com 719 | .emcd.io 720 | .emisorascolombianas.co 721 | .emoneyspace.com 722 | .empflix.com 723 | .empornium.is 724 | .empressleak.biz 725 | .emule.org.cn 726 | .enanyang.my 727 | .encyclopedia.com 728 | .epicbrowser.com 729 | .eplay.com 730 | .epochtimes.com 731 | .epochtimes.de 732 | .eporner.com 733 | .erepublik.com 734 | .ero-labs.com 735 | .ero-video.net 736 | .erofus.com 737 | .erogames.com 738 | .erome.com 739 | .eros.com 740 | .erosberry.com 741 | .eroticbeauties.net 742 | .escort-ireland.com 743 | .escortbabylon.net 744 | .escortforumit.xxx 745 | .escortnews.eu 746 | .eslite.com 747 | .esm3ha.com 748 | .ethermine.org 749 | .etherscan.io 750 | .etoday.co.kr 751 | .etsy.com 752 | .eurasianet.org 753 | .eurasiantimes.com 754 | .eurasiareview.com 755 | .eurogirlsescort.com 756 | .euronews.com 757 | .everipedia.org 758 | .everythinglubbock.com 759 | .evilangel.com 760 | .exhentai.org 761 | .exmo.com 762 | .exness.com 763 | .exodus.com 764 | .exodus.io 765 | .exploitedteens.com 766 | .exporntoons.net 767 | .express.co.uk 768 | .expressen.se 769 | .expressnews.com 770 | .expressvpn.com 771 | .extratorrent.st 772 | .exyi.com 773 | .eyny.com 774 | .ezil.me 775 | .f-droid.org 776 | .f2pool.com 777 | .f95zone.to 778 | .faceapp.io 779 | .facebook.com 780 | .faceswapper.ai 781 | .facileporno.com 782 | .fakings.com 783 | .fakku.net 784 | .familyporn.tv 785 | .familypornhd.com 786 | .fanbox.cc 787 | .fansly.com 788 | .fap-nation.com 789 | .fap18.net 790 | .fapality.com 791 | .fapcat.com 792 | .fapello.com 793 | .faphouse.com 794 | .fapvid.net 795 | .fastssh.com 796 | .fayerwayer.com 797 | .faz.net 798 | .fbcnews.com.fj 799 | .fbs.com 800 | .federalnewsnetwork.com 801 | .feebee.com.tw 802 | .feeder.co 803 | .feedly.com 804 | .feednews.com 805 | .feetfinder.com 806 | .femefun.com 807 | .festival-cannes.com 808 | .fetcherx.com 809 | .fetishshrine.com 810 | .fetlife.com 811 | .ffh.de 812 | .fidh.org 813 | .fikfap.com 814 | .filefactory.com 815 | .filkhabr.com 816 | .filmikiporno.tv 817 | .filmschoolrejects.com 818 | .finans.dk 819 | .finchvpn.com 820 | .fineartamerica.com 821 | .firenews.video 822 | .firstcoastnews.com 823 | .firstpost.com 824 | .firstthings.com 825 | .flaru.com 826 | .flexclip.com 827 | .flickr.com 828 | .flickriver.com 829 | .flingster.com 830 | .flipboard.com 831 | .flirt4free.com 832 | .flyflv.com 833 | .flypool.org 834 | .fnp.de 835 | .focus.de 836 | .forbes.com 837 | .foreignaffairs.com 838 | .foreignpolicy.com 839 | .forex.com 840 | .forextime.com 841 | .forhertube.com 842 | .formiche.net 843 | .foroparalelo.com 844 | .forumophilia.com 845 | .fosstodon.org 846 | .fotor.com 847 | .foundation.app 848 | .fow.kr 849 | .fox13memphis.com 850 | .fox21news.com 851 | .fox23.com 852 | .fox40.com 853 | .fox43.com 854 | .fox4kc.com 855 | .fox59.com 856 | .fox5sandiego.com 857 | .fox61.com 858 | .foxporns.net 859 | .fpo.xxx 860 | .fpri.org 861 | .franceculture.fr 862 | .frc.org 863 | .freeadultcomix.com 864 | .freearabsexx.com 865 | .freebeacon.com 866 | .freecomics.xxx 867 | .freedom.to 868 | .freedomhouse.org 869 | .freehentaistream.com 870 | .freemalaysiatoday.com 871 | .freeones.com 872 | .freeporn8.com 873 | .freeporncave.com 874 | .freeporno.xxx 875 | .freerepublic.com 876 | .freexcafe.com 877 | .freiepresse.de 878 | .fri-gate.biz 879 | .fridaysforfuture.org 880 | .fril.jp 881 | .frommers.com 882 | .frontlinedefenders.org 883 | .frontpagemag.com 884 | .fs1.app 885 | .ftchinese.com 886 | .ftvnews.com.tw 887 | .ftx.com 888 | .fuccunt.com 889 | .fuckedgay.xxx 890 | .fuckedtube.xxx 891 | .fuckmovies.biz 892 | .fujisan.co.jp 893 | .fukuishimbun.co.jp 894 | .fuldaerzeitung.de 895 | .fullhdxxx.com 896 | .fullscatmovies.club 897 | .fullsexmovs.com 898 | .fulltube.xxx 899 | .fundly.com 900 | .fuq.com 901 | .fuqer.com 902 | .fuskator.com 903 | .fxcm.com 904 | .fxempire.com 905 | .fyptt.to 906 | .gab.com 907 | .gagaoolala.com 908 | .gamcore.com 909 | .gamecax.com 910 | .gamer.com.tw 911 | .gamesofdesire.com 912 | .gamestorrents.fm 913 | .gamingadult.com 914 | .gamingdeputy.com 915 | .gamkabu.com 916 | .ganjingworld.com 917 | .garotaporno.com 918 | .garudalinux.org 919 | .gate.io 920 | .gatestoneinstitute.org 921 | .gay.bingo 922 | .gay0day.com 923 | .gayboystube.com 924 | .gayck.com 925 | .gayforfans.com 926 | .gayforit.eu 927 | .gayfucktube.xxx 928 | .gayharem.com 929 | .gaymaletube.com 930 | .gaymenring.com 931 | .gaypornhd.xxx 932 | .gayporno.fm 933 | .gaytag.net 934 | .gayteam.club 935 | .gcolle.net 936 | .gelbooru.com 937 | .gemini.com 938 | .gencraft.com 939 | .generated.photos 940 | .genius.com 941 | .genyt.net 942 | .geo.tv 943 | .getabstract.com 944 | .getkeepsafe.com 945 | .getrevue.co 946 | .gets-it.net 947 | .getsession.org 948 | .gettr.com 949 | .gettyimages.ca 950 | .gettyimages.co.jp 951 | .gettyimages.co.uk 952 | .gettyimages.com.au 953 | .gettyimages.com.br 954 | .gettyimages.com.mx 955 | .gettyimages.de 956 | .gettyimages.es 957 | .gettyimages.fr 958 | .gettyimages.in 959 | .gettyimages.it 960 | .gg.bet 961 | .ggjav.com 962 | .ghostery.com 963 | .giganews.com 964 | .giornaledibrescia.it 965 | .girlfriendgalleries.net 966 | .girls-h.info 967 | .girlsanimalsex.monster 968 | .git.io 969 | .gitcdn.xyz 970 | .gizmoxxx.com 971 | .glamour.com 972 | .globalfirepower.com 973 | .globalsecurity.org 974 | .globalvillagespace.com 975 | .globalvoices.org 976 | .gloria.tv 977 | .gmatclub.com 978 | .gmfus.org 979 | .gmpg.org 980 | .godaddy.com 981 | .gofundme.com 982 | .gogetfunding.com 983 | .goldenfrog.com 984 | .goo.ne.jp 985 | .good-gay.tv 986 | .goodav17.com 987 | .goodnewsnetwork.org 988 | .goodporn.to 989 | .goodreads.com 990 | .google.ae 991 | .google.am 992 | .google.as 993 | .google.at 994 | .google.az 995 | .google.ba 996 | .google.be 997 | .google.bf 998 | .google.bg 999 | .google.bi 1000 | .google.bj 1001 | .google.bs 1002 | .google.bt 1003 | .google.by 1004 | .google.ca 1005 | .google.cat 1006 | .google.cd 1007 | .google.cf 1008 | .google.cg 1009 | .google.ch 1010 | .google.ci 1011 | .google.cl 1012 | .google.cm 1013 | .google.co.ao 1014 | .google.co.bw 1015 | .google.co.ck 1016 | .google.co.cr 1017 | .google.co.hu 1018 | .google.co.id 1019 | .google.co.il 1020 | .google.co.im 1021 | .google.co.in 1022 | .google.co.je 1023 | .google.co.jp 1024 | .google.co.ke 1025 | .google.co.kr 1026 | .google.co.ls 1027 | .google.co.ma 1028 | .google.co.mz 1029 | .google.co.nz 1030 | .google.co.th 1031 | .google.co.tz 1032 | .google.co.ug 1033 | .google.co.uk 1034 | .google.co.uz 1035 | .google.co.ve 1036 | .google.co.vi 1037 | .google.co.za 1038 | .google.co.zm 1039 | .google.co.zw 1040 | .google.com 1041 | .google.com.af 1042 | .google.com.ag 1043 | .google.com.ai 1044 | .google.com.ar 1045 | .google.com.au 1046 | .google.com.bd 1047 | .google.com.bh 1048 | .google.com.bo 1049 | .google.com.br 1050 | .google.com.bz 1051 | .google.com.co 1052 | .google.com.cu 1053 | .google.com.do 1054 | .google.com.ec 1055 | .google.com.eg 1056 | .google.com.et 1057 | .google.com.fj 1058 | .google.com.gh 1059 | .google.com.gi 1060 | .google.com.gt 1061 | .google.com.hk 1062 | .google.com.jm 1063 | .google.com.lb 1064 | .google.com.ly 1065 | .google.com.mm 1066 | .google.com.mt 1067 | .google.com.mx 1068 | .google.com.my 1069 | .google.com.na 1070 | .google.com.nf 1071 | .google.com.ng 1072 | .google.com.ni 1073 | .google.com.np 1074 | .google.com.om 1075 | .google.com.pa 1076 | .google.com.pe 1077 | .google.com.pg 1078 | .google.com.ph 1079 | .google.com.pk 1080 | .google.com.pr 1081 | .google.com.py 1082 | .google.com.sa 1083 | .google.com.sb 1084 | .google.com.sg 1085 | .google.com.sl 1086 | .google.com.sv 1087 | .google.com.tj 1088 | .google.com.tr 1089 | .google.com.tw 1090 | .google.com.ua 1091 | .google.com.uy 1092 | .google.com.vc 1093 | .google.com.vn 1094 | .google.cv 1095 | .google.de 1096 | .google.dj 1097 | .google.dk 1098 | .google.dm 1099 | .google.es 1100 | .google.fi 1101 | .google.fm 1102 | .google.fr 1103 | .google.ga 1104 | .google.gg 1105 | .google.gl 1106 | .google.gm 1107 | .google.gp 1108 | .google.gr 1109 | .google.gy 1110 | .google.hn 1111 | .google.hr 1112 | .google.ht 1113 | .google.ie 1114 | .google.im 1115 | .google.iq 1116 | .google.is 1117 | .google.it 1118 | .google.je 1119 | .google.jo 1120 | .google.kg 1121 | .google.ki 1122 | .google.kz 1123 | .google.la 1124 | .google.li 1125 | .google.lk 1126 | .google.lt 1127 | .google.lu 1128 | .google.lv 1129 | .google.me 1130 | .google.mg 1131 | .google.ml 1132 | .google.mn 1133 | .google.ms 1134 | .google.mu 1135 | .google.mv 1136 | .google.mw 1137 | .google.ne 1138 | .google.nl 1139 | .google.no 1140 | .google.nr 1141 | .google.nu 1142 | .google.pl 1143 | .google.pn 1144 | .google.ps 1145 | .google.pt 1146 | .google.ro 1147 | .google.rs 1148 | .google.ru 1149 | .google.rw 1150 | .google.sc 1151 | .google.se 1152 | .google.sh 1153 | .google.sk 1154 | .google.sm 1155 | .google.sn 1156 | .google.so 1157 | .google.sr 1158 | .google.st 1159 | .google.td 1160 | .google.tg 1161 | .google.tk 1162 | .google.tl 1163 | .google.tm 1164 | .google.to 1165 | .google.tt 1166 | .google.vg 1167 | .google.vu 1168 | .google.ws 1169 | .googlevideo.com 1170 | .gorecenter.com 1171 | .goregrish.com 1172 | .gotdns.ch 1173 | .gotporn.com 1174 | .govtrack.us 1175 | .gpb.org 1176 | .graph.org 1177 | .gravatar.com 1178 | .greenwichtime.com 1179 | .grindr.com 1180 | .grogol.us 1181 | .ground.news 1182 | .grunge.com 1183 | .gudanglagu321.cc 1184 | .gudanglagu456.cc 1185 | .guilded.gg 1186 | .gumroad.com 1187 | .gunosy.com 1188 | .gunsinternational.com 1189 | .gvm.com.tw 1190 | .h-flash.com 1191 | .haberturk.com 1192 | .hackmd.io 1193 | .halktv.com.tr 1194 | .hallandsposten.se 1195 | .handelsblatt.com 1196 | .handelszeitung.ch 1197 | .hanime.tv 1198 | .hanime1.me 1199 | .happyescorts.com 1200 | .hardpornlinks.com 1201 | .harmony.one 1202 | .harpercollins.com 1203 | .hbo.com 1204 | .hclips.com 1205 | .hd-easyporn.com 1206 | .hd21.com 1207 | .hdbits.org 1208 | .hdpornfree.xxx 1209 | .hdpornmovies.xxx 1210 | .hdpornos.xxx 1211 | .hdpornpictures.net 1212 | .hdpornt.com 1213 | .hdpornvideo.xxx 1214 | .hdsessovideo.com 1215 | .hdsex.org 1216 | .hdtube.porn 1217 | .hdtubemovies.xxx 1218 | .hdzog.com 1219 | .hdzog.tube 1220 | .heavy-r.com 1221 | .heavyfetish.com 1222 | .hegre.com 1223 | .heise.de 1224 | .helium.com 1225 | .hello.porn 1226 | .hellporno.com 1227 | .hellporno.net 1228 | .hentai-cosplays.com 1229 | .hentai-img.com 1230 | .hentai.tv 1231 | .hentaibar.com 1232 | .hentaichan.live 1233 | .hentaidude.com 1234 | .hentaiera.com 1235 | .hentaifox.com 1236 | .hentaihaven.xxx 1237 | .hentaiheroes.com 1238 | .hentailegendado.com 1239 | .hentaimama.io 1240 | .hentaiplay.net 1241 | .hentaisea.com 1242 | .hentaistream.com 1243 | .hentaiyaoi.net 1244 | .hepsiburada.com 1245 | .heraldnews.com 1246 | .heritage.org 1247 | .heroero.com 1248 | .herokuapp.com 1249 | .herominers.com 1250 | .heureporno.com 1251 | .heygen.com 1252 | .hfm.com 1253 | .hgamefree.info 1254 | .hide.me 1255 | .hidemyass.com 1256 | .highporn.net 1257 | .hindixxxhd.com 1258 | .hinet.net 1259 | .hitbtc.com 1260 | .hitomi.la 1261 | .hive.blog 1262 | .hiveon.net 1263 | .hk01.com 1264 | .hkej.com 1265 | .hket.com 1266 | .hlebo.mobi 1267 | .hmv.co.jp 1268 | .hokkaido-np.co.jp 1269 | .hola.org 1270 | .home.saxo 1271 | .homeftp.net 1272 | .homemoviestube.com 1273 | .homepornking.com 1274 | .homo.xxx 1275 | .hongkongfp.com 1276 | .honto.jp 1277 | .hootsuite.com 1278 | .hoover.org 1279 | .hosyusokuhou.jp 1280 | .hot-sex-tube.com 1281 | .hotair.com 1282 | .hotbit.io 1283 | .hotindiansexvideo.com 1284 | .hotmovies.com 1285 | .hotmovs.com 1286 | .hotntubes.com 1287 | .hotpot.ai 1288 | .hotsexstory.xyz 1289 | .hotspotshield.com 1290 | .hottystop.com 1291 | .hotwap.net 1292 | .hotxv.com 1293 | .housefun.com.tw 1294 | .hqporner.com 1295 | .hrw.org 1296 | .hsex.men 1297 | .htx.com 1298 | .huaren.us 1299 | .hudson.org 1300 | .huffingtonpost.it 1301 | .huffingtonpost.jp 1302 | .huffpost.com 1303 | .huggingface.co 1304 | .hulkshare.com 1305 | .humanevents.com 1306 | .huobi.com 1307 | .huobi.pro 1308 | .hurriyetdailynews.com 1309 | .hypnotube.com 1310 | .i24news.tv 1311 | .ibanet.org 1312 | .ibtimes.com 1313 | .ibtimes.sg 1314 | .ice.io 1315 | .icedrive.net 1316 | .iceflix.tv 1317 | .icegay.tv 1318 | .iceporn.com 1319 | .iceporn.xxx 1320 | .icij.org 1321 | .icmarkets.com 1322 | .ideogram.ai 1323 | .idh161.com 1324 | .idope.se 1325 | .idowa.de 1326 | .idrlabs.com 1327 | .ifj.org 1328 | .ifunny.co 1329 | .ig.com 1330 | .iheart.com 1331 | .ijavhd.com 1332 | .ilhadoprazer.com.br 1333 | .ilikecomix.com 1334 | .img2go.com 1335 | .imgflip.com 1336 | .imgur.com 1337 | .imo.im 1338 | .independent.co.uk 1339 | .independent.com 1340 | .independent.ie 1341 | .independent.org 1342 | .indexxx.com 1343 | .indiankinkygirls.com 1344 | .indianporn365.net 1345 | .indiatimes.com 1346 | .indiatoday.in 1347 | .indiatvnews.com 1348 | .indodax.com 1349 | .influencersgonewild.com 1350 | .infosec.exchange 1351 | .inkbunny.net 1352 | .inoreader.com 1353 | .inquirer.net 1354 | .insecam.org 1355 | .insidethegames.biz 1356 | .instaforex.com 1357 | .instagram.com 1358 | .instalker.org 1359 | .insuedthueringen.de 1360 | .interactivebrokers.com 1361 | .intercom.help 1362 | .interpark.com 1363 | .intporn.com 1364 | .investor.id 1365 | .iodonna.it 1366 | .iowapublicradio.org 1367 | .ipburger.com 1368 | .ipfs.io 1369 | .ipservers.xyz 1370 | .ipvanish.com 1371 | .is-by.us 1372 | .is.gd 1373 | .ishotmyself.nl 1374 | .islamqa.info 1375 | .ispionline.it 1376 | .issuu.com 1377 | .istmein.de 1378 | .istockphoto.com 1379 | .istripper.com 1380 | .italianoxxx.com 1381 | .itemfix.com 1382 | .its.porn 1383 | .itsaol.com 1384 | .itssa.co.kr 1385 | .ivoox.com 1386 | .iwantclips.com 1387 | .iwara.tv 1388 | .ixquick.com 1389 | .ixxx.com 1390 | .izlesene.com 1391 | .j-cast.com 1392 | .jable.tv 1393 | .jackpotcitycasino.com 1394 | .jacobin.com 1395 | .jacquieetmicheltv.net 1396 | .jade-net-home.com 1397 | .jamestown.org 1398 | .japaneseanimaltube.cyou 1399 | .japantimes.co.jp 1400 | .japteenx.com 1401 | .jav.guru 1402 | .jav.land 1403 | .jav101.com 1404 | .jav777.xyz 1405 | .jav789.pro 1406 | .javbangers.com 1407 | .javbus.com 1408 | .javday.tv 1409 | .javdb.com 1410 | .javdoe.to 1411 | .javdove.com 1412 | .javgg.net 1413 | .javhd.com 1414 | .javhd.icu 1415 | .javhd.pics 1416 | .javhd.today 1417 | .javhub.net 1418 | .javlibrary.com 1419 | .javopen.co 1420 | .javquick.com 1421 | .javrank.com 1422 | .javseen.tv 1423 | .javstore.net 1424 | .javtiful.com 1425 | .javtrailers.com 1426 | .javym.net 1427 | .javynow.com 1428 | .jawapos.com 1429 | .jenporno.cz 1430 | .jerkmate.com 1431 | .jewishcurrents.org 1432 | .jihadwatch.org 1433 | .jiji.com 1434 | .jizzberry.com 1435 | .jizzbunker.com 1436 | .jizzbunker2.com 1437 | .jjgirls.com 1438 | .jkforum.net 1439 | .jmcomic.me 1440 | .jmcomic1.me 1441 | .jmvbt.com 1442 | .joe.ie 1443 | .johren.games 1444 | .joinclubhouse.com 1445 | .joinmastodon.org 1446 | .jornaldacidadeonline.com.br 1447 | .journal-news.com 1448 | .journaldequebec.com 1449 | .julesjordan.com 1450 | .just2trade.online 1451 | .justpaste.it 1452 | .jw.org 1453 | .kabinedasnovinhas.com 1454 | .kadokawa.co.jp 1455 | .kakao.com 1456 | .kake.com 1457 | .kaktus.media 1458 | .kansascity.com 1459 | .kantotin.com 1460 | .kaotic.com 1461 | .kapwing.com 1462 | .kare11.com 1463 | .kaskus.co.id 1464 | .katcr.to 1465 | .katestube.com 1466 | .kathmandupost.com 1467 | .katitube.com 1468 | .kavin.rocks 1469 | .keepsolid.com 1470 | .keloland.com 1471 | .kemono.party 1472 | .kens5.com 1473 | .kenxxx.com 1474 | .kesq.com 1475 | .ketto.org 1476 | .keyt.com 1477 | .kfgo.com 1478 | .kfor.com 1479 | .kgw.com 1480 | .khon2.com 1481 | .khou.com 1482 | .kickasstorrents.to 1483 | .kik.com 1484 | .kimchi.tv 1485 | .kindgirls.com 1486 | .king5.com 1487 | .kingcomix.com 1488 | .kingstone.com.tw 1489 | .kink.com 1490 | .kinokuniya.co.jp 1491 | .kisscos.net 1492 | .kissjav.com 1493 | .kkbox.com 1494 | .knowyourmeme.com 1495 | .kobe-np.co.jp 1496 | .kobo.com 1497 | .kobobooks.com 1498 | .koin.com 1499 | .kold.com 1500 | .kompas.tv 1501 | .kompoz2.com 1502 | .kosho.or.jp 1503 | .kottke.org 1504 | .kproxy.com 1505 | .kraken.com 1506 | .krdo.com 1507 | .krem.com 1508 | .krqe.com 1509 | .ksbw.com 1510 | .ksdk.com 1511 | .ksn.com 1512 | .kstp.com 1513 | .ktar.com 1514 | .ktsm.com 1515 | .ktvb.com 1516 | .ktvz.com 1517 | .kucoin.com 1518 | .kumparan.com 1519 | .kvia.com 1520 | .kvue.com 1521 | .kyoto-np.co.jp 1522 | .l3harris.com 1523 | .lacapitalmdp.com 1524 | .ladiaria.com.uy 1525 | .lagu123.gratis 1526 | .laopinion.com.co 1527 | .laowang.vip 1528 | .lapatilla.com 1529 | .larazon.es 1530 | .larepubliquedespyrenees.fr 1531 | .largehdtube.com 1532 | .latercera.com 1533 | .latoken.com 1534 | .lazerpenguin.com 1535 | .leaderpost.com 1536 | .league-funny.com 1537 | .leak.xxx 1538 | .learnreligions.com 1539 | .lecho.be 1540 | .ledger.com 1541 | .lehmanns.de 1542 | .lejdd.fr 1543 | .lejsl.com 1544 | .lematin.ch 1545 | .lemmy.ml 1546 | .lemonde.fr 1547 | .leonoticias.com 1548 | .lepoint.fr 1549 | .lesbian8.com 1550 | .lesbianpornvideos.com 1551 | .lesbify.com 1552 | .lesoir.be 1553 | .letelegramme.fr 1554 | .letemps.ch 1555 | .letmejerk.com 1556 | .letsdoeit.com 1557 | .letsjerk.tv 1558 | .level3.net 1559 | .lewdzone.com 1560 | .lewrockwell.com 1561 | .lexica.art 1562 | .lexpress.fr 1563 | .lfpress.com 1564 | .liberation.fr 1565 | .libgen.is 1566 | .libgen.li 1567 | .libgen.rs 1568 | .liebelib.net 1569 | .lifeofpix.com 1570 | .lifesitenews.com 1571 | .liftoff.io 1572 | .lihkg.com 1573 | .limetorrents.lol 1574 | .line-apps.com 1575 | .line.me 1576 | .lingq.com 1577 | .lingualeo.com 1578 | .linktr.ee 1579 | .linsemao.com 1580 | .listennotes.com 1581 | .litecoin.org 1582 | .livegore.com 1583 | .livehdcams.com 1584 | .livejasmin.com 1585 | .livemint.com 1586 | .livestream.com 1587 | .lmtonline.com 1588 | .loader.to 1589 | .lobstertube.com 1590 | .localbitcoins.com 1591 | .localnews8.com 1592 | .logos.com 1593 | .lontv.cc 1594 | .loopring.io 1595 | .lopinion.fr 1596 | .loudersound.com 1597 | .loudtalks.com 1598 | .lovecomicz.com 1599 | .lovehoney.com 1600 | .lovelybooks.de 1601 | .lovense.com 1602 | .loverslab.com 1603 | .lowellsun.com 1604 | .lowyinstitute.org 1605 | .lpsg.com 1606 | .lrb.co.uk 1607 | .lrt.lt 1608 | .ltn.com.tw 1609 | .ltube.life 1610 | .luckpool.net 1611 | .lulu.com 1612 | .luminati.io 1613 | .luno.com 1614 | .lupoporno.com 1615 | .luscious.net 1616 | .lushstories.com 1617 | .luxor.tech 1618 | .luxuretv.com 1619 | .lxjc.app 1620 | .lxtube.com 1621 | .lyricstranslate.com 1622 | .lz.de 1623 | .m-porn.xxx 1624 | .machotube.tv 1625 | .madamlive.tv 1626 | .madou.club 1627 | .mag2.com 1628 | .magnetdl.com 1629 | .magzter.com 1630 | .maharashtratimes.com 1631 | .mahjongsoul.com 1632 | .mainichi.jp 1633 | .maisexo.com 1634 | .makerdao.com 1635 | .malaymail.com 1636 | .malaysiakini.com 1637 | .mamot.fr 1638 | .manager-magazin.de 1639 | .mangabz.com 1640 | .mangaforfree.com 1641 | .mangago.me 1642 | .mangahentai.me 1643 | .manhuagui.com 1644 | .manhwahentai.me 1645 | .manilastandard.net 1646 | .mannheimer-morgen.de 1647 | .manporn.xxx 1648 | .mansurfer.com 1649 | .manwa.me 1650 | .manytoon.com 1651 | .mapsofworld.com 1652 | .marathonbet.com 1653 | .maritime-executive.com 1654 | .mas.to 1655 | .massagerepublic.com 1656 | .massivegrid.com 1657 | .masto.ai 1658 | .mastodon.art 1659 | .mastodon.cloud 1660 | .mastodon.online 1661 | .mastodon.social 1662 | .mastodon.world 1663 | .mastodon.xyz 1664 | .masutabe.info 1665 | .matichon.co.th 1666 | .matrix.org 1667 | .mature.nl 1668 | .maturetube.com 1669 | .maxpornogratis.com 1670 | .mcusercontent.com 1671 | .me.me 1672 | .mediamatters.org 1673 | .mediapart.fr 1674 | .medibang.com 1675 | .medium.com 1676 | .meetdownload.com 1677 | .meetme.com 1678 | .meforum.org 1679 | .mega.io 1680 | .mega.nz 1681 | .megalodon.jp 1682 | .megatube.xxx 1683 | .melonstube.com 1684 | .memri.org 1685 | .mercadobitcoin.com.br 1686 | .mercari.com 1687 | .mercari.jp 1688 | .mercariapp.com 1689 | .mercdn.net 1690 | .metafilter.com 1691 | .metamask.io 1692 | .metart.com 1693 | .metarthunter.com 1694 | .mewe.com 1695 | .mexc.com 1696 | .mh4.cc 1697 | .miamiherald.com 1698 | .michiganradio.org 1699 | .middleeasteye.net 1700 | .middleeastmonitor.com 1701 | .mikanani.me 1702 | .milffox.com 1703 | .milfnut.com 1704 | .minepi.com 1705 | .minergate.com 1706 | .mingle2.com 1707 | .mingpao.com 1708 | .miningpoolhub.com 1709 | .minuporno.com 1710 | .mirror.xyz 1711 | .mirrormedia.mg 1712 | .missav.com 1713 | .missav123.com 1714 | .misskey.io 1715 | .missoulian.com 1716 | .mix.com 1717 | .mixcloud.com 1718 | .mixi.jp 1719 | .mixlr.com 1720 | .mmh.org.tw 1721 | .mobcup.net 1722 | .mobile01.com 1723 | .mod.io 1724 | .modelhub.com 1725 | .modernghana.com 1726 | .moengage.com 1727 | .mojim.com 1728 | .momoshop.com.tw 1729 | .monde-diplomatique.fr 1730 | .mondediplo.com 1731 | .moneydj.com 1732 | .monica.im 1733 | .monstercockland.com 1734 | .montrealgazette.com 1735 | .mooo.com 1736 | .morazzia.com 1737 | .morningstar.co.uk 1738 | .motherjones.com 1739 | .motherless.com 1740 | .movieffm.net 1741 | .mp3juices.cc 1742 | .mp3juices.vin 1743 | .mp3uk.net 1744 | .mp4porn.space 1745 | .mprnews.org 1746 | .mrcong.com 1747 | .mrdeepfakes.com 1748 | .mrt.com 1749 | .mrvideospornogratis.xxx 1750 | .mstdn.ca 1751 | .mstdn.jp 1752 | .mstdn.social 1753 | .mubi.com 1754 | .muchohentai.com 1755 | .mudfish.net 1756 | .mullvad.net 1757 | .mult34.com 1758 | .multi.xxx 1759 | .multporn.net 1760 | .musically.com 1761 | .muslimpro.com 1762 | .mvideoporno.xxx 1763 | .mybluemix.net 1764 | .myddns.com 1765 | .mydirtyhobby.com 1766 | .myetherwallet.com 1767 | .myftp.biz 1768 | .myftp.org 1769 | .myhentaicomics.com 1770 | .myhentaigallery.com 1771 | .myheritage.com 1772 | .myinstants.com 1773 | .myip.com 1774 | .mymusclevideo.com 1775 | .myporn.club 1776 | .mypornvid.fun 1777 | .myreadingmanga.info 1778 | .mystateline.com 1779 | .mysterium.network 1780 | .myteenwebcam.com 1781 | .mytuner-radio.com 1782 | .mytuner.mobi 1783 | .myunidays.com 1784 | .myvideo.net.tw 1785 | .myvido1.com 1786 | .mywire.org 1787 | .mzansipornvideos.com 1788 | .n-tv.de 1789 | .naciodigital.cat 1790 | .namethatporn.com 1791 | .nangiphotos.com 1792 | .nanopool.org 1793 | .naoconto.com 1794 | .nash.io 1795 | .nashuatelegraph.com 1796 | .nate.com 1797 | .nationalinterest.org 1798 | .nationalreview.com 1799 | .nationthailand.com 1800 | .nau.ch 1801 | .naughtyblog.org 1802 | .naughtyhentai.com 1803 | .nbcbayarea.com 1804 | .nbcdfw.com 1805 | .nbcmontana.com 1806 | .nbcnews.com 1807 | .ncregister.com 1808 | .ndemiccreations.com 1809 | .ndi.org 1810 | .ndr.de 1811 | .ndtv.com 1812 | .near.org 1813 | .ned.org 1814 | .nedporno.com 1815 | .nekoxxx.com 1816 | .neowin.net 1817 | .networkworld.com 1818 | .neural.love 1819 | .new-porn.video 1820 | .newindianexpress.com 1821 | .newkerala.com 1822 | .newmitbbs.com 1823 | .newrepublic.com 1824 | .news-postseven.com 1825 | .news.com.au 1826 | .news1.kr 1827 | .news10.com 1828 | .news24.com 1829 | .news9.com 1830 | .news9live.com 1831 | .newsadvance.com 1832 | .newsblur.com 1833 | .newsbreak.com 1834 | .newsbreakapp.com 1835 | .newsbytesapp.com 1836 | .newscentermaine.com 1837 | .newser.com 1838 | .newsexwap.com 1839 | .newsexxxx.com 1840 | .newshub.co.nz 1841 | .newsmax.com 1842 | .newson6.com 1843 | .newspaperdirect.com 1844 | .newspicks.com 1845 | .newsroom.co.nz 1846 | .newstalkzb.co.nz 1847 | .newstatesman.com 1848 | .newstimes.com 1849 | .newsweek.com 1850 | .newsweek.ro 1851 | .newsweekjapan.jp 1852 | .newsy.com 1853 | .newtalk.tw 1854 | .newyorker.com 1855 | .newzealandgirls.co.nz 1856 | .nexo.io 1857 | .nextapple.com 1858 | .nextshark.com 1859 | .nhentai.com 1860 | .nhentai.net 1861 | .nhentai.to 1862 | .nhentai.xxx 1863 | .nhk-ondemand.jp 1864 | .nhpr.org 1865 | .nhregister.com 1866 | .nicehash.com 1867 | .niceporn.tv 1868 | .nicovideo.jp 1869 | .nifty.com 1870 | .nifty.org 1871 | .niftygateway.com 1872 | .niigata-nippo.co.jp 1873 | .nikkan-spa.jp 1874 | .nikkei.com 1875 | .nimfomane.com 1876 | .nina.az 1877 | .nishinippon.co.jp 1878 | .niteflirt.com 1879 | .nitter.cz 1880 | .nitter.net 1881 | .njav.tv 1882 | .njavtv.com 1883 | .noemamag.com 1884 | .nogomi.ru 1885 | .nordvpn.com 1886 | .nordvpnteams.com 1887 | .northghost.com 1888 | .nos.nl 1889 | .notepad-plus-plus.org 1890 | .notretemps.com 1891 | .notube.io 1892 | .notube.net 1893 | .notube.site 1894 | .nouvelobs.com 1895 | .novelai.net 1896 | .novinhasdozapzap.com 1897 | .novinite.com 1898 | .now.com 1899 | .nownews.com 1900 | .nozomi.la 1901 | .nrk.no 1902 | .nrz.de 1903 | .nsfw.xxx 1904 | .ntd.com 1905 | .ntdtv.com 1906 | .nu-bay.com 1907 | .nubilefilms.com 1908 | .nubiles-porn.com 1909 | .nubiles.net 1910 | .nude-gals.com 1911 | .nudelive.com 1912 | .nudography.com 1913 | .nudostar.com 1914 | .nutaku.net 1915 | .nuvid.com 1916 | .nwahomepage.com 1917 | .nyaa.si 1918 | .nybooks.com 1919 | .nypost.com 1920 | .nysun.com 1921 | .nytimes.com 1922 | .nzz.ch 1923 | .oanda.com 1924 | .oann.com 1925 | .observatornews.ro 1926 | .occrp.org 1927 | .odysee.com 1928 | .oglaf.com 1929 | .ohentai.org 1930 | .ohsex.pro 1931 | .ok.porn 1932 | .ok.ru 1933 | .ok.xxx 1934 | .okcoin.com 1935 | .okex.com 1936 | .okinawatimes.co.jp 1937 | .oklahoman.com 1938 | .olevod.com 1939 | .oliberal.com 1940 | .olivetree.com 1941 | .omegle.com 1942 | .omni7.jp 1943 | .omny.fm 1944 | .oneindia.com 1945 | .onejav.com 1946 | .onetz.de 1947 | .onion.ly 1948 | .onthisday.com 1949 | .ooguy.com 1950 | .op-online.de 1951 | .opb.org 1952 | .openart.ai 1953 | .opendemocracy.net 1954 | .openedition.org 1955 | .opengw.net 1956 | .openlibrary.org 1957 | .opensea.io 1958 | .openstreetmap.org 1959 | .openvpn.net 1960 | .opindia.com 1961 | .optimism.io 1962 | .opwindend.net 1963 | .orfonline.org 1964 | .orgasmatrix.com 1965 | .oricon.co.jp 1966 | .orientaldaily.com.my 1967 | .ourmidland.com 1968 | .oursogo.com 1969 | .oursteps.com.au 1970 | .outbyte.com 1971 | .outlookindia.com 1972 | .overcast.fm 1973 | .overdrive.com 1974 | .overplay.net 1975 | .oxfordscholarship.com 1976 | .oyoh.com 1977 | .paimon.moe 1978 | .palgrave.com 1979 | .pali.land 1980 | .paltalk.com 1981 | .paltalkconnect.com 1982 | .pampaporno.com 1983 | .pancakeswap.finance 1984 | .pancakeswap.info 1985 | .panoramio.com 1986 | .papalah.com 1987 | .paradisehill.cc 1988 | .paribu.com 1989 | .parler.com 1990 | .pastedownload.com 1991 | .patreon.com 1992 | .patreonusercontent.com 1993 | .pawoo.net 1994 | .paxful.com 1995 | .paxos.com 1996 | .paybis.com 1997 | .pcgamestorrents.com 1998 | .pchome.com.tw 1999 | .pcstore.com.tw 2000 | .pen.org 2001 | .penguin.com.au 2002 | .penguinrandomhouse.com 2003 | .peppahub.com 2004 | .pepperstone.com 2005 | .perchance.org 2006 | .perfect-privacy.com 2007 | .perfil.com 2008 | .periscope.tv 2009 | .perlego.com 2010 | .perlentaucher.de 2011 | .perma.cc 2012 | .perplexity.ai 2013 | .persagg.com 2014 | .persgroep.net 2015 | .pervclips.com 2016 | .pewresearch.org 2017 | .phun.org 2018 | .piaproxy.net 2019 | .picacomic.com 2020 | .pichaloca.com 2021 | .pichunter.com 2022 | .picnob.com 2023 | .picol.com 2024 | .picsart.com 2025 | .pictoa.com 2026 | .picuki.com 2027 | .pigav.com 2028 | .pimeyes.com 2029 | .pimpandhost.com 2030 | .pinayvlog.com 2031 | .pincong.rocks 2032 | .pinkcherry.com 2033 | .pinnacle.com 2034 | .pinterest.at 2035 | .pinterest.ca 2036 | .pinterest.cl 2037 | .pinterest.co.uk 2038 | .pinterest.com 2039 | .pinterest.com.au 2040 | .pinterest.com.mx 2041 | .pinterest.de 2042 | .pinterest.es 2043 | .pinterest.fr 2044 | .pinterest.ie 2045 | .pinterest.it 2046 | .pinterest.jp 2047 | .pinterest.nz 2048 | .pinterest.ph 2049 | .pinterest.pt 2050 | .pinterest.se 2051 | .pionex.com 2052 | .pisshamster.com 2053 | .pixai.art 2054 | .pixels.com 2055 | .pixiv.net 2056 | .pixiv.org 2057 | .pixlr.com 2058 | .pixnet.net 2059 | .pjmedia.com 2060 | .pjtra.com 2061 | .play-asia.com 2062 | .playboard.co 2063 | .player.fm 2064 | .playgroundai.com 2065 | .plurk.com 2066 | .plus500.com 2067 | .po18.tw 2068 | .podbay.fm 2069 | .podbean.com 2070 | .podcastaddict.com 2071 | .podcastapp.io 2072 | .podchaser.com 2073 | .podtail.com 2074 | .podzone.net 2075 | .poe.com 2076 | .pokerstars.com 2077 | .politicalcompass.org 2078 | .politico.eu 2079 | .politicshome.com 2080 | .poloniex.com 2081 | .poolbinance.com 2082 | .poolin.com 2083 | .poopeegirls.com 2084 | .porn-comic.com 2085 | .porn-hd.xxx 2086 | .porn-plus.com 2087 | .porn.biz 2088 | .porn.com 2089 | .porn00.org 2090 | .porn300.com 2091 | .porn5f.com 2092 | .porn7.xxx 2093 | .porn93.cc 2094 | .pornbb.org 2095 | .pornbl.com 2096 | .pornburst.xxx 2097 | .porndig.com 2098 | .porndish.com 2099 | .porndoe.com 2100 | .porndr.com 2101 | .porndroids.com 2102 | .pornes.xxx 2103 | .pornflip.com 2104 | .porngames.com 2105 | .porngames.games 2106 | .porngameshub.com 2107 | .porngo.com 2108 | .pornhat.com 2109 | .pornhat.tv 2110 | .pornhd.com 2111 | .pornhd8k.net 2112 | .pornhub.com 2113 | .pornhubpremium.com 2114 | .pornicom.com 2115 | .pornid.xxx 2116 | .pornjam.com 2117 | .pornk.top 2118 | .pornkai.com 2119 | .pornkeen.net 2120 | .pornktube.com 2121 | .pornky.com 2122 | .pornlib.com 2123 | .pornlib.icu 2124 | .pornlulu.com 2125 | .pornmate.com 2126 | .pornmd.com 2127 | .pornmeka.com 2128 | .pornmz.com 2129 | .porno-apk.com 2130 | .porno.com 2131 | .porno71.com 2132 | .pornobae.com 2133 | .pornocarioca.com 2134 | .pornodoido.com 2135 | .pornodrome.tv 2136 | .pornogramxxx.com 2137 | .pornohammer.com 2138 | .pornohdv.com 2139 | .pornoheit.com 2140 | .pornoitaliano.com 2141 | .pornokrol.com 2142 | .pornolab.net 2143 | .pornolandia.xxx 2144 | .pornolymp.com 2145 | .pornomineiro.com 2146 | .pornoreino.com 2147 | .pornorop.com 2148 | .pornoxo.com 2149 | .pornozec.com 2150 | .pornozot.com 2151 | .pornpics.com 2152 | .pornsos.com 2153 | .pornspan.com 2154 | .pornstars.tube 2155 | .porntn.com 2156 | .porntop.com 2157 | .porntrex.com 2158 | .porntube.com 2159 | .porntv.com 2160 | .pornv.xxx 2161 | .pornxp.com 2162 | .pornxx.cc 2163 | .pornxxxweb.com 2164 | .porzo.com 2165 | .post.news 2166 | .poststar.com 2167 | .powells.com 2168 | .poyopara.com 2169 | .ppp.porn 2170 | .pravda.rs 2171 | .prcdn.co 2172 | .prendiporno.tv 2173 | .pressenza.com 2174 | .pressreader.com 2175 | .pri.org 2176 | .private.com 2177 | .privateinternetaccess.com 2178 | .probit.com 2179 | .prohashing.com 2180 | .project-syndicate.org 2181 | .projectsegfau.lt 2182 | .proporn.com 2183 | .prospectmagazine.co.uk 2184 | .proton.me 2185 | .protonvpn.com 2186 | .proxyscrape.com 2187 | .proxysite.com 2188 | .proxyswitcher.com 2189 | .pscp.tv 2190 | .psmag.com 2191 | .pstatic.net 2192 | .ptt.cc 2193 | .pttweb.cc 2194 | .punishworld.com 2195 | .purevpn.com 2196 | .pururin.to 2197 | .pussyspace.com 2198 | .pussyspace.net 2199 | .putalocura.com 2200 | .pwetan.com 2201 | .qbittorrent.org 2202 | .qinav.com 2203 | .qingse.one 2204 | .qobuz.com 2205 | .qoo-app.com 2206 | .qorno.com 2207 | .qoto.org 2208 | .quadrinhosdesexo.com 2209 | .quatvn.club 2210 | .quiz-maker.com 2211 | .quora.com 2212 | .quotev.com 2213 | .qwant.com 2214 | .qz.com 2215 | .r34porn.net 2216 | .r38.tv 2217 | .radio-ao-vivo.com 2218 | .radio-en-ligne.fr 2219 | .radio-en-vivo.mx 2220 | .radio-espana.es 2221 | .radio-thai.com 2222 | .radio.co 2223 | .radio.de 2224 | .radio.garden 2225 | .radio.net 2226 | .radioagricultura.cl 2227 | .radioking.com 2228 | .radiopublic.com 2229 | .radios-argentinas.org 2230 | .radiosdelperu.pe 2231 | .raialyoum.com 2232 | .rajwap.biz 2233 | .rakuten.co.jp 2234 | .rakuten.com.tw 2235 | .rapelust.com 2236 | .rarehistoricalphotos.com 2237 | .rarible.com 2238 | .rat.xxx 2239 | .rationalwiki.org 2240 | .ravenminer.com 2241 | .rawgit.com 2242 | .rawstory.com 2243 | .rb.gy 2244 | .rcinet.ca 2245 | .rd.nl 2246 | .realclearmarkets.com 2247 | .realitykings.com 2248 | .reallifecam.com 2249 | .reason.com 2250 | .record-eagle.com 2251 | .recordedfuture.com 2252 | .recurbate.com 2253 | .red-tube.video 2254 | .redbubble.com 2255 | .redd.it 2256 | .reddit.com 2257 | .redditmedia.com 2258 | .redgifs.com 2259 | .rediff.com 2260 | .redirectme.net 2261 | .redmas.com.co 2262 | .redporn.porn 2263 | .redporn.tv 2264 | .redtube.com 2265 | .redtube.net 2266 | .redwap.me 2267 | .redwap3.com 2268 | .reference-sexe.com 2269 | .religionnews.com 2270 | .rent.men 2271 | .rentmen.eu 2272 | .rentry.co 2273 | .republica.com 2274 | .republicworld.com 2275 | .resilio.com 2276 | .restofworld.org 2277 | .reuters.com 2278 | .reutersmedia.net 2279 | .rexxx.org 2280 | .rfa.com 2281 | .rfa.org 2282 | .rferl.org 2283 | .rfi.fr 2284 | .rheinpfalz.de 2285 | .riotimesonline.com 2286 | .riseup.net 2287 | .rnz.co.nz 2288 | .rnz.de 2289 | .roboforex.com 2290 | .rosenheim24.de 2291 | .roshy.tv 2292 | .rou.video 2293 | .rouman5.com 2294 | .routledge.com 2295 | .rowman.com 2296 | .royalbulletin.in 2297 | .rplant.xyz 2298 | .rsf.org 2299 | .rss.com 2300 | .rssing.com 2301 | .rtbf.be 2302 | .rthk.hk 2303 | .rti.org.tw 2304 | .rts.ch 2305 | .rubmaps.ch 2306 | .ruenu.com 2307 | .rule34.us 2308 | .rule34.world 2309 | .rule34.xxx 2310 | .rule34.xyz 2311 | .rule34video.com 2312 | .rumble.com 2313 | .runonflux.io 2314 | .ruten.com.tw 2315 | .rutor.info 2316 | .rutracker.org 2317 | .rutube.ru 2318 | .saatchiart.com 2319 | .sabcnews.com 2320 | .saga-s.co.jp 2321 | .salda.ws 2322 | .saltwire.com 2323 | .sambaporno.com 2324 | .samoporno.com 2325 | .sandiegouniontribune.com 2326 | .sankakucomplex.com 2327 | .sankei.com 2328 | .saradahentai.com 2329 | .saveporn.net 2330 | .savetube.app 2331 | .savetube.io 2332 | .saydalia.net 2333 | .schwaebische.de 2334 | .scmp.com 2335 | .scoop.co.nz 2336 | .scrolller.com 2337 | .seaart.ai 2338 | .search.com 2339 | .searchenginewatch.com 2340 | .secoloditalia.it 2341 | .secretchina.com 2342 | .secrethostess.com 2343 | .secureservercdn.net 2344 | .securityboulevard.com 2345 | .see.xxx 2346 | .seedboxes.cc 2347 | .seegore.com 2348 | .segre.com 2349 | .sehuatang.net 2350 | .sehuatang.org 2351 | .selfip.net 2352 | .selfip.org 2353 | .semafor.com 2354 | .sendspace.com 2355 | .sendvid.com 2356 | .sensortower.com 2357 | .servebbs.com 2358 | .servebeer.com 2359 | .serveftp.com 2360 | .serveirc.com 2361 | .servemp3.com 2362 | .serviporno.com 2363 | .seselah.com 2364 | .setn.com 2365 | .sex.com 2366 | .sex3.com 2367 | .sexalarab.com 2368 | .sexbjcam.com 2369 | .sexcelebrity.net 2370 | .sexetag.com 2371 | .sexfreehd.xxx 2372 | .sexhdtuber.com 2373 | .sexkbj.com 2374 | .sexlikereal.com 2375 | .sexlist.tv 2376 | .sexm.xxx 2377 | .sexmature.xxx 2378 | .sexmex.xxx 2379 | .sexmotarjam.com 2380 | .sexmotors.com 2381 | .sexmovr.com 2382 | .sexpicturespass.com 2383 | .sexsaoy.com 2384 | .sexstories.com 2385 | .sexto.mobi 2386 | .sextop.rocks 2387 | .sextvx.com 2388 | .sexu.com 2389 | .sexvid.xxx 2390 | .sexvideos.host 2391 | .sexyfuckgames.com 2392 | .sfba.social 2393 | .sfmcompile.club 2394 | .shafaqna.com 2395 | .shameless.com 2396 | .shanaproject.com 2397 | .shapeshift.com 2398 | .sharefile.com 2399 | .sharesome.com 2400 | .shemalelisting.com 2401 | .shemalestardb.com 2402 | .shemalestube.com 2403 | .shemaletubevideos.com 2404 | .shemalez.com 2405 | .shesfreaky.com 2406 | .shimotsuke.co.jp 2407 | .shinmai.co.jp 2408 | .shooshtime.com 2409 | .shopee.tw 2410 | .shu.ac.uk 2411 | .shutterstock.com 2412 | .siasat.com 2413 | .sigmapool.com 2414 | .signal.org 2415 | .sikwap.mobi 2416 | .simonandschuster.com 2417 | .simply-hentai.com 2418 | .sina.com.hk 2419 | .sinchew.com.my 2420 | .singlelogin.re 2421 | .singtao.ca 2422 | .siouxcityjournal.com 2423 | .sis001.com 2424 | .siteget.net 2425 | .skoutapis.com 2426 | .skynews.com.au 2427 | .slate.com 2428 | .slides.com 2429 | .slideshare.net 2430 | .sltrib.com 2431 | .slushpool.com 2432 | .smallwarsjournal.com 2433 | .smartnews.be 2434 | .smartproxy.com 2435 | .smashwords.com 2436 | .smh.com.au 2437 | .smutr.com 2438 | .smutty.com 2439 | .snapinsta.io 2440 | .snappea.com 2441 | .snapsave.io 2442 | .snaptubeapp.com 2443 | .snl.no 2444 | .soas.ac.uk 2445 | .socialblade.com 2446 | .socialmediagirls.com 2447 | .sokmil.com 2448 | .solana.com 2449 | .solidtorrents.to 2450 | .solopornoitaliani.xxx 2451 | .somee.com 2452 | .songfacts.com 2453 | .sopornvideos.com 2454 | .sorkab.com 2455 | .sotwe.com 2456 | .soundcloud.com 2457 | .soundon.fm 2458 | .sourcingjournal.com 2459 | .south-plus.net 2460 | .spankbang.com 2461 | .spankbang.party 2462 | .spankingtube.com 2463 | .speakerdeck.com 2464 | .spectator.co.uk 2465 | .spectator.org 2466 | .spectrumlocalnews.com 2467 | .spectrumnews1.com 2468 | .spideroak.com 2469 | .spiegel.de 2470 | .spieletipps.de 2471 | .spokesman.com 2472 | .spreaker.com 2473 | .spreee.pro 2474 | .srf.ch 2475 | .ssrn.com 2476 | .stablediffusionweb.com 2477 | .stackpathcdn.com 2478 | .stafaband-76.com 2479 | .stamfordadvocate.com 2480 | .standard.co.uk 2481 | .stansberryresearch.com 2482 | .star.com.tr 2483 | .startpage.com 2484 | .startribune.com 2485 | .status.im 2486 | .stboy.net 2487 | .steamcommunity.com 2488 | .steemit.com 2489 | .stellar.org 2490 | .stitcher.com 2491 | .stocking-tease.com 2492 | .storenvy.com 2493 | .storiesonline.net 2494 | .storify.com 2495 | .storj.io 2496 | .storm.mg 2497 | .straight.com 2498 | .straitstimes.com 2499 | .strangled.net 2500 | .streamable.com 2501 | .streamate.com 2502 | .streetinsider.com 2503 | .stripchat.com 2504 | .stripes.com 2505 | .stufferdb.com 2506 | .stylecaster.com 2507 | .subsplash.com 2508 | .substack.com 2509 | .sueddeutsche.de 2510 | .suedostschweiz.ch 2511 | .summertimesaga.com 2512 | .sumosear.ch 2513 | .sundaypost.com 2514 | .sunjournal.com 2515 | .sunporno.com 2516 | .superrare.com 2517 | .supjav.com 2518 | .sur.ly 2519 | .surfeasy.com 2520 | .surfshark.com 2521 | .suruga-ya.com 2522 | .surveycake.com 2523 | .swag.live 2524 | .swarajyamag.com 2525 | .sweetgat.com 2526 | .swissinfo.ch 2527 | .swr.de 2528 | .sxyprn.com 2529 | .syosetu.com 2530 | .t66y.com 2531 | .taaze.tw 2532 | .tabletmag.com 2533 | .tabootube.xxx 2534 | .taboovideos.tv 2535 | .tagesschau.de 2536 | .taiav.com 2537 | .taimi.com 2538 | .taipeitimes.com 2539 | .taiwannews.com.tw 2540 | .talkmarkets.com 2541 | .talkwithstranger.com 2542 | .tamilxxx.top 2543 | .tango.me 2544 | .tapatalk.com 2545 | .tapinto.net 2546 | .tasexy.com 2547 | .tdgall.com 2548 | .teamskeet.com 2549 | .teatroporno.com 2550 | .tech.lgbt 2551 | .teenpornvideo.me 2552 | .tehrantimes.com 2553 | .telegra.ph 2554 | .telegram.org 2555 | .telemetr.io 2556 | .telesurenglish.net 2557 | .tellerreport.com 2558 | .tenor.com 2559 | .terk.nl 2560 | .tescort.com 2561 | .testedefudelidade.com 2562 | .textnow.me 2563 | .tf1info.fr 2564 | .tgstat.com 2565 | .tgtube.com 2566 | .the-american-interest.com 2567 | .theage.com.au 2568 | .theartnewspaper.com 2569 | .theatlantic.com 2570 | .theb.ai 2571 | .theblaze.com 2572 | .thebulwark.com 2573 | .thecitizen.co.tz 2574 | .theconservativetreehouse.com 2575 | .theconversation.com 2576 | .thediplomat.com 2577 | .thedispatch.com 2578 | .theepochtimes.com 2579 | .thefappening.pro 2580 | .thefederalist.com 2581 | .thefreelibrary.com 2582 | .thegay.com 2583 | .theglobeandmail.com 2584 | .theguardian.com 2585 | .thehansindia.com 2586 | .thehentai.net 2587 | .thehentaiworld.com 2588 | .thehimalayantimes.com 2589 | .thehindu.com 2590 | .thehour.com 2591 | .thehun.net 2592 | .theintercept.com 2593 | .thejakartapost.com 2594 | .thelallantop.com 2595 | .thenationalpulse.com 2596 | .thenewamerican.com 2597 | .thenewslens.com 2598 | .thepiratebay.org 2599 | .theporndude.com 2600 | .theprint.in 2601 | .theprovince.com 2602 | .thepublicdiscourse.com 2603 | .theqoo.net 2604 | .thequint.com 2605 | .therecord.com 2606 | .thespec.com 2607 | .thestandard.com.hk 2608 | .thestar.com 2609 | .thestatesman.com 2610 | .thesundaily.my 2611 | .thetatoken.org 2612 | .thetvdb.com 2613 | .theweek.co.uk 2614 | .theweek.com 2615 | .theweek.in 2616 | .thewire.in 2617 | .theworld.org 2618 | .theworldnews.net 2619 | .theyarehuge.com 2620 | .theync.com 2621 | .theyworkforyou.com 2622 | .thisav.com 2623 | .thisvid.com 2624 | .thothub.to 2625 | .threadreaderapp.com 2626 | .threads.net 2627 | .thrillist.com 2628 | .thumbzilla.com 2629 | .tiava.com 2630 | .tickmill.com 2631 | .tikmate.online 2632 | .tiktok.com 2633 | .tiktokv.com 2634 | .time.com 2635 | .timesnowhindi.com 2636 | .timesnownews.com 2637 | .timesofoman.com 2638 | .timetoast.com 2639 | .timeweb.com 2640 | .tineye.com 2641 | .tiny.cc 2642 | .tirto.id 2643 | .titsintops.com 2644 | .tizam.pw 2645 | .tjournal.ru 2646 | .tkj.jp 2647 | .tktube.com 2648 | .tnaflix.com 2649 | .todayonline.com 2650 | .togetter.com 2651 | .tokyo-np.co.jp 2652 | .tokyotosho.info 2653 | .tomp3.cc 2654 | .tonicmovies.com 2655 | .toomics.com 2656 | .top10vpn.com 2657 | .toplist.cz 2658 | .toptoon.net 2659 | .topvpn.cc 2660 | .tor.us 2661 | .torlock2.com 2662 | .torontopubliclibrary.ca 2663 | .torproject.org 2664 | .torrentdownloads.pro 2665 | .torrentfunk.com 2666 | .torrentgalaxy.to 2667 | .torrentleech.org 2668 | .torrentz2.nz 2669 | .tortoisesvn.net 2670 | .totok.ai 2671 | .totoleak.com 2672 | .touchvpn.net 2673 | .tower.jp 2674 | .tporn.xxx 2675 | .tpr.org 2676 | .trading212.com 2677 | .tradingview.com 2678 | .trannytube.tv 2679 | .transparency.org 2680 | .trashbox.ru 2681 | .trendsmap.com 2682 | .trezor.io 2683 | .tribuneindia.com 2684 | .tron.network 2685 | .tronlink.org 2686 | .trouw.nl 2687 | .trt.net.tr 2688 | .trtworld.com 2689 | .trustpool.ru 2690 | .trustwallet.com 2691 | .truthout.org 2692 | .truthsocial.com 2693 | .truyen-hentai.com 2694 | .ts-dating.com 2695 | .ts4rent.eu 2696 | .tsescorts.com 2697 | .tsumino.com 2698 | .tubator.com 2699 | .tube8.com 2700 | .tube8.es 2701 | .tube8.fr 2702 | .tubebdsm.com 2703 | .tubedupe.com 2704 | .tubegalore.com 2705 | .tubepornclassic.com 2706 | .tubepornstars.com 2707 | .tuberipper.com 2708 | .tubesafari.com 2709 | .tubev.sex 2710 | .tubevideoshd.xxx 2711 | .tubewolf.com 2712 | .tubi.io 2713 | .tucson.com 2714 | .tukif.com 2715 | .tumbex.com 2716 | .tumblr.com 2717 | .tunnelbear.com 2718 | .turbobit.net 2719 | .turboimagehost.com 2720 | .tushy.com 2721 | .tv9hindi.com 2722 | .tvboxnow.com 2723 | .twhentai.com 2724 | .twicsy.com 2725 | .twinkmovies.xxx 2726 | .twinkpornvideos.xxx 2727 | .twinkvideos.com 2728 | .twitch.tv 2729 | .twitlonger.com 2730 | .twitpic.com 2731 | .twitter.com 2732 | .twstalker.com 2733 | .txxx.com 2734 | .tybito.com 2735 | .typeset.io 2736 | .typora.io 2737 | .tysol.pl 2738 | .ucanews.com 2739 | .udn.com 2740 | .uiporn.com 2741 | .ujizz.xxx 2742 | .ukpunting.com 2743 | .ulifestyle.com.hk 2744 | .ultimedia.com 2745 | .ultrasurfing.com 2746 | .under9.co 2747 | .underhentai.net 2748 | .unherd.com 2749 | .uniondht.org 2750 | .uniswap.org 2751 | .unmineable.com 2752 | .upbit.com 2753 | .upday.com 2754 | .upi.com 2755 | .upmedia.mg 2756 | .upornia.com 2757 | .upornia.tube 2758 | .upskirt.tv 2759 | .uptodown.com 2760 | .urban-vpn.com 2761 | .urbandictionary.com 2762 | .urgayporn.com 2763 | .urlebird.com 2764 | .useraudio.net 2765 | .ustream.tv 2766 | .utorrent.com 2767 | .uvpn.me 2768 | .v2ex.com 2769 | .v2ph.com 2770 | .valeursactuelles.com 2771 | .valleycentral.com 2772 | .vancouverisawesome.com 2773 | .vaneck.com 2774 | .vanityfair.fr 2775 | .vantagemarkets.com 2776 | .vaticannews.va 2777 | .veepn.com 2778 | .vercel.app 2779 | .vercomicsporno.xxx 2780 | .verdict.co.uk 2781 | .veritaspress.com 2782 | .verkkouutiset.fi 2783 | .viabtc.com 2784 | .viber.com 2785 | .vid.me 2786 | .video-to-mp3-converter.com 2787 | .videoindirxa.net 2788 | .videomon.biz 2789 | .videopress.com 2790 | .videosdemadurasx.com 2791 | .videosxgays.com 2792 | .vidoevo.com 2793 | .vidoza.net 2794 | .vikiporn.com 2795 | .vimeo.com 2796 | .vine.co 2797 | .violetmovies.com 2798 | .vip4k.com 2799 | .viptube.com 2800 | .vivaldi.com 2801 | .vivatube.com 2802 | .viviporn.tv 2803 | .vixen.com 2804 | .vjav.com 2805 | .voachinese.com 2806 | .voanews.com 2807 | .vocaroo.com 2808 | .vocativ.com 2809 | .vocus.cc 2810 | .voi.id 2811 | .voice.ai 2812 | .voilaporno.com 2813 | .voissa.com 2814 | .volkskrant.nl 2815 | .volksstimme.de 2816 | .vox.com 2817 | .voxer.com 2818 | .voy.com 2819 | .voyeur-house.tv 2820 | .voyeurhit.com 2821 | .voyeurhit.tube 2822 | .voyeurweb.com 2823 | .vpngate.net 2824 | .vpngate2.jp 2825 | .vpnjantit.com 2826 | .vpnmentor.com 2827 | .vpro.nl 2828 | .vrporn.com 2829 | .vuze.com 2830 | .vxxx.com 2831 | .vyprvpn.com 2832 | .walletconnect.com 2833 | .wallhaven.cc 2834 | .walls.io 2835 | .wamc.org 2836 | .wamu.org 2837 | .wane.com 2838 | .wantgoo.com 2839 | .wapbold.com 2840 | .warontherocks.com 2841 | .washingtonexaminer.com 2842 | .washingtonpost.com 2843 | .washingtontimes.com 2844 | .watchersweb.com 2845 | .watchpeopledie.tv 2846 | .wate.com 2847 | .waterstones.com 2848 | .watoday.com.au 2849 | .wattpad.com 2850 | .wav.tv 2851 | .wavy.com 2852 | .waybig.com 2853 | .wbaltv.com 2854 | .wbir.com 2855 | .wbur.org 2856 | .wcnc.com 2857 | .wearegreenbay.com 2858 | .wearethemighty.com 2859 | .weav.xyz 2860 | .webhop.biz 2861 | .webhop.info 2862 | .webhop.org 2863 | .webindia123.com 2864 | .webshare.io 2865 | .weeklystandard.com 2866 | .welt.de 2867 | .weltwoche.ch 2868 | .wenxuecity.com 2869 | .wesa.fm 2870 | .weser-kurier.de 2871 | .westfalen-blatt.de 2872 | .wfaa.com 2873 | .wftv.com 2874 | .wgal.com 2875 | .wgno.com 2876 | .wgnradio.com 2877 | .wgrz.com 2878 | .whas11.com 2879 | .whatsapp.com 2880 | .whatsapp.net 2881 | .whec.com 2882 | .whio.com 2883 | .whisper.sh 2884 | .whnt.com 2885 | .whoer.net 2886 | .whoreshub.com 2887 | .wiesbadener-kurier.de 2888 | .wiki2.org 2889 | .wikileaks.org 2890 | .wikimapia.org 2891 | .wikipedia.com 2892 | .wikipedia.org 2893 | .wikiwand.com 2894 | .wilsoncenter.org 2895 | .windscribe.com 2896 | .windsorstar.com 2897 | .winnipegsun.com 2898 | .winporn.com 2899 | .wionews.com 2900 | .wire.com 2901 | .wireguard.com 2902 | .wishtv.com 2903 | .wisn.com 2904 | .wixsite.com 2905 | .wizcase.com 2906 | .wjhl.com 2907 | .wjtv.com 2908 | .wkbn.com 2909 | .wkrg.com 2910 | .wkrn.com 2911 | .wkyc.com 2912 | .wlky.com 2913 | .wlns.com 2914 | .wlrn.org 2915 | .wltx.com 2916 | .wlvpn.com 2917 | .wmflabs.org 2918 | .wnacg.com 2919 | .wnep.com 2920 | .wng.org 2921 | .womananimalporn.cyou 2922 | .woo.org 2923 | .woodtv.com 2924 | .woolypooly.com 2925 | .workers.dev 2926 | .world-today-news.com 2927 | .worldcat.org 2928 | .worldcrunch.com 2929 | .worldjournal.com 2930 | .worldpoliticsreview.com 2931 | .worldpopulationreview.com 2932 | .worldsex.com 2933 | .worldtribune.com 2934 | .wowktv.com 2935 | .wpbf.com 2936 | .wpr.org 2937 | .wpri.com 2938 | .wqad.com 2939 | .wral.com 2940 | .wreg.com 2941 | .wric.com 2942 | .write.as 2943 | .wsav.com 2944 | .wsbradio.com 2945 | .wsbtv.com 2946 | .wsj.com 2947 | .wsj.net 2948 | .wsoctv.com 2949 | .wsvn.com 2950 | .wsws.org 2951 | .wtfast.com 2952 | .wthr.com 2953 | .wtnh.com 2954 | .wtol.com 2955 | .wtop.com 2956 | .wtsp.com 2957 | .wtvm.com 2958 | .wunc.org 2959 | .wusa9.com 2960 | .wuso.me 2961 | .wvtm13.com 2962 | .wwlp.com 2963 | .wwltv.com 2964 | .wwwxxx.uno 2965 | .wzzm13.com 2966 | .x-n-x-x.pro 2967 | .x-xx.pro 2968 | .x2download.app 2969 | .x2download.com 2970 | .x2mate.com 2971 | .x3vid.com 2972 | .xanimu.com 2973 | .xarabvideos.com 2974 | .xasiat.com 2975 | .xbabe.com 2976 | .xbiz.com 2977 | .xbooru.com 2978 | .xcafe.com 2979 | .xchina.co 2980 | .xcity.jp 2981 | .xcream.net 2982 | .xcum.com 2983 | .xecce.com 2984 | .xerotica.com 2985 | .xfantazy.com 2986 | .xfree.com 2987 | .xfreehd.com 2988 | .xhamster.com 2989 | .xhamster19.com 2990 | .xhamsterlive.com 2991 | .xlovecam.com 2992 | .xm.com 2993 | .xmegadrive.com 2994 | .xmoviesforyou.com 2995 | .xmtrading.com 2996 | .xn--h-k9tybb8g5ivhkczry701afhpm4sru6d.net 2997 | .xn--r1a.website 2998 | .xnalgas.com 2999 | .xnxx.com 3000 | .xnxx.gold 3001 | .xnxx.tv 3002 | .xnxx.xxx 3003 | .xnxx2.com 3004 | .xnxx2.org 3005 | .xnxx3.com 3006 | .xnxxx.rocks 3007 | .xorgasmo.com 3008 | .xossipy.com 3009 | .xozilla.com 3010 | .xpaja.net 3011 | .xpee.com 3012 | .xrares.com 3013 | .xredwap.com 3014 | .xsijishe.com 3015 | .xsxx.org 3016 | .xsz-av.com 3017 | .xt.com 3018 | .xtapes.to 3019 | .xtb.com 3020 | .xteensex.net 3021 | .xtits.com 3022 | .xv-horezeedipaif.com 3023 | .xvds.tv 3024 | .xvideo.tube 3025 | .xvideos-hd.blog 3026 | .xvideos-xxxx.com 3027 | .xvideos.blog 3028 | .xvideos.com 3029 | .xvideos.es 3030 | .xvideos.net 3031 | .xvideos.red 3032 | .xvideos2.com 3033 | .xvideos3.com 3034 | .xvideos4.com 3035 | .xvideos5.com 3036 | .xvidzz.com 3037 | .xvpn.io 3038 | .xxbrits.com 3039 | .xxvideos.video 3040 | .xxx-sex.one 3041 | .xxx.com 3042 | .xxxbunker.com 3043 | .xxxdan.com 3044 | .xxxdessert.com 3045 | .xxxfree.watch 3046 | .xxxlucah.com 3047 | .xxxpornxxx.net 3048 | .xxxsexzoo.com 3049 | .xxxtik.com 3050 | .xxxtophd.com 3051 | .xxxtube2022.com 3052 | .xxxtubezoo.com 3053 | .xxxvideohd.net 3054 | .xxxvideor.com 3055 | .xxxvideos247.com 3056 | .xxxvideoszoo.com 3057 | .xxxvids.tv 3058 | .xxxxvideo.uno 3059 | .xyzcomics.com 3060 | .y2mate.com 3061 | .y2meta.com 3062 | .yadi.sk 3063 | .yadongpang.net 3064 | .yadongshow.org 3065 | .yande.re 3066 | .yasetube.com 3067 | .yazhouse8.com 3068 | .yenisafak.com 3069 | .yeptube.com 3070 | .yes123.com.tw 3071 | .yesasia.com 3072 | .yespornfree.com 3073 | .yespornpleasexxx.com 3074 | .yewtu.be 3075 | .ylilauta.org 3076 | .ymate.app 3077 | .yobit.net 3078 | .yodayo.com 3079 | .yodobashi.com 3080 | .yomiuri.co.jp 3081 | .yopmail.com 3082 | .you-porn.com 3083 | .you.com 3084 | .youcaring.com 3085 | .youjizz.com 3086 | .youmaker.com 3087 | .youngsexer.com 3088 | .youporn.com 3089 | .youporndeutsch.xyz 3090 | .youravhost.net 3091 | .yourbittorrent.com 3092 | .yourlust.com 3093 | .yourtango.com 3094 | .yourvpnservice.com 3095 | .yout.com 3096 | .youteenporn.net 3097 | .youtube-nocookie.com 3098 | .youtube.com 3099 | .youtube4kdownloader.com 3100 | .youversion.com 3101 | .youversionapi.com 3102 | .youx.xxx 3103 | .yt1s.com 3104 | .yt5s.com 3105 | .yt5s.io 3106 | .ytmp3.cc 3107 | .ytmp3.mobi 3108 | .ytmp3cut.com 3109 | .yts.mx 3110 | .z-lib.io 3111 | .z.cash 3112 | .zakzak.co.jp 3113 | .zaloapp.com 3114 | .zbporn.com 3115 | .zdf.de 3116 | .zeczec.com 3117 | .zello.com 3118 | .zenmate.com 3119 | .zenvpn.net 3120 | .zergpool.com 3121 | .zerion.io 3122 | .zerohedge.com 3123 | .ziyouforever.com 3124 | .zlibrary-africa.se 3125 | .zlibrary-asia.se 3126 | .zlibrary-global.se 3127 | .zmescience.com 3128 | .zodgame.xyz 3129 | .zona-lagu.net 3130 | .zoo-tube8.com 3131 | .zoo-xnxx.com 3132 | .zoosex.cc 3133 | .zoosk.com 3134 | .zooskoolvideos.com 3135 | .zootube1.com 3136 | .zoox18.com 3137 | .zooyouporn.com 3138 | .zoozhamster.com 3139 | .zozovideo.com 3140 | .zpool.ca 3141 | .zurichna.com 3142 | .zxxx.me 3143 | .zyxel.com 3144 | .zztt15.com 3145 | .zzztube.com 3146 | 3147 | # The following are domains that are not polluted but still recommended to proxy for various reasons. 3148 | .ncbtech.cn 3149 | .bignox.com 3150 | .iproyal.cn 3151 | .weather.com 3152 | .weatherfx.com 3153 | -------------------------------------------------------------------------------- /source/reserved_cidr.txt: -------------------------------------------------------------------------------- 1 | #@IPCIDR 2 | 0.0.0.0/8 3 | 10.0.0.0/8 4 | 100.64.0.0/10 5 | 127.0.0.0/8 6 | 169.254.0.0/16 7 | 172.16.0.0/12 8 | 192.0.0.0/24 9 | 192.0.2.0/24 10 | 192.88.99.0/24 11 | 192.168.0.0/16 12 | 198.51.100.0/24 13 | 203.0.113.0/24 14 | 224.0.0.0/4 15 | 233.252.0.0/24 16 | 240.0.0.0/4 17 | 255.255.255.255/32 18 | 19 | ::/128 20 | ::1/128 21 | ::ffff:0:0/96 22 | 100::/64 23 | 64:ff9b::/96 24 | 2001::/32 25 | 2001:10::/28 26 | 2001:20::/28 27 | 2001:db8::/32 28 | 2002::/16 29 | fc00::/7 30 | fe80::/10 31 | ff00::/8 32 | -------------------------------------------------------------------------------- /source/steam.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .s.team 3 | .steam-api.com 4 | .steam-chat.com 5 | .steamcommunity.com 6 | .steamcontent.com 7 | .steampowered.com 8 | .steamserver.net 9 | .steamstatic.com 10 | .steamusercontent.com 11 | .steamgames.com 12 | -------------------------------------------------------------------------------- /source/wechat.txt: -------------------------------------------------------------------------------- 1 | #@Combined 2 | DOMAIN,dl.wechat.com 3 | DOMAIN,sgshort.wechat.com 4 | DOMAIN,sglong.wechat.com 5 | DOMAIN,sgquic.wechat.com 6 | DOMAIN,sgreport.wechat.com 7 | DOMAIN,sgminorshort.wechat.com 8 | DOMAIN,hkshort.wechat.com 9 | DOMAIN,hklong.wechat.com 10 | DOMAIN,tencentmap.wechat.com 11 | DOMAIN,dns.weixin.qq.com 12 | DOMAIN,paydns.wechat.com 13 | DOMAIN,safety.wechat.com 14 | DOMAIN,security.wechat.com 15 | DOMAIN-SUFFIX,hk.wechat.com 16 | DOMAIN-SUFFIX,pay.wechat.com 17 | 18 | IP-CIDR,43.128.0.0/15,no-resolve 19 | IP-CIDR,43.130.0.0/16,no-resolve 20 | IP-CIDR,43.131.0.0/17,no-resolve 21 | IP-CIDR,43.131.128.0/19,no-resolve 22 | IP-CIDR,43.131.192.0/18,no-resolve 23 | IP-CIDR,43.132.0.0/18,no-resolve 24 | IP-CIDR,43.132.64.0/22,no-resolve 25 | IP-CIDR,43.132.68.0/24,no-resolve 26 | IP-CIDR,43.132.69.0/24,no-resolve 27 | IP-CIDR,43.132.70.0/23,no-resolve 28 | IP-CIDR,43.132.70.0/23,no-resolve 29 | IP-CIDR,43.132.72.0/21,no-resolve 30 | IP-CIDR,43.132.80.0/20,no-resolve 31 | IP-CIDR,43.132.85.0/24,no-resolve 32 | IP-CIDR,43.132.96.0/19,no-resolve 33 | IP-CIDR,43.132.128.0/17,no-resolve 34 | IP-CIDR,43.133.0.0/16,no-resolve 35 | IP-CIDR,43.134.0.0/16,no-resolve 36 | IP-CIDR,43.135.0.0/17,no-resolve 37 | IP-CIDR,43.135.128.0/18,no-resolve 38 | IP-CIDR,43.135.192.0/19,no-resolve 39 | IP-CIDR,43.152.0.0/22,no-resolve 40 | IP-CIDR,43.152.5.0/24,no-resolve 41 | IP-CIDR,43.152.6.0/23,no-resolve 42 | IP-CIDR,43.152.8.0/24,no-resolve 43 | IP-CIDR,43.152.10.0/23,no-resolve 44 | IP-CIDR,43.152.12.0/22,no-resolve 45 | IP-CIDR,43.152.17.0/24,no-resolve 46 | IP-CIDR,43.152.18.0/23,no-resolve 47 | IP-CIDR,43.152.20.0/22,no-resolve 48 | IP-CIDR,43.152.24.0/22,no-resolve 49 | IP-CIDR,43.152.28.0/23,no-resolve 50 | IP-CIDR,43.152.31.0/24,no-resolve 51 | IP-CIDR,43.152.32.0/23,no-resolve 52 | IP-CIDR,43.152.35.0/24,no-resolve 53 | IP-CIDR,43.152.36.0/23,no-resolve 54 | IP-CIDR,43.152.40.0/24,no-resolve 55 | IP-CIDR,43.152.42.0/23,no-resolve 56 | IP-CIDR,43.152.44.0/23,no-resolve 57 | IP-CIDR,43.152.47.0/24,no-resolve 58 | IP-CIDR,43.152.49.0/24,no-resolve 59 | IP-CIDR,43.152.50.0/23,no-resolve 60 | IP-CIDR,43.152.52.0/22,no-resolve 61 | IP-CIDR,43.152.56.0/21,no-resolve 62 | IP-CIDR,43.152.64.0/19,no-resolve 63 | IP-CIDR,43.152.96.0/20,no-resolve 64 | IP-CIDR,43.152.112.0/22,no-resolve 65 | IP-CIDR,43.152.128.0/23,no-resolve 66 | IP-CIDR,43.152.130.0/24,no-resolve 67 | IP-CIDR,43.152.134.0/23,no-resolve 68 | IP-CIDR,43.152.136.0/22,no-resolve 69 | IP-CIDR,43.152.140.0/24,no-resolve 70 | IP-CIDR,43.152.142.0/23,no-resolve 71 | IP-CIDR,43.152.144.0/24,no-resolve 72 | IP-CIDR,43.152.146.0/23,no-resolve 73 | IP-CIDR,43.152.148.0/23,no-resolve 74 | IP-CIDR,43.152.151.0/24,no-resolve 75 | IP-CIDR,43.152.152.0/24,no-resolve 76 | IP-CIDR,43.152.154.0/23,no-resolve 77 | IP-CIDR,43.152.156.0/22,no-resolve 78 | IP-CIDR,43.152.160.0/23,no-resolve 79 | IP-CIDR,43.152.162.0/24,no-resolve 80 | IP-CIDR,43.152.168.0/23,no-resolve 81 | IP-CIDR,43.152.182.0/23,no-resolve 82 | IP-CIDR,43.152.184.0/23,no-resolve 83 | IP-CIDR,43.152.186.0/24,no-resolve 84 | IP-CIDR,43.152.188.0/24,no-resolve 85 | IP-CIDR,43.152.192.0/18,no-resolve 86 | IP-CIDR,43.153.0.0/16,no-resolve 87 | IP-CIDR,43.154.0.0/15,no-resolve 88 | IP-CIDR,43.156.0.0/15,no-resolve 89 | IP-CIDR,43.158.0.0/16,no-resolve 90 | IP-CIDR,43.159.0.0/18,no-resolve 91 | IP-CIDR,43.159.64.0/24,no-resolve 92 | IP-CIDR,43.159.74.0/24,no-resolve 93 | IP-CIDR,43.159.77.0/24,no-resolve 94 | IP-CIDR,43.159.78.0/23,no-resolve 95 | IP-CIDR,43.159.81.0/24,no-resolve 96 | IP-CIDR,43.159.82.0/23,no-resolve 97 | IP-CIDR,43.159.84.0/23,no-resolve 98 | IP-CIDR,43.159.90.0/23,no-resolve 99 | IP-CIDR,43.159.90.0/24,no-resolve 100 | IP-CIDR,43.159.93.0/24,no-resolve 101 | IP-CIDR,43.159.94.0/23,no-resolve 102 | IP-CIDR,43.159.96.0/22,no-resolve 103 | IP-CIDR,43.159.100.0/24,no-resolve 104 | IP-CIDR,43.159.102.0/23,no-resolve 105 | IP-CIDR,43.159.104.0/21,no-resolve 106 | IP-CIDR,43.159.112.0/21,no-resolve 107 | IP-CIDR,43.159.120.0/22,no-resolve 108 | IP-CIDR,43.159.125.0/24,no-resolve 109 | IP-CIDR,43.159.126.0/23,no-resolve 110 | IP-CIDR,43.159.128.0/17,no-resolve 111 | IP-CIDR,43.160.0.0/15,no-resolve 112 | IP-CIDR,43.162.0.0/16,no-resolve 113 | IP-CIDR,43.163.192.0/18,no-resolve 114 | IP-CIDR,43.172.15.0/24,no-resolve 115 | IP-CIDR,43.175.12.0/24,no-resolve 116 | IP-CIDR,43.175.16.0/22,no-resolve 117 | IP-CIDR,43.175.16.0/22,no-resolve 118 | IP-CIDR,43.175.22.0/24,no-resolve 119 | IP-CIDR,43.175.24.0/23,no-resolve 120 | IP-CIDR,43.175.28.0/23,no-resolve 121 | IP-CIDR,43.175.30.0/24,no-resolve 122 | IP-CIDR,43.175.33.0/24,no-resolve 123 | IP-CIDR,43.175.45.0/24,no-resolve 124 | IP-CIDR,43.175.46.0/23,no-resolve 125 | IP-CIDR,43.175.48.0/23,no-resolve 126 | IP-CIDR,43.175.50.0/24,no-resolve 127 | IP-CIDR,43.175.52.0/23,no-resolve 128 | IP-CIDR,43.175.54.0/24,no-resolve 129 | IP-CIDR,43.175.60.0/24,no-resolve 130 | IP-CIDR,43.175.66.0/23,no-resolve 131 | IP-CIDR,43.175.71.0/24,no-resolve 132 | IP-CIDR,43.175.75.0/24,no-resolve 133 | IP-CIDR,43.175.224.0/23,no-resolve 134 | IP-CIDR,43.175.230.0/23,no-resolve 135 | IP-CIDR,43.175.236.0/23,no-resolve 136 | IP-CIDR,45.113.68.0/22,no-resolve 137 | IP-CIDR,45.146.112.0/23,no-resolve 138 | IP-CIDR,49.51.0.0/19,no-resolve 139 | IP-CIDR,49.51.32.0/20,no-resolve 140 | IP-CIDR,49.51.48.0/21,no-resolve 141 | IP-CIDR,49.51.62.0/23,no-resolve 142 | IP-CIDR,49.51.64.0/19,no-resolve 143 | IP-CIDR,49.51.96.0/21,no-resolve 144 | IP-CIDR,49.51.104.0/22,no-resolve 145 | IP-CIDR,49.51.108.0/23,no-resolve 146 | IP-CIDR,49.51.128.0/18,no-resolve 147 | IP-CIDR,49.51.192.0/19,no-resolve 148 | IP-CIDR,49.51.224.0/23,no-resolve 149 | IP-CIDR,49.51.228.0/22,no-resolve 150 | IP-CIDR,49.51.232.0/21,no-resolve 151 | IP-CIDR,49.51.240.0/20,no-resolve 152 | IP-CIDR,101.32.0.0/16,no-resolve 153 | IP-CIDR,101.33.0.0/23,no-resolve 154 | IP-CIDR,101.33.2.0/23,no-resolve 155 | IP-CIDR,101.33.4.0/23,no-resolve 156 | IP-CIDR,101.33.6.0/23,no-resolve 157 | IP-CIDR,101.33.8.0/23,no-resolve 158 | IP-CIDR,101.33.10.0/23,no-resolve 159 | IP-CIDR,101.33.12.0/22,no-resolve 160 | IP-CIDR,101.33.14.0/23,no-resolve 161 | IP-CIDR,101.33.16.0/23,no-resolve 162 | IP-CIDR,101.33.17.0/24,no-resolve 163 | IP-CIDR,101.33.18.0/23,no-resolve 164 | IP-CIDR,101.33.20.0/22,no-resolve 165 | IP-CIDR,101.33.24.0/22,no-resolve 166 | IP-CIDR,101.33.24.0/23,no-resolve 167 | IP-CIDR,101.33.28.0/23,no-resolve 168 | IP-CIDR,101.33.30.0/23,no-resolve 169 | IP-CIDR,101.33.32.0/19,no-resolve 170 | IP-CIDR,101.33.64.0/18,no-resolve 171 | IP-CIDR,103.52.216.0/22,no-resolve 172 | IP-CIDR,124.156.0.0/16,no-resolve 173 | IP-CIDR,129.226.0.0/16,no-resolve 174 | IP-CIDR,150.109.0.0/16,no-resolve 175 | IP-CIDR,162.62.0.0/17,no-resolve 176 | IP-CIDR,162.62.128.0/18,no-resolve 177 | IP-CIDR,162.62.192.0/19,no-resolve 178 | IP-CIDR,162.62.224.0/20,no-resolve 179 | IP-CIDR,170.106.0.0/16,no-resolve 180 | 181 | IP-CIDR6,240d:c000:1000::/36,no-resolve 182 | IP-CIDR6,240d:c000:2000::/35,no-resolve 183 | IP-CIDR6,240d:c000:6000::/36,no-resolve 184 | IP-CIDR6,240d:c010::/47,no-resolve 185 | IP-CIDR6,240d:c010:13::/48,no-resolve 186 | IP-CIDR6,240d:c010:14::/47,no-resolve 187 | IP-CIDR6,240d:c010:16::/48,no-resolve 188 | IP-CIDR6,240d:c010:18::/46,no-resolve 189 | IP-CIDR6,240d:c010:1d::/48,no-resolve 190 | IP-CIDR6,240d:c010:1f::/48,no-resolve 191 | IP-CIDR6,240d:c010:20::/44,no-resolve 192 | IP-CIDR6,240d:c010:30::/47,no-resolve 193 | IP-CIDR6,240d:c010:41::/48,no-resolve 194 | IP-CIDR6,240d:c010:42::/48,no-resolve 195 | IP-CIDR6,240d:c010:54::/46,no-resolve 196 | IP-CIDR6,240d:c010:58::/46,no-resolve 197 | IP-CIDR6,240d:c010:5c::/48,no-resolve 198 | IP-CIDR6,240d:c010:5e::/48,no-resolve 199 | IP-CIDR6,240d:c010:64::/48,no-resolve 200 | IP-CIDR6,240d:c010:68::/47,no-resolve 201 | IP-CIDR6,240d:c010:6c::/48,no-resolve 202 | IP-CIDR6,240d:c010:6f::/48,no-resolve 203 | IP-CIDR6,240d:c010:72::/48,no-resolve 204 | IP-CIDR6,240d:c010:74::/46,no-resolve 205 | IP-CIDR6,240d:c010:78::/48,no-resolve 206 | IP-CIDR6,240d:c010:7b::/48,no-resolve 207 | IP-CIDR6,240d:c010:7c::/47,no-resolve 208 | IP-CIDR6,240d:c010:81::/48,no-resolve 209 | IP-CIDR6,240d:c010:82::/47,no-resolve 210 | IP-CIDR6,240d:c010:84::/47,no-resolve 211 | IP-CIDR6,240d:c010:88::/48,no-resolve 212 | IP-CIDR6,240d:c010:8a::/48,no-resolve 213 | IP-CIDR6,240d:c010:8d::/48,no-resolve 214 | IP-CIDR6,240d:c010:8e::/48,no-resolve 215 | IP-CIDR6,240d:c010:95::/48,no-resolve 216 | IP-CIDR6,240d:c010:97::/48,no-resolve 217 | IP-CIDR6,240d:c010:99::/48,no-resolve 218 | IP-CIDR6,240d:c010:9a::/47,no-resolve 219 | IP-CIDR6,240d:c010:9d::/48,no-resolve 220 | IP-CIDR6,240d:c010:a1::/48,no-resolve 221 | IP-CIDR6,240d:c010:a3::/48,no-resolve 222 | IP-CIDR6,240d:c010:ab::/48,no-resolve 223 | IP-CIDR6,240d:c010:ad::/48,no-resolve 224 | IP-CIDR6,240d:c010:b2::/48,no-resolve 225 | IP-CIDR6,240d:c010:b9::/48,no-resolve 226 | IP-CIDR6,240d:c010:ba::/47,no-resolve 227 | IP-CIDR6,240d:c010:bf::/48,no-resolve 228 | IP-CIDR6,240d:c010:c1::/48,no-resolve 229 | IP-CIDR6,240d:c010:c8::/48,no-resolve 230 | IP-CIDR6,240d:c010:cc::/48,no-resolve 231 | IP-CIDR6,240d:c010:d1::/48,no-resolve 232 | IP-CIDR6,240d:c010:d2::/47,no-resolve 233 | IP-CIDR6,240d:c010:d4::/47,no-resolve 234 | IP-CIDR6,240d:c010:d8::/47,no-resolve 235 | IP-CIDR6,240d:c010:db::/48,no-resolve 236 | IP-CIDR6,240d:c010:dc::/48,no-resolve 237 | IP-CIDR6,240d:c010:f1::/48,no-resolve 238 | IP-CIDR6,240d:c010:f4::/47,no-resolve 239 | IP-CIDR6,240d:c010:f6::/48,no-resolve 240 | IP-CIDR6,240d:c010:fb::/48,no-resolve 241 | IP-CIDR6,240d:c040::/44,no-resolve 242 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xkww3n/Rules/a32fa78078d37ca5ee8005c81d85572d5b899e0d/tests/__init__.py -------------------------------------------------------------------------------- /tests/src/custom_ruleset/combined.txt: -------------------------------------------------------------------------------- 1 | #@Combined 2 | DOMAIN,example.com 3 | DOMAIN-SUFFIX,example.com 4 | IP-CIDR,11.4.5.14 5 | IP-CIDR6,fc00:114::514 6 | IP-CIDR,11.4.5.14,no-resolve 7 | IP-CIDR6,fc00:114::514,no-resolve 8 | # comment -------------------------------------------------------------------------------- /tests/src/custom_ruleset/domain.txt: -------------------------------------------------------------------------------- 1 | #@Domain 2 | .example.com 3 | example.com 4 | # comment -------------------------------------------------------------------------------- /tests/src/custom_ruleset/ipcidr.txt: -------------------------------------------------------------------------------- 1 | #@IPCIDR 2 | 11.4.5.14 3 | fc00:114::514 4 | # comment -------------------------------------------------------------------------------- /tests/src/patch/patch.txt: -------------------------------------------------------------------------------- 1 | ADD:.example.com 2 | REM:example.com -------------------------------------------------------------------------------- /tests/test_0_rule.py: -------------------------------------------------------------------------------- 1 | from pytest import raises 2 | 3 | from models.rule import Rule, RuleType 4 | 5 | 6 | class Test: 7 | def test_type_checking_init(self): 8 | with raises(ValueError): 9 | Rule(RuleType.DomainSuffix, "[invalid_domain]") 10 | with raises(ValueError): 11 | Rule(RuleType.DomainFull, "[invalid_domain]") 12 | with raises(ValueError): 13 | Rule(RuleType.IPCIDR, "114514") 14 | with raises(ValueError): 15 | Rule(RuleType.IPCIDR6, "1919810") 16 | with raises(ValueError): 17 | Rule(RuleType.IPCIDR, "fc00:114::514") 18 | with raises(ValueError): 19 | Rule(RuleType.IPCIDR6, "1.14.5.14") 20 | 21 | def test_type_checking_runtime(self): 22 | with raises(ValueError): 23 | Rule(RuleType.DomainSuffix, "[invalid_domain]") 24 | 25 | with raises(ValueError): 26 | Rule(RuleType.DomainFull, "[invalid_domain]") 27 | 28 | with raises(ValueError): 29 | Rule(RuleType.IPCIDR, "114514") 30 | 31 | with raises(ValueError): 32 | Rule(RuleType.IPCIDR6, "1919810") 33 | 34 | with raises(ValueError): 35 | Rule(RuleType.IPCIDR, "fc00:114::514") 36 | 37 | with raises(ValueError): 38 | Rule(RuleType.IPCIDR6, "1.14.5.14") 39 | 40 | def test_to_str(self): 41 | test_rule = Rule(RuleType.DomainSuffix, "example.com", "TEST") 42 | assert str(test_rule) == "DomainSuffix: example.com (TEST)" 43 | 44 | def test_hash(self): 45 | test_rule_1 = Rule(RuleType.DomainSuffix, "example.com", "TEST") 46 | test_rule_2 = Rule(RuleType.DomainFull, "example.com", "TEST2") 47 | test_dict = [Rule(RuleType.DomainSuffix, "example.com", "TEST")] 48 | assert test_rule_1 in test_dict 49 | assert test_rule_2 not in test_dict 50 | 51 | def test_eq(self): 52 | test_rule_1 = Rule(RuleType.DomainSuffix, "example.com", "TEST") 53 | test_rule_2 = Rule(RuleType.DomainSuffix, "example.com", "TEST") 54 | assert test_rule_1 == test_rule_2 55 | 56 | def test_include(self): 57 | test_self_rule = Rule(RuleType.DomainSuffix, "example.com", "TEST") 58 | test_rule_1 = Rule(RuleType.DomainSuffix, "a.example.com", "TEST") 59 | test_rule_2 = Rule(RuleType.DomainFull, "b.example.com", "TEST") 60 | test_rule_3 = Rule(RuleType.DomainFull, "example.com", "TEST") 61 | test_rule_4 = Rule(RuleType.DomainSuffix, "example.com", "TEST") 62 | test_rule_5 = Rule(RuleType.DomainFull, "1example.com", "TEST") 63 | assert test_self_rule.includes(test_rule_1) 64 | assert test_self_rule.includes(test_rule_2) 65 | assert test_self_rule.includes(test_rule_3) 66 | assert test_self_rule.includes(test_rule_4) 67 | assert not test_self_rule.includes(test_rule_5) 68 | -------------------------------------------------------------------------------- /tests/test_1_ruleset.py: -------------------------------------------------------------------------------- 1 | from models.rule import Rule, RuleType 2 | from models.ruleset import RuleSet, RuleSetType 3 | 4 | 5 | class Test: 6 | def test_hash(self): 7 | test_ruleset_1 = RuleSet(RuleSetType.Domain, 8 | [Rule(RuleType.DomainSuffix, "example.com", "TEST")]) 9 | test_ruleset_2 = RuleSet(RuleSetType.Domain, 10 | [Rule(RuleType.DomainFull, "example.com", "TEST2")]) 11 | test_dict = [RuleSet(RuleSetType.Domain, 12 | [Rule(RuleType.DomainSuffix, "example.com", "TEST")])] 13 | assert test_ruleset_1 in test_dict 14 | assert test_ruleset_2 not in test_dict 15 | 16 | def test_eq(self): 17 | test_ruleset_1 = RuleSet(RuleSetType.Domain, 18 | [Rule(RuleType.DomainSuffix, "example.com", "TEST")]) 19 | test_ruleset_2 = RuleSet(RuleSetType.Domain, 20 | [Rule(RuleType.DomainSuffix, "example.com", "TEST")]) 21 | test_ruleset_3 = RuleSet(RuleSetType.Domain, 22 | [Rule(RuleType.DomainSuffix, "1example.com", "TEST")]) 23 | assert test_ruleset_1 == test_ruleset_2 24 | assert test_ruleset_1 != test_ruleset_3 25 | 26 | def test_len(self): 27 | test_rule_1 = Rule(RuleType.DomainSuffix, "a.example.com", "TEST1") 28 | test_rule_2 = Rule(RuleType.DomainSuffix, "b.example.com", "TEST2") 29 | test_rule_3 = Rule(RuleType.DomainSuffix, "c.example.com", "TEST3") 30 | test_payload = [test_rule_1, test_rule_2, test_rule_3] 31 | test_ruleset = RuleSet(RuleSetType.Domain, test_payload) 32 | assert len(test_ruleset) == 3 33 | 34 | def test_or(self): 35 | test_rule_1 = Rule(RuleType.DomainSuffix, "a.example.com", "TEST1") 36 | test_rule_2 = Rule(RuleType.DomainSuffix, "b.example.com", "TEST2") 37 | test_rule_3 = Rule(RuleType.DomainSuffix, "c.example.com", "TEST3") 38 | 39 | test_ruleset_1 = RuleSet(RuleSetType.Domain, [test_rule_1, test_rule_2]) 40 | test_ruleset_2 = RuleSet(RuleSetType.Domain, [test_rule_2, test_rule_3]) 41 | test_ruleset_expected = RuleSet(RuleSetType.Domain, [test_rule_1, test_rule_2, test_rule_3]) 42 | assert test_ruleset_1 | test_ruleset_2 == test_ruleset_expected 43 | 44 | def test_contains(self): 45 | test_rule_1 = Rule(RuleType.DomainSuffix, "a.example.com", "TEST1") 46 | test_rule_2 = Rule(RuleType.DomainSuffix, "b.example.com", "TEST2") 47 | test_ruleset = RuleSet(RuleSetType.Domain, [test_rule_1]) 48 | assert test_rule_1 in test_ruleset 49 | assert test_rule_2 not in test_ruleset 50 | 51 | def test_iterable(self): 52 | test_payload = [Rule(RuleType.DomainSuffix, "1.example.com"), 53 | Rule(RuleType.DomainSuffix, "2.example.com"), 54 | Rule(RuleType.DomainSuffix, "3.example.com")] 55 | test_ruleset = RuleSet(RuleSetType.Domain, test_payload) 56 | try: 57 | iter(test_ruleset) 58 | except TypeError: 59 | assert False 60 | assert True 61 | 62 | def test_copy(self): 63 | test_ruleset = RuleSet(RuleSetType.Domain, 64 | [Rule(RuleType.DomainSuffix, "example.com", "TEST1")]) 65 | assert test_ruleset.deepcopy() == test_ruleset 66 | 67 | def test_add(self): 68 | test_rule = Rule(RuleType.DomainSuffix, "example.com", "TEST") 69 | test_ruleset = RuleSet(RuleSetType.Domain, []) 70 | test_ruleset.add(test_rule) 71 | assert test_ruleset == RuleSet(RuleSetType.Domain, [test_rule]) 72 | 73 | def test_remove(self): 74 | test_rule_1 = Rule(RuleType.DomainSuffix, "a.example.com", "TEST1") 75 | test_rule_2 = Rule(RuleType.DomainSuffix, "b.example.com", "TEST2") 76 | test_ruleset = RuleSet(RuleSetType.Domain, [test_rule_1, test_rule_2]) 77 | test_ruleset.remove(test_rule_2) 78 | assert test_ruleset == RuleSet(RuleSetType.Domain, [test_rule_1]) 79 | -------------------------------------------------------------------------------- /tests/test_2_utils.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import config 4 | from models.rule import Rule, RuleType 5 | from models.ruleset import RuleSet, RuleSetType 6 | from utils import rule, ruleset 7 | 8 | 9 | class TestLoad: 10 | def test_load_domain(self): 11 | test_src_path = Path("tests/src/custom_ruleset/") 12 | loaded_ruleset = ruleset.load(test_src_path/"domain.txt") 13 | assert loaded_ruleset == RuleSet(RuleSetType.Domain, 14 | [Rule(RuleType.DomainSuffix, "example.com"), 15 | Rule(RuleType.DomainFull, "example.com")]) 16 | 17 | def test_load_ipcidr(self): 18 | test_src_path = Path("tests/src/custom_ruleset/") 19 | loaded_ruleset = ruleset.load(test_src_path/"ipcidr.txt") 20 | assert loaded_ruleset == RuleSet(RuleSetType.IPCIDR, 21 | [Rule(RuleType.IPCIDR, "11.4.5.14"), 22 | Rule(RuleType.IPCIDR6, "fc00:114::514")]) 23 | 24 | def test_load_combined(self): 25 | test_src_path = Path("tests/src/custom_ruleset/") 26 | loaded_ruleset = ruleset.load(test_src_path/"combined.txt") 27 | assert loaded_ruleset == RuleSet(RuleSetType.Combined, 28 | [Rule(RuleType.DomainFull, "example.com"), 29 | Rule(RuleType.DomainSuffix, "example.com"), 30 | Rule(RuleType.IPCIDR, "11.4.5.14"), 31 | Rule(RuleType.IPCIDR6, "fc00:114::514"), 32 | Rule(RuleType.IPCIDR, "11.4.5.14", "no-resolve"), 33 | Rule(RuleType.IPCIDR6, "fc00:114::514", "no-resolve")]) 34 | 35 | 36 | class TestDump: 37 | def test_dump_domain(self): 38 | test_dist = Path("tests/dists/") 39 | ruleset_domain = ruleset.load(Path("tests/src/custom_ruleset/domain.txt")) 40 | ruleset.batch_dump(ruleset_domain, config.TARGETS, test_dist, "domain") 41 | 42 | assert (test_dist/"text"/"domain.txt").exists() 43 | with open(test_dist/"text"/"domain.txt", mode="r") as f: 44 | assert f.read() == (".example.com\n" 45 | "example.com\n") 46 | 47 | assert (test_dist/"text-plus"/"domain.txt").exists() 48 | with open(test_dist/"text-plus"/"domain.txt", mode="r") as f: 49 | assert f.read() == ("+.example.com\n" 50 | "example.com\n") 51 | 52 | assert (test_dist/"clash-compatible"/"domain.txt").exists() 53 | with open(test_dist/"clash-compatible"/"domain.txt", mode="r") as f: 54 | assert f.read() == ("DOMAIN-SUFFIX,example.com,Policy\n" 55 | "DOMAIN,example.com,Policy\n") 56 | 57 | assert (test_dist/"surge-compatible"/"domain.txt").exists() 58 | with open(test_dist/"surge-compatible"/"domain.txt", mode="r") as f: 59 | assert f.read() == ("DOMAIN-SUFFIX,example.com\n" 60 | "DOMAIN,example.com\n") 61 | 62 | assert (test_dist/"yaml"/"domain.yaml").exists() 63 | with open(test_dist/"yaml"/"domain.yaml", mode="r") as f: 64 | assert f.read() == ("payload:\n" 65 | " - '+.example.com'\n" 66 | " - 'example.com'\n") 67 | 68 | assert (test_dist/"geosite"/"domain").exists() 69 | with open(test_dist/"geosite"/"domain", mode="r") as f: 70 | assert f.read() == ("example.com\n" 71 | "full:example.com\n") 72 | 73 | assert (test_dist/"sing-ruleset"/"domain.json").exists() 74 | with open(test_dist/"sing-ruleset"/"domain.json", mode="r") as f: 75 | assert f.read() == ('{\n' 76 | ' "version": 1,\n' 77 | ' "rules": [\n' 78 | ' {\n' 79 | ' "domain_suffix": [\n' 80 | ' "example.com"\n' 81 | ' ],\n' 82 | ' "domain": [\n' 83 | ' "example.com"\n' 84 | ' ]\n' 85 | ' }\n' 86 | ' ]\n' 87 | '}') 88 | 89 | def test_dump_ipcidr(self): 90 | test_dist = Path("tests/dists/") 91 | ruleset_ipcidr = ruleset.load(Path("tests/src/custom_ruleset/ipcidr.txt")) 92 | ruleset.batch_dump(ruleset_ipcidr, config.TARGETS, test_dist, "ipcidr") 93 | 94 | assert not (test_dist/"text-plus"/"ipcidr.txt").exists() 95 | assert not (test_dist/"geosite"/"ipcidr").exists() 96 | 97 | assert (test_dist/"text"/"ipcidr.txt").exists() 98 | with open(test_dist/"text"/"ipcidr.txt", mode="r") as f: 99 | assert f.read() == ("11.4.5.14\n" 100 | "fc00:114::514\n") 101 | 102 | assert (test_dist/"clash-compatible"/"ipcidr.txt").exists() 103 | with open(test_dist/"clash-compatible"/"ipcidr.txt", mode="r") as f: 104 | assert f.read() == ("IP-CIDR,11.4.5.14,Policy\n" 105 | "IP-CIDR6,fc00:114::514,Policy\n") 106 | 107 | assert (test_dist/"surge-compatible"/"ipcidr.txt").exists() 108 | with open(test_dist/"surge-compatible"/"ipcidr.txt", mode="r") as f: 109 | assert f.read() == ("IP-CIDR,11.4.5.14\n" 110 | "IP-CIDR6,fc00:114::514\n") 111 | 112 | assert (test_dist/"yaml"/"ipcidr.yaml").exists() 113 | with open(test_dist/"yaml"/"ipcidr.yaml", mode="r") as f: 114 | assert f.read() == ("payload:\n" 115 | " - '11.4.5.14'\n" 116 | " - 'fc00:114::514'\n") 117 | 118 | assert (test_dist/"sing-ruleset"/"ipcidr.json").exists() 119 | with open(test_dist/"sing-ruleset"/"ipcidr.json", mode="r") as f: 120 | assert f.read() == ('{\n' 121 | ' "version": 1,\n' 122 | ' "rules": [\n' 123 | ' {\n' 124 | ' "ip_cidr": [\n' 125 | ' "11.4.5.14",\n' 126 | ' "fc00:114::514"\n' 127 | ' ]\n' 128 | ' }\n' 129 | ' ]\n' 130 | '}') 131 | 132 | def test_dump_combined(self): 133 | test_dist = Path("tests/dists/") 134 | ruleset_combined = ruleset.load(Path("tests/src/custom_ruleset/combined.txt")) 135 | ruleset.batch_dump(ruleset_combined, config.TARGETS, test_dist, "combined") 136 | 137 | assert not (test_dist/"text"/"combined.txt").exists() 138 | assert not (test_dist/"text-plus"/"combined.txt").exists() 139 | assert not (test_dist/"geosite"/"combined").exists() 140 | 141 | assert (test_dist/"clash-compatible"/"combined.txt").exists() 142 | with open(test_dist/"clash-compatible"/"combined.txt", mode="r") as f: 143 | assert f.read() == ("DOMAIN,example.com,Policy\n" 144 | "DOMAIN-SUFFIX,example.com,Policy\n" 145 | "IP-CIDR,11.4.5.14,Policy\n" 146 | "IP-CIDR6,fc00:114::514,Policy\n" 147 | "IP-CIDR,11.4.5.14,Policy,no-resolve\n" 148 | "IP-CIDR6,fc00:114::514,Policy,no-resolve\n") 149 | 150 | assert (test_dist/"surge-compatible"/"combined.txt").exists() 151 | with open(test_dist/"surge-compatible"/"combined.txt", mode="r") as f: 152 | assert f.read() == ("DOMAIN,example.com\n" 153 | "DOMAIN-SUFFIX,example.com\n" 154 | "IP-CIDR,11.4.5.14\n" 155 | "IP-CIDR6,fc00:114::514\n" 156 | "IP-CIDR,11.4.5.14,no-resolve\n" 157 | "IP-CIDR6,fc00:114::514,no-resolve\n") 158 | 159 | assert (test_dist/"yaml"/"combined.yaml").exists() 160 | with open(test_dist/"yaml"/"combined.yaml", mode="r") as f: 161 | assert f.read() == ("payload:\n" 162 | " - 'DOMAIN,example.com'\n" 163 | " - 'DOMAIN-SUFFIX,example.com'\n" 164 | " - 'IP-CIDR,11.4.5.14'\n" 165 | " - 'IP-CIDR6,fc00:114::514'\n" 166 | " - 'IP-CIDR,11.4.5.14,no-resolve'\n" 167 | " - 'IP-CIDR6,fc00:114::514,no-resolve'\n") 168 | 169 | assert (test_dist/"sing-ruleset"/"combined.json").exists() 170 | with open(test_dist/"sing-ruleset"/"combined.json", mode="r") as f: 171 | assert f.read() == ('{\n' 172 | ' "version": 1,\n' 173 | ' "rules": [\n' 174 | ' {\n' 175 | ' "domain": [\n' 176 | ' "example.com"\n' 177 | ' ],\n' 178 | ' "domain_suffix": [\n' 179 | ' "example.com"\n' 180 | ' ],\n' 181 | ' "ip_cidr": [\n' 182 | ' "11.4.5.14",\n' 183 | ' "fc00:114::514",\n' 184 | ' "11.4.5.14",\n' 185 | ' "fc00:114::514"\n' 186 | ' ]\n' 187 | ' }\n' 188 | ' ]\n' 189 | '}') 190 | 191 | 192 | class TestMisc: 193 | def test_is_ipv4addr(self): 194 | valid_ipaddr = "11.4.5.14" 195 | invalid_ipaddr_1 = "114.514" 196 | invalid_ipaddr_2 = "19.1.9.810" 197 | invalid_ipaddr_3 = "test.www.example.com" 198 | assert rule.is_ipv4addr(valid_ipaddr) 199 | assert not rule.is_ipv4addr(invalid_ipaddr_1) 200 | assert not rule.is_ipv4addr(invalid_ipaddr_2) 201 | assert not rule.is_ipv4addr(invalid_ipaddr_3) 202 | 203 | def test_is_domain(self): 204 | valid_domain = "www.example.com" 205 | invalid_domain_1 = "[invalid]" 206 | invalid_domain_2 = "-invalid.com" 207 | invalid_domain_3 = "*.example.com" 208 | invalid_domain_4 = "www.example.com/error" 209 | ipv4addr = "11.4.5.14" 210 | assert rule.is_domain(valid_domain) 211 | assert not rule.is_domain(invalid_domain_1) 212 | assert not rule.is_domain(invalid_domain_2) 213 | assert not rule.is_domain(invalid_domain_3) 214 | assert not rule.is_domain(invalid_domain_4) 215 | assert not rule.is_domain(ipv4addr) 216 | 217 | def test_patch(self): 218 | test_src_patch = Path("tests/src/patch/") 219 | test_ruleset = RuleSet(RuleSetType.Domain, [Rule(RuleType.DomainFull, "example.com")]) 220 | ruleset.patch(test_ruleset, "patch", test_src_patch) 221 | assert test_ruleset == RuleSet(RuleSetType.Domain, [Rule(RuleType.DomainSuffix, "example.com")]) 222 | 223 | def test_sort(self): 224 | test_rule_1 = Rule(RuleType.DomainSuffix, "a.example.com", "TEST1") 225 | test_rule_2 = Rule(RuleType.DomainSuffix, "b.example.com", "TEST2") 226 | test_ruleset = RuleSet(RuleSetType.Domain, [test_rule_2, test_rule_1]) 227 | test_ruleset.sort() 228 | assert test_ruleset == RuleSet(RuleSetType.Domain, [test_rule_1, test_rule_2]) 229 | 230 | def test_dedup(self): 231 | test_rule_1 = Rule(RuleType.DomainSuffix, "1.example.com") 232 | test_rule_2 = Rule(RuleType.DomainSuffix, "a.1.example.com") 233 | test_rule_3 = Rule(RuleType.DomainFull, "1.example.com") 234 | test_rule_4 = Rule(RuleType.DomainSuffix, "2.example.com") 235 | test_rule_5 = Rule(RuleType.DomainSuffix, "a.2.example.com") 236 | test_rule_6 = Rule(RuleType.DomainFull, "2.example.com") 237 | test_ruleset = RuleSet(RuleSetType.Domain, 238 | [test_rule_1, test_rule_2, test_rule_3, test_rule_4, test_rule_5, test_rule_6]) 239 | test_ruleset.dedup() 240 | assert test_ruleset == RuleSet(RuleSetType.Domain, [test_rule_1, test_rule_4]) 241 | -------------------------------------------------------------------------------- /utils/geosite.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from pathlib import Path 3 | 4 | import config 5 | from models.rule import Rule, RuleType 6 | from models.ruleset import RuleSet, RuleSetType 7 | from utils import ruleset 8 | 9 | 10 | def parse(src_path: Path, excluded_imports=None, excluded_tags=None) -> RuleSet: 11 | with open(src_path, mode="r", encoding="utf-8") as raw: 12 | src = raw.read().splitlines() 13 | excluded_imports = [] if not excluded_imports else excluded_imports 14 | excluded_tags = [] if not excluded_tags else excluded_tags 15 | ruleset_parsed = RuleSet(RuleSetType.Domain, []) 16 | for raw_line in src: 17 | line = raw_line.split("#")[0].strip() 18 | if not line: 19 | continue 20 | if "@" in line: 21 | parsed_rule_tag = line.split("@")[1] 22 | if parsed_rule_tag in excluded_tags: 23 | logging.debug(f'Skipped (excl.tag "{parsed_rule_tag}"): "{raw_line}"') 24 | continue 25 | line = line.split(" @")[0] 26 | if ":" not in line: 27 | parsed_rule = Rule(RuleType.DomainSuffix, line) 28 | elif line.startswith("full:"): 29 | parsed_rule = Rule(RuleType.DomainFull, line.strip("full:")) 30 | elif line.startswith("include:"): 31 | name_import = line.split("include:")[1] 32 | if name_import in excluded_imports: 33 | logging.debug(f'Skipped (excl.import "{name_import}"): "{raw_line}"') 34 | continue 35 | logging.debug(f'Import ("{raw_line}"): "{name_import}"') 36 | ruleset_parsed |= parse(src_path.parent/name_import, excluded_imports, excluded_tags) 37 | logging.debug(f'Imported "{name_import}".') 38 | continue # Import rule itself doesn't contain any content and can't be included in a ruleset, 39 | # so whether an import rule is processed or not, the code below shouldn't be executed. 40 | else: 41 | logging.debug(f'Skipped (unsupported): "{raw_line}"') 42 | continue 43 | ruleset_parsed.add(parsed_rule) 44 | logging.debug(f'Parsed: "{raw_line}" -> "{parsed_rule}"') 45 | return ruleset_parsed 46 | 47 | 48 | def batch_gen(categories: list, tools: list, exclusions=None) -> None: 49 | exclusions = [] if not exclusions else exclusions 50 | for tool in tools: 51 | for category in categories: 52 | ruleset_geosite = parse(config.PATH_SOURCE_GEOSITE/category, exclusions) 53 | ruleset_geosite.dedup() 54 | ruleset.dump(ruleset_geosite, tool, config.PATH_DIST/tool, category) 55 | -------------------------------------------------------------------------------- /utils/log_decorator.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from time import time_ns 3 | 4 | 5 | def log(func): 6 | def wrapper(*args, **kwargs): 7 | logging.info(f"Build {func.__doc__.strip()}") 8 | start_time = time_ns() 9 | result = func(*args, **kwargs) 10 | end_time = time_ns() 11 | logging.info(f"Done ({format((end_time - start_time) / 1e9, '.3f')}s)\n") 12 | return result 13 | return wrapper 14 | -------------------------------------------------------------------------------- /utils/rule.py: -------------------------------------------------------------------------------- 1 | # noinspection PyProtectedMember 2 | from abp.filters.parser import Filter 3 | 4 | 5 | def is_ipv4addr(addr: str) -> bool: 6 | if addr.count(".") != 3: 7 | return False 8 | for part in addr.split("."): 9 | if not part.isdigit(): 10 | return False 11 | i = int(part) 12 | if i < 0 or i > 255: 13 | return False 14 | return True 15 | 16 | 17 | def is_domain(addr: str) -> bool: 18 | blacklist_include = {"/", "*", "=", "~", "?", "#", ",", ":", " ", "(", ")", "[", "]", "|", "@", "^"} 19 | if (any(bl_char in addr for bl_char in blacklist_include) 20 | or addr.startswith("-") 21 | or addr.endswith(".") 22 | or addr.endswith("-") 23 | or is_ipv4addr(addr)): 24 | return False 25 | return True 26 | 27 | 28 | def strip_adblock(filter_to_strip: Filter) -> str | None: 29 | if (filter_to_strip.type != "filter" 30 | or filter_to_strip.selector["type"] != "url-pattern" 31 | or filter_to_strip.options and filter_to_strip.options not in ( 32 | [("all", True)], 33 | [("document", True)], 34 | [("popup", True)] 35 | ) 36 | or filter_to_strip.text.startswith("^")): 37 | return 38 | stripped = filter_to_strip.selector["value"].strip("@").strip("|").strip("^") 39 | if is_domain(stripped): 40 | return stripped 41 | return 42 | -------------------------------------------------------------------------------- /utils/ruleset.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from json import dumps as json_dumps 3 | from pathlib import Path 4 | 5 | import config 6 | from models.rule import Rule, RuleType 7 | from models.ruleset import RuleSet, RuleSetType 8 | 9 | 10 | def load(src: Path) -> RuleSet: 11 | with open(src, mode="r", encoding="utf-8") as raw: 12 | src_toload = raw.read().splitlines() 13 | try: 14 | ruleset_type = RuleSetType[src_toload[0].split("@")[1]] 15 | except IndexError: 16 | logging.warning(f"File {src} doesn't have a valid type header, treat as domain type.") 17 | ruleset_type = RuleSetType.Domain 18 | ruleset_loaded = RuleSet(ruleset_type, []) 19 | 20 | rules_to_add = [] 21 | 22 | match ruleset_type: 23 | case RuleSetType.Domain: 24 | domain_suffix_rules = [ 25 | Rule(RuleType.DomainSuffix, line.strip(".")) 26 | for line in src_toload 27 | if line.startswith(".") and line 28 | ] 29 | 30 | domain_full_rules = [ 31 | Rule(RuleType.DomainFull, line) 32 | for line in src_toload 33 | if line and not line.startswith("#") and not line.startswith(".") 34 | ] 35 | 36 | rules_to_add.extend(domain_suffix_rules) 37 | rules_to_add.extend(domain_full_rules) 38 | 39 | case RuleSetType.IPCIDR: 40 | ipv4_rules = [ 41 | Rule(RuleType.IPCIDR, line) 42 | for line in src_toload 43 | if line and not line.startswith("#") and ":" not in line 44 | ] 45 | 46 | ipv6_rules = [ 47 | Rule(RuleType.IPCIDR6, line) 48 | for line in src_toload 49 | if line and not line.startswith("#") and ":" in line 50 | ] 51 | 52 | rules_to_add.extend(ipv4_rules) 53 | rules_to_add.extend(ipv6_rules) 54 | 55 | case RuleSetType.Combined: 56 | for line in src_toload: 57 | if not line or line.startswith("#"): 58 | continue 59 | parsed = line.split(",") 60 | rule_type = RuleType(parsed[0]) 61 | if len(parsed) == 3: 62 | parsed_rule = Rule(rule_type, parsed[1], parsed[2]) 63 | else: 64 | parsed_rule = Rule(rule_type, parsed[1]) 65 | rules_to_add.append(parsed_rule) 66 | 67 | ruleset_loaded.payload = rules_to_add 68 | return ruleset_loaded 69 | 70 | 71 | def dump(src: RuleSet, target: str, dst: Path, filename: str) -> None: 72 | if target not in config.TARGETS: 73 | raise TypeError("Invalid target.") 74 | match target: 75 | case "yaml": 76 | file = filename + ".yaml" 77 | case "geosite": 78 | file = filename 79 | case "sing-ruleset": 80 | file = filename + ".json" 81 | case _: 82 | file = filename + ".txt" 83 | dst.mkdir(parents=True, exist_ok=True) 84 | 85 | def generate_content(): 86 | if target in {"text", "text-plus"}: 87 | for rule in src: 88 | if rule.type == RuleType.DomainSuffix: 89 | yield f"+.{rule.payload}\n" if target == "text-plus" else f".{rule.payload}\n" 90 | else: 91 | yield f"{rule.payload}\n" 92 | elif target in {"surge-compatible", "clash-compatible", "yaml"}: 93 | if target == "yaml": 94 | yield "payload:\n" 95 | for rule in src: 96 | if target == "yaml" and src.type != RuleSetType.Combined: 97 | to_write = f"+.{rule.payload}" if rule.type == RuleType.DomainSuffix else rule.payload 98 | else: 99 | prefix = rule.type.value 100 | to_write = f"{prefix},{rule.payload}" 101 | if target == "clash-compatible": 102 | to_write += ",Policy" 103 | if rule.tag: 104 | to_write += f",{rule.tag}" 105 | if target == "yaml": 106 | to_write = f" - '{to_write}'" 107 | yield f"{to_write}\n" 108 | elif target == "geosite": 109 | for rule in src: 110 | if rule.type == RuleType.DomainSuffix: 111 | yield f"{rule.payload}\n" 112 | elif rule.type == RuleType.DomainFull: 113 | yield f"full:{rule.payload}\n" 114 | elif target == "sing-ruleset": 115 | ruleset = { 116 | "version": 1, 117 | "rules": [{}] 118 | } 119 | for rule in src: 120 | match rule.type: 121 | case RuleType.DomainFull: 122 | key = "domain" 123 | case RuleType.DomainSuffix: 124 | key = "domain_suffix" 125 | case _: 126 | key = "ip_cidr" 127 | 128 | if key not in ruleset["rules"][0]: 129 | ruleset["rules"][0][key] = [] 130 | 131 | ruleset["rules"][0][key].append(rule.payload) 132 | yield json_dumps(ruleset, indent=2) 133 | 134 | with open(dst/file, mode="w", encoding="utf-8", buffering=8192) as dist: 135 | for chunk in generate_content(): 136 | dist.write(chunk) 137 | 138 | 139 | def batch_dump(src: RuleSet, targets: list, dst_path: Path, filename: str) -> None: 140 | compatible_targets = [] 141 | for target in targets: 142 | if src.type in {RuleSetType.IPCIDR, RuleSetType.Combined} and target in {"text-plus", "geosite"} \ 143 | or src.type == RuleSetType.Combined and target == "text": 144 | logging.warning(f'{filename}: Ignore unsupported type "{target}" for {src.type.name} ruleset.') 145 | continue 146 | compatible_targets.append(target) 147 | 148 | if not compatible_targets: 149 | return 150 | 151 | for target in compatible_targets: 152 | (dst_path/target).mkdir(parents=True, exist_ok=True) 153 | 154 | for target in compatible_targets: 155 | dump(src, target, dst_path/target, filename) 156 | 157 | 158 | def patch(src: RuleSet, name: str, override_patch_loc: Path = Path("")) -> RuleSet: 159 | path_base = override_patch_loc if override_patch_loc != Path("") else config.PATH_SOURCE_PATCH 160 | try: 161 | loaded_patch = open(path_base/f"{name}.txt", mode="r", encoding="utf-8").read().splitlines() 162 | except FileNotFoundError: 163 | logging.warning(f'Patch "{name + ".txt"}" not found.') 164 | return src 165 | logging.info(f'Apply patch "{name + ".txt"}"') 166 | for line in loaded_patch: 167 | if not line or line.startswith("#"): 168 | continue 169 | parsed_line = line.split(":") 170 | if parsed_line[1].startswith("."): 171 | rule = Rule(RuleType.DomainSuffix, parsed_line[1].strip(".")) 172 | else: 173 | rule = Rule(RuleType.DomainFull, parsed_line[1]) 174 | if parsed_line[0] == "ADD": 175 | if rule not in src: 176 | src.add(rule) 177 | logging.debug(f'Added: "{rule}"') 178 | else: 179 | logging.warning(f"Already exist: {rule}") 180 | elif parsed_line[0] == "REM": 181 | if rule in src: 182 | src.remove(rule) 183 | logging.debug(f'Removed: "{rule}"') 184 | else: 185 | logging.warning(f"Not found: {rule}") 186 | logging.info(f'Patch "{name + ".txt"}" applied.') 187 | return src 188 | -------------------------------------------------------------------------------- /workers/custom.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from pathlib import Path 3 | 4 | import config 5 | from utils.log_decorator import log 6 | from utils.ruleset import batch_dump 7 | from utils.ruleset import load as ruleset_load 8 | 9 | 10 | @log 11 | def build(): 12 | """ 13 | custom rulesets 14 | """ 15 | 16 | list_file_custom = Path.iterdir(config.PATH_SOURCE_CUSTOM) 17 | for filename in list_file_custom: 18 | if not filename.is_file(): 19 | continue 20 | logging.debug(f'Build "{filename.name}".') 21 | ruleset_custom = ruleset_load(filename) 22 | batch_dump(ruleset_custom, config.TARGETS, config.PATH_DIST, filename.stem) 23 | logging.debug(f"Processed {len(ruleset_custom)} rules.") 24 | -------------------------------------------------------------------------------- /workers/domestic_cidr.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from requests import Session 4 | 5 | import config 6 | from models.rule import Rule, RuleType 7 | from models.ruleset import RuleSet, RuleSetType 8 | from utils.log_decorator import log 9 | from utils.ruleset import batch_dump 10 | 11 | 12 | @log 13 | def build(): 14 | """ 15 | domestic CIDR ruleset 16 | """ 17 | 18 | connection = Session() 19 | 20 | src_cidr = connection.get(config.URL_DOMESTIC_IP_V4).text.splitlines() 21 | ruleset_cidr = RuleSet(RuleSetType.IPCIDR, []) 22 | for line in src_cidr: 23 | if line.startswith("#"): 24 | continue 25 | ruleset_cidr.add(Rule(RuleType.IPCIDR, line)) 26 | logging.info(f"Processed {len(ruleset_cidr)} domestic IPv4 rules.") 27 | 28 | batch_dump(ruleset_cidr, config.TARGETS, config.PATH_DIST, "domestic_ip") 29 | 30 | src_cidr6 = connection.get(config.URL_DOMESTIC_IP_V6).text.splitlines() 31 | ruleset_cidr6 = RuleSet(RuleSetType.IPCIDR, []) 32 | for line in src_cidr6: 33 | ruleset_cidr6.add(Rule(RuleType.IPCIDR6, line)) 34 | logging.info(f"Processed {len(ruleset_cidr6)} domestic IPv6 rules.") 35 | 36 | batch_dump(ruleset_cidr6, config.TARGETS, config.PATH_DIST, "domestic_ip6") 37 | -------------------------------------------------------------------------------- /workers/domestic_domain.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from requests import Session 4 | 5 | import config 6 | from models.rule import Rule, RuleType 7 | from utils.geosite import parse as geosite_parse 8 | from utils.log_decorator import log 9 | from utils.ruleset import batch_dump, patch 10 | 11 | 12 | @log 13 | def build(): 14 | """ 15 | domestic ruleset 16 | """ 17 | 18 | connection = Session() 19 | 20 | ruleset_domestic = geosite_parse(config.PATH_SOURCE_GEOSITE/"geolocation-cn", None, ["!cn"]) 21 | logging.info(f"Imported {len(ruleset_domestic)} domestic rules from v2fly geolocation-cn list.") 22 | 23 | for item in ruleset_domestic.deepcopy(): 24 | tld_overseas = (".hk", ".kr", ".my", ".sg", ".au", ".tw", ".in", ".ru", ".us", ".fr", ".th", ".id", ".jp") 25 | if any(item.payload.endswith(os_tld) for os_tld in tld_overseas): 26 | ruleset_domestic.remove(item) 27 | logging.debug(f"{item} removed for having a overseas TLD.") 28 | 29 | # Import dnsmasq-china-list 30 | raw = connection.get( 31 | "https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/apple.china.conf").text 32 | for line in raw.replace("server=/", "").replace("/114.114.114.114", "").splitlines(): 33 | ruleset_domestic.add(Rule(RuleType.DomainFull, line)) 34 | 35 | ruleset_domestic = patch(ruleset_domestic, "domestic") 36 | 37 | # Add all domestic TLDs to domestic rules, then perform deduplication. 38 | ruleset_domestic_tlds = geosite_parse(config.PATH_SOURCE_GEOSITE/"tld-cn") 39 | logging.info(f"Imported {len(ruleset_domestic_tlds)} domestic TLDs.") 40 | ruleset_domestic |= ruleset_domestic_tlds 41 | ruleset_domestic.dedup() 42 | logging.info(f"Processed {len(ruleset_domestic)} domestic rules.") 43 | batch_dump(ruleset_domestic, config.TARGETS, config.PATH_DIST, "domestic") 44 | -------------------------------------------------------------------------------- /workers/personal.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from pathlib import Path 3 | 4 | import config 5 | from utils.ruleset import batch_dump 6 | from utils.ruleset import load as ruleset_load 7 | 8 | 9 | def build(): 10 | # There's no personal classical type ruleset. So no logic about that. 11 | list_file_personal = Path.glob(config.PATH_SOURCE_CUSTOM/"personal", "*.txt") 12 | for filename in list_file_personal: 13 | logging.debug(f'Build "{filename.name}".') 14 | ruleset_personal = ruleset_load(filename) 15 | batch_dump(ruleset_personal, ["text", "text-plus", "yaml", "surge-compatible", "clash-compatible"], 16 | config.PATH_DIST/"personal", filename.stem) 17 | -------------------------------------------------------------------------------- /workers/reject_exclude.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from abp.filters.parser import parse_filterlist 4 | from requests import Session 5 | 6 | import config 7 | from models.rule import Rule, RuleType 8 | from models.ruleset import RuleSet, RuleSetType 9 | from utils.log_decorator import log 10 | from utils.rule import strip_adblock 11 | from utils.ruleset import batch_dump, patch 12 | 13 | 14 | @log 15 | def build(): 16 | """ 17 | reject and exclude ruleset 18 | """ 19 | 20 | connection = Session() 21 | 22 | # ps for public suffix, such as ".org.cn". Useful when guessing domains' levels. 23 | src_psl = connection.get("https://publicsuffix.org/list/public_suffix_list.dat").text.splitlines() 24 | set_psl = set() 25 | for line in src_psl: 26 | if "//" in line or "." not in line: 27 | continue 28 | if line.startswith("*"): 29 | line = line.strip("*.") 30 | set_psl.add(f".{line}") 31 | 32 | src_rejections = [] 33 | for url in config.LIST_REJECT_URL: 34 | src_rejections += (connection.get(url).text.splitlines()) 35 | 36 | logging.info(f"Imported {len(src_rejections)} lines of reject rules from defined sources.") 37 | 38 | src_exclusions = [] 39 | for url in config.LIST_EXCL_URL: 40 | src_exclusions += connection.get(url).text.splitlines() 41 | 42 | logging.info(f"Imported {len(src_exclusions)} lines of exclude rules from defined sources.") 43 | 44 | ruleset_rejections = RuleSet(RuleSetType.Domain, []) 45 | ruleset_exclusions_raw = RuleSet(RuleSetType.Domain, []) 46 | 47 | for line in parse_filterlist(src_rejections): 48 | line_stripped = strip_adblock(line) 49 | if not line_stripped: 50 | continue 51 | if line.action == "block": 52 | if line_stripped.startswith("."): 53 | line_stripped = line_stripped.strip(".") 54 | domain_level = line_stripped.count(".") 55 | for ps in set_psl: 56 | if line_stripped.endswith(ps): 57 | domain_level -= ps.count(".") - 1 58 | if domain_level <= 2: 59 | rule_reject = Rule(RuleType.DomainSuffix, line_stripped) 60 | else: 61 | # If a domain's level is bigger than 2, this domain mostly doesn't have any other subdomain. 62 | rule_reject = Rule(RuleType.DomainFull, line_stripped) 63 | ruleset_rejections.add(rule_reject) 64 | logging.debug(f'(ruleset) Reject: Added "{line.text}" -> "{rule_reject}".') 65 | elif line.action == "allow": 66 | src_exclusions.append(line.text) 67 | logging.debug(f'(source) Exclude: Added "{line.text}"') 68 | 69 | for line in parse_filterlist(src_exclusions): 70 | line_stripped = strip_adblock(line) 71 | if not line_stripped: 72 | continue 73 | rule_exclude = Rule(RuleType.DomainFull, line_stripped) 74 | ruleset_exclusions_raw.add(rule_exclude) 75 | logging.debug(f'(ruleset) Exclude_raw: Added "{line.text}" -> "{rule_exclude}"') 76 | 77 | ruleset_rejections = patch(ruleset_rejections, "reject") 78 | ruleset_exclusions = RuleSet(RuleSetType.Domain, []) 79 | logging.debug("Deduplicate reject and exclude set.") 80 | ruleset_rejections.dedup() 81 | for domain_exclude in ruleset_exclusions_raw.deepcopy(): 82 | for domain_reject in ruleset_rejections.deepcopy(): 83 | if domain_exclude.includes(domain_reject): 84 | ruleset_rejections.remove(domain_reject) 85 | ruleset_exclusions_raw.remove(domain_exclude) 86 | logging.debug(f'Removed "{domain_reject}": excluded by "{domain_exclude}"') 87 | batch_dump(ruleset_rejections, config.TARGETS, config.PATH_DIST, "reject") 88 | logging.info(f"Processed {len(ruleset_rejections)} reject rules.") 89 | 90 | for domain_exclude in ruleset_exclusions_raw: 91 | for domain_reject in ruleset_rejections: 92 | if domain_reject.includes(domain_exclude): 93 | ruleset_exclusions.add(domain_exclude) 94 | logging.debug(f'(ruleset) Exclude: Added "{domain_exclude}"') 95 | ruleset_exclusions = patch(ruleset_exclusions, "exclude") 96 | logging.info(f"Processed {len(ruleset_exclusions)} exclude rules.") 97 | batch_dump(ruleset_exclusions, config.TARGETS, config.PATH_DIST, "exclude") 98 | -------------------------------------------------------------------------------- /workers/speedtest.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from json import loads as json_loads 3 | from concurrent.futures import ThreadPoolExecutor 4 | 5 | from requests import Session 6 | from requests.adapters import HTTPAdapter 7 | from urllib3.util import Retry 8 | 9 | import config 10 | from models.rule import Rule, RuleType 11 | from models.ruleset import RuleSet, RuleSetType 12 | from utils.log_decorator import log 13 | from utils.ruleset import batch_dump 14 | 15 | 16 | @log 17 | def build(): 18 | """ 19 | common internet speed testing servers ruleset 20 | """ 21 | accepted_ccs = ["CN", "HK", "TW", "MO", "JP", "US", "SG", "GB", "TR"] 22 | search_keywords = [ 23 | "China", 24 | "China Mobile", 25 | "China Unicom", 26 | "China Telecom", 27 | "联通", 28 | "电信", 29 | "5G", 30 | "Beijing", 31 | 32 | "Hong Kong", 33 | "Taiwan", 34 | "Macau", 35 | "Japan", 36 | "Singapore", 37 | 38 | "United Kingdom", 39 | "London", 40 | "Manchester", 41 | 42 | "United States", 43 | "New York", 44 | "Los Angeles", 45 | "Miami", 46 | "San Jose", 47 | "Dallas", 48 | "Seattle", 49 | "fdcservers", 50 | "GCI", 51 | "Hivelocity", 52 | 53 | "Turkey", 54 | "Posive", 55 | "DuruNet", 56 | "Turkcell", 57 | "Turk Telekom" 58 | ] 59 | 60 | connection = Session() 61 | retry_strategy = Retry( 62 | total=4, 63 | status_forcelist=[429, 500, 502, 503, 504], 64 | backoff_factor=2, 65 | respect_retry_after_header=True, 66 | ) 67 | adapter = HTTPAdapter(max_retries=retry_strategy, pool_connections=10, pool_maxsize=20) 68 | connection.mount('https://', adapter) 69 | 70 | speedtest_ruleset = RuleSet(RuleSetType.Domain, [ 71 | Rule(RuleType.DomainSuffix, "speedtest.net"), 72 | Rule(RuleType.DomainSuffix, "speedtestcustom.com"), 73 | Rule(RuleType.DomainSuffix, "ooklaserver.net"), 74 | Rule(RuleType.DomainSuffix, "speed.cloudflare.com") 75 | ]) 76 | 77 | def process_keyword(keyword): 78 | logging.debug(f'Using keyword "{keyword}"') 79 | url = f"https://www.speedtest.net/api/js/servers?engine=js&search={keyword}&limit=100" 80 | resp = connection.get(url).text 81 | servers_list = json_loads(resp) 82 | 83 | acceptable_servers = [ 84 | server_info for server_info in servers_list 85 | if server_info["cc"] in accepted_ccs 86 | ] 87 | logging.debug(f"Retrieved {len(servers_list)} servers, {len(acceptable_servers)} acceptable.") 88 | 89 | new_rules = [] 90 | for server_info in acceptable_servers: 91 | server_domain = server_info["host"].split(":")[0] 92 | new_rules.append(Rule(RuleType.DomainFull, server_domain)) 93 | logging.debug(f'Added "{server_domain}"') 94 | 95 | return new_rules 96 | 97 | with ThreadPoolExecutor(max_workers=min(len(search_keywords), 10)) as executor: 98 | all_rules = executor.map(process_keyword, search_keywords) 99 | 100 | for rules in all_rules: 101 | for rule in rules: 102 | speedtest_ruleset.add(rule) 103 | 104 | speedtest_ruleset.dedup() 105 | batch_dump(speedtest_ruleset, config.TARGETS, config.PATH_DIST, "speedtest") 106 | logging.info(f"Processed {len(speedtest_ruleset)} speed testing rules.") 107 | -------------------------------------------------------------------------------- /workers/telegram_cidr.py: -------------------------------------------------------------------------------- 1 | from requests import Session 2 | 3 | import config 4 | from models.rule import Rule, RuleType 5 | from models.ruleset import RuleSet, RuleSetType 6 | from utils.log_decorator import log 7 | from utils.ruleset import batch_dump 8 | 9 | 10 | @log 11 | def build(): 12 | """ 13 | Telegram CIDR ruleset 14 | """ 15 | 16 | connection = Session() 17 | 18 | src_cidr = connection.get("https://core.telegram.org/resources/cidr.txt").text.splitlines() 19 | ruleset_cidr = RuleSet(RuleSetType.IPCIDR, []) 20 | for line in src_cidr: 21 | if ":" not in line: 22 | ruleset_cidr.add(Rule(RuleType.IPCIDR, line)) 23 | else: 24 | ruleset_cidr.add(Rule(RuleType.IPCIDR6, line)) 25 | 26 | batch_dump(ruleset_cidr, config.TARGETS, config.PATH_DIST, "telegram") 27 | -------------------------------------------------------------------------------- /workers/v2fly.py: -------------------------------------------------------------------------------- 1 | import config 2 | from utils.geosite import batch_gen 3 | from utils.log_decorator import log 4 | 5 | 6 | @log 7 | def build(): 8 | """ 9 | v2fly community rulesets 10 | """ 11 | 12 | categories = [ 13 | "anthropic", 14 | "bahamut", 15 | "bing", 16 | "dmm", 17 | "googlefcm", 18 | "google-deepmind", 19 | "microsoft", 20 | "niconico", 21 | "openai", 22 | "paypal", 23 | "youtube", 24 | ] 25 | exclusions = [ 26 | "github", # GitHub's domains are included in "microsoft", but its connectivity mostly isn't as high as 27 | # Microsoft. 28 | "bing", # Bing has a more restricted ver for Mainland China. 29 | ] 30 | batch_gen(categories, config.TARGETS, exclusions) 31 | --------------------------------------------------------------------------------