mirror of
https://github.com/v2fly/domain-list-community.git
synced 2026-03-22 11:26:34 +07:00
Compare commits
77 Commits
non-cn
...
2026032002
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
330c30eb23 | ||
|
|
f34f22819e | ||
|
|
baa1409cfb | ||
|
|
a22d247c5a | ||
|
|
d311bbe50b | ||
|
|
1db558b165 | ||
|
|
9ee0757263 | ||
|
|
714a061ba3 | ||
|
|
5ff8142411 | ||
|
|
becbd7a8ad | ||
|
|
cd2d66eb72 | ||
|
|
4c4ad053ef | ||
|
|
6544f6d3a6 | ||
|
|
673a70c380 | ||
|
|
be078767c4 | ||
|
|
15fde0da4b | ||
|
|
5dd4779425 | ||
|
|
eeccde7239 | ||
|
|
235988ffe4 | ||
|
|
a45bf04e9b | ||
|
|
f31764e263 | ||
|
|
540b28d5e4 | ||
|
|
9c06656430 | ||
|
|
f524c3b6bf | ||
|
|
3cdb699cac | ||
|
|
6bb4a68f2f | ||
|
|
0d1c2bc257 | ||
|
|
8a08dcc7ed | ||
|
|
61fd24725c | ||
|
|
7e797d86ec | ||
|
|
910b069cc0 | ||
|
|
92f9940fb7 | ||
|
|
08bafd1b33 | ||
|
|
873495a1fd | ||
|
|
c4793eb3bf | ||
|
|
a32151e070 | ||
|
|
c5db233e0b | ||
|
|
785a18e405 | ||
|
|
e1943122f3 | ||
|
|
2a73fa8675 | ||
|
|
42ff85b0a7 | ||
|
|
764958ebf7 | ||
|
|
a25ac04c82 | ||
|
|
168baf0e6a | ||
|
|
2f78f1c626 | ||
|
|
ddc1e21783 | ||
|
|
4437fb0c51 | ||
|
|
d70840823b | ||
|
|
5c0ddc9f24 | ||
|
|
b119839e7d | ||
|
|
a335e24269 | ||
|
|
d9d97a7132 | ||
|
|
deb950bb2b | ||
|
|
be2ec83092 | ||
|
|
6b16be4020 | ||
|
|
42aafe324e | ||
|
|
882f48e486 | ||
|
|
614b291120 | ||
|
|
2b3211df98 | ||
|
|
71e31ba221 | ||
|
|
b11bfaa138 | ||
|
|
afb9e6cad0 | ||
|
|
5f7c4aa60a | ||
|
|
48eb616779 | ||
|
|
d57e3b3f45 | ||
|
|
c308e3430d | ||
|
|
9a46bff5f3 | ||
|
|
051556734c | ||
|
|
8829b0ea28 | ||
|
|
a201aae131 | ||
|
|
2c661d32b6 | ||
|
|
1be2a927c0 | ||
|
|
3490c96b46 | ||
|
|
8ae86bbb4a | ||
|
|
db9c0fe466 | ||
|
|
109a50f048 | ||
|
|
b258a6594e |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -61,7 +61,7 @@ jobs:
|
||||
git config --local user.name "github-actions[bot]"
|
||||
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
git checkout -b release
|
||||
git add *.txt *.sha256sum dlc.dat dlc.dat.zip dlc.dat.xz
|
||||
git add *.txt *.sha256sum dlc.dat dlc.dat_plain.yml dlc.dat.zip dlc.dat.xz
|
||||
git commit -m "${{ env.RELEASE_NAME }}"
|
||||
git remote add origin "https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}"
|
||||
git push -f -u origin release
|
||||
|
||||
2
.github/workflows/test-pr.yml
vendored
2
.github/workflows/test-pr.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
||||
mv dlc.dat TEST-${{ github.run_number }}-dlc.dat
|
||||
|
||||
- name: Upload TEST-${{ github.run_number }}-dlc.dat
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: TEST-${{ github.run_number }}-dlc.dat
|
||||
path: TEST-${{ github.run_number }}-dlc.dat
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -4,9 +4,9 @@
|
||||
/domain-list-community
|
||||
/domain-list-community.exe
|
||||
|
||||
# Generated dat file.
|
||||
dlc.dat
|
||||
# Generated dat files.
|
||||
/*.dat
|
||||
|
||||
# Exported plaintext lists.
|
||||
/*.yml
|
||||
/*.txt
|
||||
/*.yml
|
||||
|
||||
13
data/amazon
13
data/amazon
@@ -33,6 +33,7 @@ aboutamazon.in
|
||||
aboutamazon.it
|
||||
aboutamazon.jp
|
||||
aboutamazon.pl
|
||||
aboutamazon.sg
|
||||
alexafund.cn @cn
|
||||
alexafund.com.cn @cn
|
||||
amaaozn.com
|
||||
@@ -42,24 +43,35 @@ amazon-lantern.com
|
||||
amazon-launchpad.com
|
||||
amazon.ae
|
||||
amazon.ca
|
||||
amazon.cl
|
||||
amazon.cn @cn
|
||||
amazon.co.jp
|
||||
amazon.co.uk
|
||||
amazon.co.za
|
||||
amazon.com
|
||||
amazon.com.au
|
||||
amazon.com.be
|
||||
amazon.com.br
|
||||
amazon.com.co
|
||||
amazon.com.mx
|
||||
amazon.com.ng
|
||||
amazon.com.tr
|
||||
amazon.de
|
||||
amazon.dev
|
||||
amazon.eg
|
||||
amazon.es
|
||||
amazon.fr
|
||||
amazon.ie
|
||||
amazon.in
|
||||
amazon.it
|
||||
amazon.jobs
|
||||
amazon.jp
|
||||
amazon.lu
|
||||
amazon.nl
|
||||
amazon.pl
|
||||
amazon.red
|
||||
amazon.sa
|
||||
amazon.se
|
||||
amazon.sg
|
||||
amazonalexavoxcon.com
|
||||
amazonauthorinsights.com
|
||||
@@ -103,6 +115,7 @@ media-amazon.com
|
||||
primeday.cn @cn
|
||||
primeday.com.cn @cn
|
||||
primeday.info
|
||||
seattlespheres.com
|
||||
siege-amazon.com
|
||||
ssl-images-amazon.com
|
||||
ueberamazon.de
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
annas-archive.gd
|
||||
annas-archive.gl
|
||||
annas-archive.in
|
||||
annas-archive.li
|
||||
annas-archive.org
|
||||
annas-archive.pk
|
||||
annas-archive.pm
|
||||
annas-archive.se
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
anthropic.com
|
||||
clau.de
|
||||
claude.ai
|
||||
claude.com
|
||||
claudeusercontent.com
|
||||
claudemcpclient.com
|
||||
claudeusercontent.com
|
||||
|
||||
# CDN
|
||||
full:servd-anthropic-website.b-cdn.net
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
apkmirror.com
|
||||
|
||||
full:apkmirror.disqus.com
|
||||
|
||||
@@ -752,6 +752,7 @@ courier-push-apple.com.akadns.net
|
||||
full:amp-api-edge-lb-cn.itunes-apple.com.akadns.net @cn
|
||||
full:amp-api-edge-lb.itunes-apple.com.akadns.net @cn
|
||||
full:amp-api-edge.apps.apple.com @cn
|
||||
full:amp-api-edge.music.apple.com @cn
|
||||
full:amp-api-search-edge.apps.apple.com @cn
|
||||
full:amp-api.apps.apple.com @cn
|
||||
full:amp-api.music.apple.com @cn
|
||||
@@ -782,6 +783,8 @@ full:js-cdn.music.apple.com @cn
|
||||
full:km.support.apple.com @cn
|
||||
full:maps.apple.com @cn
|
||||
full:misc-assets.itunes.apple.com @cn
|
||||
full:musicstatus.music.apple.com @cn
|
||||
full:mvod.itunes.apple.com @cn
|
||||
full:myapp.itunes.apple.com @cn
|
||||
full:np-edge.itunes.apple.com @cn
|
||||
full:osxapps.itunes.apple.com @cn
|
||||
@@ -794,6 +797,7 @@ full:se2.itunes.apple.com @cn
|
||||
full:search.itunes.apple.com @cn
|
||||
full:sf-api-token-service.itunes.apple.com @cn
|
||||
full:sp.itunes.apple.com @cn
|
||||
full:speedysub.music.apple.com @cn
|
||||
full:streamingaudio.itunes.apple.com @cn
|
||||
full:su.itunes.apple.com @cn
|
||||
full:sync.itunes.apple.com @cn
|
||||
|
||||
1
data/aws
1
data/aws
@@ -40,6 +40,7 @@ awssecworkshops.com
|
||||
awsstatic.com
|
||||
awsthinkbox.com
|
||||
awstrack.me
|
||||
awswaf.com
|
||||
cdkworkshop.com
|
||||
cloudfront.com
|
||||
cloudfront.net
|
||||
|
||||
@@ -64,6 +64,7 @@ shifen.com
|
||||
smartapps.cn
|
||||
tieba.com
|
||||
tiebaimg.com
|
||||
xdrtc.com
|
||||
xianfae.com
|
||||
xiaodutv.com
|
||||
yoojia.com
|
||||
|
||||
@@ -30,14 +30,20 @@ clipdrop.co
|
||||
jasper.ai
|
||||
|
||||
chutes.ai
|
||||
clawhub.ai
|
||||
copilot.microsoft.com
|
||||
devin.ai
|
||||
diabrowser.com
|
||||
diabrowser.engineering
|
||||
dify.ai
|
||||
duck.ai
|
||||
gateway.ai.cloudflare.com
|
||||
h2o.ai
|
||||
kiro.dev
|
||||
lovart.ai
|
||||
meta.ai
|
||||
mistral.ai
|
||||
openart.ai
|
||||
openclaw.ai
|
||||
openrouter.ai
|
||||
spicywriter.com
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
include:apkcombo
|
||||
include:apkmirror
|
||||
include:apkpure
|
||||
|
||||
# Uptodown
|
||||
uptodown.com
|
||||
utdstc.com
|
||||
|
||||
@@ -5,6 +5,10 @@ alfabank.ru
|
||||
gazprombank.ru
|
||||
gpb.ru
|
||||
|
||||
# Mts dengi
|
||||
dbo-dengi.online
|
||||
mtsdengi.ru
|
||||
|
||||
# PSB Bank
|
||||
psbank.ru
|
||||
|
||||
@@ -28,5 +32,9 @@ cdn-tinkoff.ru
|
||||
tbank-online.com
|
||||
tbank.ru
|
||||
|
||||
# Tochka bank
|
||||
tochka-tech.com
|
||||
tochka.com
|
||||
|
||||
# VTB Bank
|
||||
vtb.ru
|
||||
|
||||
@@ -3,6 +3,7 @@ include:cdn77
|
||||
include:cloudflare
|
||||
include:fastly
|
||||
include:imgix
|
||||
include:jsdelivr
|
||||
include:limelight
|
||||
include:pagecdn
|
||||
include:quantil
|
||||
@@ -13,3 +14,6 @@ include:vrcdn
|
||||
b-cdn.net
|
||||
bunny.net
|
||||
bunnycdn.com
|
||||
|
||||
# cdnjs
|
||||
cdnjs.com
|
||||
|
||||
@@ -66,6 +66,7 @@ include:openweather
|
||||
include:oracle
|
||||
include:panasonic
|
||||
include:pccw
|
||||
include:plex
|
||||
include:qnap
|
||||
include:qualcomm
|
||||
include:qwant
|
||||
|
||||
@@ -35,6 +35,7 @@ bitmex.com
|
||||
bitquick.co
|
||||
bitstamp.net
|
||||
bittrex.com
|
||||
blockchain.com
|
||||
blockfrost.io
|
||||
btcbox.co.jp
|
||||
cex.io
|
||||
|
||||
@@ -33,22 +33,17 @@ include:java
|
||||
include:jetbrains
|
||||
include:jetbrains-ai
|
||||
include:jfrog
|
||||
include:jsdelivr
|
||||
include:kubernetes
|
||||
include:microsoft-dev
|
||||
include:mongodb
|
||||
include:nginx
|
||||
include:nixos
|
||||
include:openwrt
|
||||
include:osdn
|
||||
include:perl
|
||||
include:polymer
|
||||
include:python
|
||||
include:python-community
|
||||
include:qt
|
||||
include:readthedocs
|
||||
include:redis
|
||||
include:remirepo
|
||||
include:ruby
|
||||
include:rust
|
||||
include:redhat
|
||||
@@ -59,10 +54,9 @@ include:stackexchange
|
||||
include:strikingly
|
||||
include:termux
|
||||
include:thelinuxfoundation
|
||||
include:topcoder
|
||||
include:tilda
|
||||
include:unity
|
||||
include:v8
|
||||
include:vim
|
||||
|
||||
adventofcode.com
|
||||
alpinelinux.org
|
||||
@@ -71,11 +65,11 @@ artixlinux.org
|
||||
atom.io
|
||||
badgen.net
|
||||
bitvise.com
|
||||
cdnjs.com
|
||||
centos.org
|
||||
chocolatey.org
|
||||
clojure.org
|
||||
cnpmjs.org
|
||||
cve.org
|
||||
cygwin.com
|
||||
cython.org
|
||||
deno.com
|
||||
@@ -123,16 +117,20 @@ notepad-plus-plus.org
|
||||
openresty.org
|
||||
openssl.org
|
||||
opensuse.org
|
||||
osdn.net
|
||||
packagecloud.io
|
||||
packagist.org
|
||||
pcre.org
|
||||
phantomjs.org
|
||||
php.net
|
||||
piwheels.org
|
||||
postgresql.org
|
||||
putty.org
|
||||
r-project.org
|
||||
raspberrypi.org
|
||||
raspbian.org
|
||||
regex101.com
|
||||
remirepo.net
|
||||
rpmfusion.org
|
||||
scientificlinux.org
|
||||
scoop.sh
|
||||
@@ -142,9 +140,11 @@ sqlite.org
|
||||
sublimetext.com
|
||||
tampermonkey.net
|
||||
termius.com
|
||||
topcoder.com
|
||||
unpkg.com
|
||||
videojs.com
|
||||
videolan.org
|
||||
vim.org
|
||||
wapm.io
|
||||
wasmer.io
|
||||
webflow.com
|
||||
@@ -153,4 +153,5 @@ wireshark.org
|
||||
x.org
|
||||
xposed.info
|
||||
yarnpkg.com
|
||||
ziglang.org
|
||||
zsh.org
|
||||
|
||||
@@ -25,3 +25,4 @@ jinrishici.com
|
||||
openvela.com
|
||||
pingcode.com
|
||||
tipdm.org
|
||||
zuidaima.com
|
||||
|
||||
@@ -1,2 +1,13 @@
|
||||
include:doc88
|
||||
include:docin
|
||||
1ppt.com
|
||||
360doc.com
|
||||
52ppt.com
|
||||
badou.com
|
||||
book118.com
|
||||
doc88.com
|
||||
docin.com
|
||||
douding.cn
|
||||
haohaodoc.com
|
||||
lazyer.net
|
||||
renrendoc.com
|
||||
wenkeju.com
|
||||
ypppt.com
|
||||
|
||||
@@ -10,6 +10,8 @@ include:shanbay
|
||||
include:xueersi
|
||||
include:yuanfudao
|
||||
|
||||
edu.cn
|
||||
|
||||
# 雨课堂
|
||||
include:yuketang
|
||||
## 雨豆课堂
|
||||
@@ -19,8 +21,6 @@ yushiyan.net
|
||||
## 学堂在线
|
||||
xuetangx.com
|
||||
|
||||
edu.cn
|
||||
|
||||
# 国家智慧教育公共服务平台
|
||||
cbern.com.cn
|
||||
smartedu.cn
|
||||
@@ -118,6 +118,11 @@ llscdn.com
|
||||
llsserver.com
|
||||
# 马哥教育
|
||||
magedu.com
|
||||
# 墨墨背单词
|
||||
maimemo.com
|
||||
maimemostatus.com
|
||||
# 墨墨记忆卡
|
||||
markji.com
|
||||
# CIS NanoMasters
|
||||
neoscholar.com
|
||||
neoschool.com
|
||||
@@ -127,6 +132,8 @@ oldboyedu.com
|
||||
pigai.org
|
||||
# 公考知识库
|
||||
saduck.top
|
||||
# 外研在线
|
||||
unipus.cn
|
||||
# 未来云校
|
||||
weilaiyunxiao.com
|
||||
# 北京嘉瑞新创教育咨询有限公司
|
||||
|
||||
@@ -97,6 +97,7 @@ omobi.cc
|
||||
oranum.com
|
||||
overcast.fm
|
||||
qobuz.com
|
||||
sendvid.com
|
||||
syosetu.com
|
||||
weverse.io
|
||||
yande.re
|
||||
|
||||
@@ -44,6 +44,8 @@ ldmnq.com
|
||||
lsplayer.com
|
||||
yeshen.com
|
||||
|
||||
# 172Mix 舞曲音乐
|
||||
172mix.com
|
||||
# 17K小说
|
||||
17k.com
|
||||
# https://github.com/supzhang/epg
|
||||
@@ -55,14 +57,19 @@ anitabi.cn
|
||||
# 暴风影音
|
||||
baofeng.com
|
||||
baofeng.net
|
||||
# 街机地图
|
||||
bemanicn.com
|
||||
# 布咕阅读
|
||||
bgwxc.com
|
||||
# B站空降助手
|
||||
bsbsb.top
|
||||
# CdkeyNoGap
|
||||
cdkeynogap.com
|
||||
# 动漫之家 #703
|
||||
dmzj.com
|
||||
muwai.com
|
||||
# 懂球帝
|
||||
dongdianqiu.com
|
||||
dongqiudi.com
|
||||
# 飞卢小说
|
||||
faloo.com
|
||||
|
||||
@@ -11,6 +11,7 @@ include:okko
|
||||
include:wink
|
||||
24h.tv
|
||||
amediateka.ru
|
||||
beeline.tv
|
||||
ivi.ru
|
||||
premier.one
|
||||
smotreshka.tv
|
||||
|
||||
@@ -13,7 +13,7 @@ include:gaijin
|
||||
include:garena
|
||||
include:gog
|
||||
include:hoyoverse
|
||||
include:illusion
|
||||
# Dead include:illusion
|
||||
include:itchio
|
||||
include:lowiro
|
||||
include:modrinth
|
||||
@@ -55,6 +55,7 @@ joinsquad.com
|
||||
loverslab.com
|
||||
minecraft.wiki
|
||||
mobimon.com.tw
|
||||
muvluv-girls-garden.com
|
||||
nexus-cdn.com
|
||||
nexusmods.com
|
||||
noxygames.com
|
||||
|
||||
@@ -18,8 +18,10 @@ cbr.ru # Central Bank of Russia
|
||||
cikrf.ru # Central Electoral Commission of the Russian Federation
|
||||
ebs.ru # Unified Biometric System
|
||||
goskey.ru # GosKey - an electronic signature on a smartphone
|
||||
grfc.ru # General radio frequency center
|
||||
izbirkom.ru # Information on ongoing elections and referendums
|
||||
kremlin.ru # Online representation of the President of Russia
|
||||
mil.ru # Ministry of Defense of the Russian Federation
|
||||
nalog.ru # Federal Tax Service
|
||||
xn--80ajghhoc2aj1c8b.xn--p1ai # Honest Sign - State Labeling System
|
||||
|
||||
|
||||
@@ -1,66 +1,144 @@
|
||||
include:ipip
|
||||
|
||||
2ip.io
|
||||
2ip.ru
|
||||
2ip.ua
|
||||
51degrees.com
|
||||
abstractapi.com
|
||||
apiip.net
|
||||
apivoid.com
|
||||
bigdatacloud.net
|
||||
check-host.net
|
||||
checkip.org
|
||||
checkip.ru
|
||||
country.is
|
||||
curlmyip.net
|
||||
dadata.ru
|
||||
db-ip.com
|
||||
extreme-ip-lookup.com
|
||||
find-my-ip.com
|
||||
find-my-ip.net
|
||||
findip.net
|
||||
flagfox.net
|
||||
fraudguard.io
|
||||
fraudlogix.com
|
||||
freegeoip.app
|
||||
freeipapi.com
|
||||
geodatatool.com
|
||||
geoip.noc.gov.ru
|
||||
geojs.io
|
||||
geolocation-db.com
|
||||
geoplugin.com
|
||||
geoplugin.net
|
||||
getipintel.net
|
||||
greip.io
|
||||
hackertarget.com
|
||||
httpbin.org
|
||||
icanhazip.com
|
||||
ident.me
|
||||
ifconfig.co
|
||||
ifconfig.es
|
||||
ifconfig.me
|
||||
ip-adress.com
|
||||
ip-api.com
|
||||
ip-api.io
|
||||
ip-api.ru
|
||||
ip-check.info
|
||||
ip-score.com
|
||||
ip.me
|
||||
ip.sb
|
||||
ip2c.org
|
||||
ip2location.com
|
||||
ip2location.io
|
||||
ip2ruscity.com
|
||||
ip4.me
|
||||
ip6.me
|
||||
ip6only.me
|
||||
ip8.com
|
||||
ipaddr.site
|
||||
ipaddress.com
|
||||
ipaddress.my
|
||||
ipaddress.sh
|
||||
ipapi.co
|
||||
ipapi.com
|
||||
ipapi.is
|
||||
ipbase.com
|
||||
ipcalf.com
|
||||
ipchicken.com
|
||||
ipdata.co
|
||||
ipecho.net
|
||||
ipfind.io
|
||||
ipfinder.io
|
||||
ipgeolocation.io
|
||||
ipify.org
|
||||
ipinfo.io
|
||||
iplark.com @cn
|
||||
ipleak.net
|
||||
ipligence.com
|
||||
iplocate.io
|
||||
iplocation.com
|
||||
iplocation.io
|
||||
iplocation.net
|
||||
ipqualityscore.com
|
||||
ipquery.io
|
||||
ipregistry.co
|
||||
iproyal.com
|
||||
ipstack.com
|
||||
ipverify.com
|
||||
ipw.cn @cn
|
||||
ipwhois.io
|
||||
ipxapi.com
|
||||
l2.io
|
||||
maxmind.com
|
||||
mon-ip.com
|
||||
monip.org
|
||||
my.ipinfo.app
|
||||
myexternalip.com
|
||||
myip.com
|
||||
myip.ms
|
||||
myip.ru
|
||||
myipaddress.com
|
||||
myiplookup.com
|
||||
mylocation.org
|
||||
osint.sh
|
||||
proxycheck.io
|
||||
realip.cc
|
||||
seeip.org
|
||||
showmyip.com
|
||||
showmyipaddress.com
|
||||
spur.us
|
||||
sxgeo.city
|
||||
sypexgeo.net
|
||||
tnx.nl
|
||||
tracemyip.org
|
||||
trustmyip.com
|
||||
wgetip.com
|
||||
whatismyip.com
|
||||
whatismyip.net
|
||||
whatismyip.org
|
||||
whatismyipaddress.com
|
||||
whatismyipaddress.net
|
||||
whatismyisp.com
|
||||
whatismyv6.com
|
||||
whatsmyip.com
|
||||
whatsmyip.org
|
||||
where-am-i.co
|
||||
whoer.net
|
||||
whoerip.com
|
||||
whoisxmlapi.com
|
||||
wieistmeineip.de
|
||||
wtfismyip.com
|
||||
|
||||
# Subdomains/internal api used for ip-geo-detect
|
||||
full:checkip.amazonaws.com
|
||||
full:ipv4-check-perf.radar.cloudflare.com
|
||||
full:ipv6-check-perf.radar.cloudflare.com
|
||||
geoip.noc.gov.ru
|
||||
ip.hetzner.com
|
||||
ip.mail.ru
|
||||
ip.nic.ru
|
||||
ip.tyk.nu
|
||||
ipgeo.vercel.app
|
||||
ipv4-internet.yandex.net
|
||||
ipv6-internet.yandex.net
|
||||
whois.pconline.com.cn @cn
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
# Part of Chinese entities but exclusively serving for non-cn area
|
||||
|
||||
include:alibaba @!cn
|
||||
include:anker @!cn
|
||||
include:bilibili @!cn
|
||||
include:boc @!cn
|
||||
include:bytedance @!cn
|
||||
include:ccb @!cn
|
||||
include:chinamobile @!cn
|
||||
include:chinatelecom @!cn
|
||||
include:chinaunicom @!cn
|
||||
include:citic @!cn
|
||||
include:cmb @!cn
|
||||
include:ctrip @!cn
|
||||
include:deepin @!cn
|
||||
include:dewu @!cn
|
||||
include:didi @!cn
|
||||
include:eastmoney @!cn
|
||||
include:huawei @!cn
|
||||
include:icbc @!cn
|
||||
include:ipip @!cn
|
||||
include:iqiyi @!cn
|
||||
include:jd @!cn
|
||||
include:oppo @!cn
|
||||
include:pingan @!cn
|
||||
include:sina @!cn
|
||||
include:tencent @!cn
|
||||
include:vivo @!cn
|
||||
include:xd @!cn
|
||||
include:xiaohongshu @!cn
|
||||
include:xiaomi @!cn
|
||||
@@ -25,8 +25,9 @@ include:hentaichen
|
||||
include:hentaivn
|
||||
include:heyzo
|
||||
include:hooligapps
|
||||
include:illusion
|
||||
# Dead include:illusion
|
||||
include:illusion-nonofficial
|
||||
include:illgames
|
||||
include:jable
|
||||
include:japonx
|
||||
include:javbus
|
||||
@@ -137,6 +138,7 @@ porn
|
||||
18hmanga.com
|
||||
18insta.com
|
||||
18j.tv
|
||||
18jav.tv
|
||||
18jms.com
|
||||
18mh.co
|
||||
18mh.me
|
||||
@@ -2223,6 +2225,8 @@ heavyfetish.com
|
||||
hegre.com
|
||||
heiguab.top
|
||||
heijidi.life
|
||||
heiliao.com
|
||||
heiliao88.com
|
||||
heise360181.buzz
|
||||
heise360182.buzz
|
||||
helixstudios.net
|
||||
@@ -2690,12 +2694,14 @@ jasmin.com
|
||||
jav-angel.net
|
||||
jav-subtitles.com
|
||||
jav-vr.net
|
||||
jav.com.co
|
||||
jav.dog
|
||||
jav.gallery
|
||||
jav.guru
|
||||
jav.la
|
||||
jav.land
|
||||
jav.place
|
||||
jav.sb
|
||||
jav.si
|
||||
jav.wine
|
||||
jav01.cc
|
||||
@@ -2758,6 +2764,7 @@ javhdporn.net
|
||||
javher.com
|
||||
javheroine.com
|
||||
javhihi.com
|
||||
javhub.com
|
||||
javhub.me
|
||||
javhub.net
|
||||
javidol.org
|
||||
@@ -2791,7 +2798,9 @@ javprime.net
|
||||
javpub.me
|
||||
javpush.com
|
||||
javqd.com
|
||||
javquick.com
|
||||
javrank.com
|
||||
javrate.com
|
||||
javrave.club
|
||||
javroot.com
|
||||
javscat.net
|
||||
@@ -2816,6 +2825,7 @@ javtrust.com
|
||||
javtube.cc
|
||||
javtube.com
|
||||
javtube.net
|
||||
javvideoporn.com
|
||||
javvids.com
|
||||
javxspot.com
|
||||
javxxx.me
|
||||
@@ -3587,6 +3597,7 @@ ninpu.cyou
|
||||
niuc2.com
|
||||
niziero.info
|
||||
njav.tv
|
||||
njavtv.com
|
||||
nlsexfilmpjes.com
|
||||
nlt-media.com
|
||||
noc.syosetu.com
|
||||
@@ -5566,9 +5577,6 @@ xgtd3.com
|
||||
xgtdr.buzz
|
||||
xh-porn.com
|
||||
xh.video
|
||||
xhamster.com
|
||||
xhamster.desi
|
||||
xhamster2.com
|
||||
xhot.pro
|
||||
xhub.tv
|
||||
xiangrikui-app.com
|
||||
@@ -6157,6 +6165,7 @@ regexp:(^|\.)tqav[1-9][0-9]\.com$
|
||||
regexp:(^|\.)tt[1-2][0-9]\.tv$
|
||||
regexp:(^|\.)ttghg[1-9][0-9]\.xyz$
|
||||
regexp:(^|\.)tttv([1-9][0-9]?|100)\.com$
|
||||
regexp:(^|\.)twav[1-9]\.xyz$
|
||||
regexp:(^|\.)twseb([1-9][0-9]?)?\.com$
|
||||
regexp:(^|\.)uu[a-z][1-9][0-9]?\.com$
|
||||
regexp:(^|\.)whtdh0[1-3]\.cc$
|
||||
|
||||
@@ -24,10 +24,15 @@ spvb.ru # Saint-Petersburg Stock Exchange
|
||||
# Financial marketplace
|
||||
banki.ru
|
||||
finuslugi.ru
|
||||
# Investment
|
||||
sistema-capital.com
|
||||
# Mir payment system
|
||||
mirpayonline.ru
|
||||
# National Payment Card System
|
||||
nspk.ru
|
||||
# Tipping service
|
||||
netmonet.co
|
||||
tips.tips
|
||||
|
||||
# Telecom operators
|
||||
beeline.ru
|
||||
@@ -49,4 +54,6 @@ ngenix.net # NGENIX is a Russian provider of acceleration and security servi
|
||||
pochta.ru # Russian post
|
||||
qms.ru # Russian internet speed testing service
|
||||
rustore.ru # RuStore is a Russian mobile app store for Android
|
||||
t1.cloud # Russian cloud storage provider
|
||||
taxsee.com # Taxi for business (self-employed drivers)
|
||||
yclients.com # Russian SaaS platform for online booking and business automation for service companies
|
||||
|
||||
@@ -8,7 +8,6 @@ include:doi
|
||||
include:elsevier
|
||||
include:google-scholar
|
||||
include:ieee
|
||||
include:knovel
|
||||
include:mit
|
||||
include:proquest
|
||||
include:sci-hub
|
||||
|
||||
@@ -6,9 +6,20 @@ include:instagram
|
||||
include:linkedin
|
||||
include:mailru
|
||||
include:misskey
|
||||
include:mixi
|
||||
include:ok
|
||||
include:threads
|
||||
include:twitter
|
||||
include:vk
|
||||
|
||||
onlyfans.com
|
||||
truthsocial.com
|
||||
|
||||
# Mastodon
|
||||
# * We can not make a comprehensive domain list of all Mastodon instances.
|
||||
# * Many more dynamic/random instance domains are not listed here.
|
||||
# * geosite:mastodon is not provided to avoid creating excessive expectations among users.
|
||||
joinmastodon.org
|
||||
mastodon.online
|
||||
mastodon.social
|
||||
pawoo.net
|
||||
|
||||
@@ -3,33 +3,62 @@ include:openspeedtest
|
||||
|
||||
cnspeedtest.cn @cn
|
||||
fast.com
|
||||
fastspeedtest.com
|
||||
linkmeter.net
|
||||
measurementlab.net
|
||||
meter.net
|
||||
nperf.com
|
||||
openspeedtest.ru
|
||||
speed.cloudflare.com
|
||||
speed.dler.io
|
||||
speed.ee
|
||||
speed.hinet.net
|
||||
speed.nccu.edu.tw
|
||||
speed.neu6.edu.cn @cn
|
||||
speed.nju.edu.cn @cn
|
||||
speed.nuaa.edu.cn @cn
|
||||
speed.qlu.edu.cn @cn
|
||||
speed.ujs.edu.cn @cn
|
||||
speed6.ujs.edu.cn @cn
|
||||
speed2.hinet.net
|
||||
speed5.ntu.edu.tw
|
||||
speed6.ujs.edu.cn @cn
|
||||
speedcheck.org
|
||||
speedgeo.net
|
||||
speedof.me
|
||||
speedtest.cesnet.cz
|
||||
speedtest.ch
|
||||
speedtest.citylink.pro
|
||||
speedtest.cn @cn
|
||||
speedtest.co.za
|
||||
speedtest.de
|
||||
speedtest.dno-it.ru
|
||||
speedtest.frontier.com
|
||||
speedtest.im
|
||||
speedtest.mail.ru
|
||||
speedtest.mfcyun.com @cn
|
||||
speedtest.net.in
|
||||
speedtest.net.ua
|
||||
speedtest.net.uk
|
||||
speedtest.org
|
||||
speedtest.rt.ru
|
||||
speedtest.ru
|
||||
speedtest.shaw.ca
|
||||
speedtest.shu.edu.cn @cn
|
||||
speedtest6.shu.edu.cn @cn
|
||||
speedtest.su
|
||||
speedtest.uz
|
||||
speedtest.volia.com
|
||||
speedtest.xaut.edu.cn @cn
|
||||
speedtest.xfinity.com
|
||||
speedtestcustom.com
|
||||
test.ustc.edu.cn @cn
|
||||
test6.ustc.edu.cn @cn
|
||||
speedtest.xyz
|
||||
speedtest24.ru
|
||||
speedtest6.shu.edu.cn @cn
|
||||
test.nju.edu.cn @cn
|
||||
test.ustc.edu.cn @cn
|
||||
test6.nju.edu.cn @cn
|
||||
speed.nju.edu.cn @cn
|
||||
test6.ustc.edu.cn @cn
|
||||
testmy.net
|
||||
testmyspeed.com
|
||||
testskorosti.ru
|
||||
xnfz.seu.edu.cn @cn
|
||||
|
||||
full:hk-global-bgp.hkg.speedtest.yecaoyun.com @!cn
|
||||
|
||||
3
data/category-urlshortner
Normal file
3
data/category-urlshortner
Normal file
@@ -0,0 +1,3 @@
|
||||
include:bitly
|
||||
include:shorturl
|
||||
include:tinyurl
|
||||
@@ -1,3 +1,4 @@
|
||||
allhistory.com
|
||||
fgo.wiki
|
||||
jikipedia.com
|
||||
mbalib.com
|
||||
|
||||
@@ -16,6 +16,9 @@ miguvideo.com
|
||||
# 中移金科
|
||||
cmft.com.cn
|
||||
|
||||
# 中移支付 和包
|
||||
cmpay.com
|
||||
|
||||
# 中移在线
|
||||
cmcc-cs.cn
|
||||
online-cmcc.cn
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
include:ctexcel
|
||||
|
||||
189.cn
|
||||
bestpay.cn
|
||||
bestpay.com.cn
|
||||
chinatelecom-h.com
|
||||
chinatelecom.com.cn
|
||||
chinatelecomglobal.com @!cn
|
||||
chinatelecomhk.com @!cn
|
||||
chntel.com
|
||||
vnet.cn
|
||||
|
||||
chinatelecomhk.com @!cn
|
||||
|
||||
@@ -18,6 +18,7 @@ cuguplus.com @!cn
|
||||
cuniq.com @!cn
|
||||
cuniq.sg @!cn
|
||||
mychinaunicom.com
|
||||
unicompayment.com
|
||||
wo.cn
|
||||
wo.com.cn
|
||||
wo116114.com
|
||||
|
||||
1
data/cn
1
data/cn
@@ -2,4 +2,3 @@
|
||||
|
||||
include:tld-cn
|
||||
include:geolocation-cn
|
||||
#include:category-non-domestic-cn
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
chobit.cc
|
||||
ci-en.jp
|
||||
ci-en.net
|
||||
dlaf.jp
|
||||
dlsite.com
|
||||
dlsite.com.tw
|
||||
dlsite.jp
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
doc88.com
|
||||
@@ -1,2 +0,0 @@
|
||||
docin.com
|
||||
douding.cn
|
||||
@@ -65,3 +65,6 @@ supercachenode.com
|
||||
ultracachenode.com
|
||||
woaihuoshan.com
|
||||
wohst8.com
|
||||
|
||||
# 抖音支付
|
||||
douyinpay.com
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# This list contains domains that don't have access point in China mainland. This is opposite to geolocation-cn.
|
||||
|
||||
# Part of Chinese entities but exclusively serving for non-cn area
|
||||
include:category-non-domestic-cn
|
||||
|
||||
# AI Chat
|
||||
include:category-ai-!cn
|
||||
|
||||
@@ -48,6 +45,8 @@ include:paypal
|
||||
include:softbank
|
||||
include:stripe
|
||||
include:visa
|
||||
## アプリペイ
|
||||
app-pay.jp
|
||||
|
||||
# CDN companies & Services
|
||||
include:category-cdn-!cn
|
||||
@@ -86,7 +85,6 @@ include:embl
|
||||
include:freecodecamp
|
||||
include:kaggle
|
||||
include:khanacademy
|
||||
include:knovel
|
||||
include:laracasts
|
||||
include:libgen
|
||||
include:lifewire
|
||||
@@ -159,6 +157,7 @@ include:category-enhance-gaming
|
||||
include:category-mobile-repair
|
||||
include:category-ntp
|
||||
include:category-password-management
|
||||
include:category-urlshortner
|
||||
include:category-web-archive
|
||||
include:decryptipastore # iOS
|
||||
|
||||
@@ -173,7 +172,6 @@ include:addtoany
|
||||
include:adguard
|
||||
include:aptoide
|
||||
include:arphic
|
||||
include:bitly
|
||||
include:blender
|
||||
include:brightcove
|
||||
include:buymeacoffee
|
||||
@@ -227,7 +225,6 @@ include:sb
|
||||
include:setapp
|
||||
include:sharethis
|
||||
include:shopify
|
||||
include:shorturl
|
||||
include:slideshare
|
||||
include:sourceforge
|
||||
include:squareup
|
||||
@@ -237,7 +234,6 @@ include:svp
|
||||
include:test-ipv6
|
||||
include:tex
|
||||
include:tidelift
|
||||
include:tinyurl
|
||||
include:trello
|
||||
include:tumblr
|
||||
include:tutanota
|
||||
@@ -262,6 +258,10 @@ cookielaw.org
|
||||
onetrust.com
|
||||
osano.com
|
||||
usercentrics.eu
|
||||
## Dynatrace
|
||||
dynatrace.com
|
||||
## FamilySearch
|
||||
familysearch.org
|
||||
## Greasy Fork
|
||||
greasyfork.org
|
||||
## Online LaTeX Editor
|
||||
@@ -311,7 +311,6 @@ wiki.gg
|
||||
|
||||
# Others
|
||||
include:avaxhome
|
||||
include:dlsite
|
||||
include:espressif
|
||||
include:familymart
|
||||
include:fzdm
|
||||
@@ -327,3 +326,5 @@ include:tsquare
|
||||
include:windy
|
||||
include:xdty
|
||||
include:xingrz
|
||||
|
||||
sinyalee.com
|
||||
|
||||
@@ -45,6 +45,8 @@ include:taikang
|
||||
|
||||
## 航财通·校园付
|
||||
cc-pay.cn
|
||||
## 合利宝
|
||||
helipay.com
|
||||
## 徽商期货有限责任公司
|
||||
hsqh.net
|
||||
## 上海陆金所
|
||||
@@ -53,6 +55,8 @@ lufax.com
|
||||
lufaxcdn.com
|
||||
## 银豹收银系统
|
||||
pospal.cn
|
||||
## 上海付费通
|
||||
shfft.com
|
||||
|
||||
# CDN or SDWAN
|
||||
include:category-cdn-cn
|
||||
@@ -180,6 +184,10 @@ wuyou.net # 无忧启动论坛
|
||||
x-station.cn # X电站
|
||||
znds.com # 智能电视网
|
||||
|
||||
# DCC Forum(心跳文学部中文论坛)
|
||||
edgemonix.top # 图床
|
||||
monika.love
|
||||
|
||||
423down.com # 423Down
|
||||
acwifi.net # 路由器技术分享
|
||||
appinn.com # 小众软件
|
||||
@@ -218,23 +226,65 @@ cma.cn
|
||||
nmc.cn
|
||||
|
||||
# Public transportation
|
||||
include:airchina # 中国国际航空
|
||||
include:hainanairlines # 海南航空
|
||||
## 中国国际航空
|
||||
include:airchina
|
||||
## 海南航空
|
||||
include:hainanairlines
|
||||
## 长安航空
|
||||
airchangan.com
|
||||
## 桂林航空
|
||||
airguilin.com
|
||||
## 中国东方航空
|
||||
ceair.com
|
||||
## 春秋航空
|
||||
ch.com
|
||||
china-sss.com
|
||||
springairlines.com
|
||||
## 华夏航空
|
||||
chinaexpressair.com
|
||||
## 中国南方航空
|
||||
csair.com
|
||||
## 中国联合航空
|
||||
flycua.com
|
||||
## 广西北部湾航空
|
||||
gxairlines.com
|
||||
## 河北航空
|
||||
hbhk.com.cn
|
||||
## 首都航空
|
||||
jdair.net
|
||||
## 吉祥航空
|
||||
juneyaoair.com
|
||||
## 长龙航空
|
||||
loongair.cn
|
||||
## 祥鹏航空
|
||||
luckyair.net
|
||||
## 山东航空
|
||||
sda.cn
|
||||
## 深圳航空
|
||||
shenzhenair.com
|
||||
## 四川航空
|
||||
sichuanair.com
|
||||
## 天津航空
|
||||
tianjin-air.com
|
||||
## 西藏航空
|
||||
tibetairlines.com.cn
|
||||
## 乌鲁木齐航空
|
||||
urumqi-air.com
|
||||
## 厦门航空
|
||||
xiamenair.com
|
||||
|
||||
## 中国民航局
|
||||
caac.gov.cn
|
||||
## 信天游(航空电子客票验真)
|
||||
travelskymobile.cn
|
||||
## 航旅纵横
|
||||
umetrip.com
|
||||
umetrip.com.cn
|
||||
umetrip.net.cn
|
||||
ume-trip.cn
|
||||
## 飞常准
|
||||
variflight.com
|
||||
|
||||
# 中国民航局 caac.gov.cn
|
||||
ceair.com # 中国东方航空
|
||||
chinaexpressair.com # 华夏航空
|
||||
csair.com # 中国南方航空
|
||||
flycua.com # 中国联合航空
|
||||
hbhk.com.cn # 河北航空
|
||||
jdair.net # 首都航空
|
||||
juneyaoair.com # 吉祥航空
|
||||
luckyair.net # 祥鹏航空
|
||||
sichuanair.com # 四川航空
|
||||
tibetairlines.com.cn # 西藏航空
|
||||
travelskymobile.cn # 信天游(航空电子客票验真)
|
||||
variflight.com # 飞常准
|
||||
xiamenair.com # 厦门航空
|
||||
## Railway
|
||||
12306.cn
|
||||
95306.cn
|
||||
@@ -249,11 +299,6 @@ kuajing84.com
|
||||
mygolbs.com
|
||||
## 宁停车
|
||||
ningtingche.com
|
||||
## 航旅纵横
|
||||
umetrip.com
|
||||
umetrip.com.cn
|
||||
umetrip.net.cn
|
||||
ume-trip.cn
|
||||
|
||||
# Science & Technology & Knowledge & Scholar & Press & E-learning & Education
|
||||
include:category-education-cn
|
||||
@@ -280,6 +325,10 @@ guoxuemi.com
|
||||
zyh365.com
|
||||
## 温州市图书馆
|
||||
wzlib.cn
|
||||
## 中国大百科全书
|
||||
zgbk.com
|
||||
## 浙江图书馆
|
||||
zjlib.cn
|
||||
|
||||
# Services & Softwares
|
||||
include:category-ai-cn
|
||||
@@ -417,6 +466,7 @@ xbext.com
|
||||
yinxiang.com
|
||||
## 智联招聘
|
||||
zhaopin.cn
|
||||
zhaopin.com
|
||||
|
||||
# Tech companies & Orginations
|
||||
include:aisiku # 北京艾斯酷科技有限公司
|
||||
@@ -487,6 +537,9 @@ hlgdata.com
|
||||
huanleguang.com
|
||||
ttxsapp.com.cn
|
||||
xsbapp.cn
|
||||
# 凯迪仕
|
||||
juziwulian.com
|
||||
kaadas.com
|
||||
|
||||
# Telecommunication
|
||||
include:chinabroadnet
|
||||
@@ -599,7 +652,6 @@ ycrx360.com
|
||||
35.com
|
||||
3533.com
|
||||
360aiyi.com
|
||||
360doc.com
|
||||
360jq.com
|
||||
360zhyx.com
|
||||
365azw.com
|
||||
@@ -636,7 +688,6 @@ ycrx360.com
|
||||
52z.com
|
||||
53kf.com
|
||||
55.com
|
||||
56.com
|
||||
5577.com
|
||||
55bbs.com
|
||||
58pic.com
|
||||
@@ -682,8 +733,6 @@ aiemy.com
|
||||
aiketour.com
|
||||
aiops.com
|
||||
aipai.com
|
||||
airchangan.com
|
||||
airguilin.com
|
||||
aiskycn.com
|
||||
aizhan.com
|
||||
aldwx.com # 京ICP备17030349号-1
|
||||
@@ -747,7 +796,6 @@ cecdc.com
|
||||
cecport.com
|
||||
centanet.com
|
||||
cerambath.org
|
||||
ch.com
|
||||
chachaba.com
|
||||
changba.com
|
||||
chaojituzi.net
|
||||
@@ -932,7 +980,6 @@ gupzs.com
|
||||
gushiwen.org
|
||||
guzhangting.com
|
||||
gwdang.com
|
||||
gxairlines.com
|
||||
gxb.io
|
||||
gzcqs.com
|
||||
gzwanju.com
|
||||
@@ -1290,7 +1337,6 @@ taoche.com
|
||||
te5.com
|
||||
tenxcloud.com
|
||||
tianjimedia.com
|
||||
tianjin-air.com
|
||||
tianlailive.com
|
||||
tietuku.com
|
||||
tiexue.net
|
||||
@@ -1326,7 +1372,6 @@ ucbug.com
|
||||
uggame.com
|
||||
uoko.com
|
||||
urselect.com
|
||||
urumqi-air.com
|
||||
useso.com
|
||||
uuu9.com
|
||||
uzzf.com
|
||||
@@ -1460,7 +1505,6 @@ youxigt.com
|
||||
youzu.com
|
||||
yoyojie.com
|
||||
yoyou.com
|
||||
ypppt.com
|
||||
yrz.name
|
||||
yslyhr.com
|
||||
ysten.com
|
||||
@@ -1491,7 +1535,6 @@ zhangyoubao.com
|
||||
zhanzhang.net
|
||||
zhaodanji.com
|
||||
zhaokao.net
|
||||
zhaopin.com
|
||||
zhcw.com
|
||||
zhenai.com
|
||||
zhibo8.cc
|
||||
@@ -1502,15 +1545,11 @@ zhongkao.com
|
||||
zhuangjiba.com
|
||||
zhuanyewanjia.com
|
||||
zhuayoukong.com
|
||||
zimuzu.io
|
||||
zixiaomao.com
|
||||
zixuntop.com
|
||||
zmengzhu.com
|
||||
zpb365.com
|
||||
zrblog.net
|
||||
zsxq.com
|
||||
zuhaowan.com
|
||||
zuidaima.com
|
||||
zuowen.com
|
||||
zuowen8.com
|
||||
zuowenwang.net
|
||||
@@ -1586,3 +1625,6 @@ ao-x.ac.cn
|
||||
|
||||
# 万集科技 京ICP备18036282号-2
|
||||
wanji.net.cn
|
||||
|
||||
# 广州市雅望互联网服务有限公司
|
||||
gzyowin.com
|
||||
|
||||
@@ -8,6 +8,7 @@ icloud-content.com
|
||||
icloud-isupport.com
|
||||
icloud-sandbox.com
|
||||
icloud.ch
|
||||
icloud.cn @cn
|
||||
icloud.com
|
||||
icloud.com.cn @cn
|
||||
icloud.de
|
||||
|
||||
3
data/illgames
Normal file
3
data/illgames
Normal file
@@ -0,0 +1,3 @@
|
||||
# Also known as "Illusion"
|
||||
illgames.jp
|
||||
japan-illgames.com
|
||||
@@ -1,2 +1,3 @@
|
||||
# Dead: https://en.wikipedia.org/wiki/Illusion_(company)
|
||||
illusion.co.jp
|
||||
illusion.jp
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
datalore.io
|
||||
intellij.com
|
||||
intellij.net
|
||||
intellij.org
|
||||
jb.gg
|
||||
jetbrains.cloud
|
||||
jetbrains.com
|
||||
jetbrains.net
|
||||
jetbrains.space
|
||||
jetbrains.team
|
||||
datalore.io
|
||||
kotlinlang.org
|
||||
youtrack.cloud
|
||||
|
||||
cdn.jetbrains.com @cn
|
||||
download-cdn.jetbrains.com.cn @cn
|
||||
jb.gg
|
||||
youtrack.cloud
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
esm.run
|
||||
jsdelivr.com
|
||||
jsdelivr.net
|
||||
esm.run
|
||||
|
||||
full:cdn.jsdelivr.net
|
||||
|
||||
@@ -3,6 +3,7 @@ kinopub.online
|
||||
kpdl.link
|
||||
|
||||
# Mirror sites
|
||||
ahc.ovh # sub domains mirror
|
||||
gfw.ovh # sub domains mirror
|
||||
mos-gorsud.co # kinopub domain to generate a mirror site through gfw.ovh
|
||||
|
||||
@@ -11,5 +12,6 @@ cdn-service.space
|
||||
cdn2cdn.com
|
||||
cdn2site.com
|
||||
pushbr.com # poster images CDN
|
||||
smarttvcdn.online
|
||||
|
||||
regexp:(\w+)-static-[0-9]+\.cdntogo\.net$
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
knovel.com
|
||||
@@ -9,3 +9,7 @@ max.ru
|
||||
memealerts.com
|
||||
oneme.ru
|
||||
tamtam.chat
|
||||
youla.io
|
||||
youla.ru
|
||||
|
||||
full:youla-web-static.mrgcdn.ru
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
missav.ai
|
||||
missav.com
|
||||
missav.live
|
||||
missav.uno
|
||||
missav.vip
|
||||
missav.ws
|
||||
missav123.com
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
include:firefox
|
||||
include:mdn
|
||||
include:rust
|
||||
|
||||
mozgcp.net
|
||||
mozilla.com
|
||||
@@ -24,7 +23,10 @@ seamonkey-project.org
|
||||
thunderbird.net
|
||||
|
||||
# Mozilla Location Service
|
||||
location.services.mozilla.com
|
||||
# * Overrided by above `mozilla.com`
|
||||
# * In March 2024, Mozilla announced the project was being discontinued
|
||||
#location.services.mozilla.com
|
||||
|
||||
# Mozilla Push Service
|
||||
push.services.mozilla.com
|
||||
# * Overrided by above `mozilla.com`
|
||||
#push.services.mozilla.com
|
||||
|
||||
@@ -32,6 +32,7 @@ static163.net
|
||||
ydstatic.com
|
||||
yeah.net
|
||||
youdao.com
|
||||
yunxindns.com
|
||||
yunxinfw.com
|
||||
zhuanzfx.com
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
nixos.org
|
||||
@@ -1,5 +1,6 @@
|
||||
22112211.xyz
|
||||
deepflood.com
|
||||
nodeget.com
|
||||
nodeimage.com
|
||||
nodequality.com
|
||||
nodeseek.com
|
||||
|
||||
@@ -59,6 +59,7 @@ tegrazone.com
|
||||
tegrazone.jp
|
||||
tegrazone.kr
|
||||
|
||||
full:nvidia.custhelp.com
|
||||
full:nvidia.tt.omtrdc.net
|
||||
|
||||
# NVIDIA 文件下载服务器中国镜像
|
||||
|
||||
3
data/ok
3
data/ok
@@ -1,3 +1,6 @@
|
||||
ok.ru
|
||||
okcdn.ru
|
||||
mycdn.me
|
||||
|
||||
full:st-ok-pts.cdn-vk.ru
|
||||
full:st-ok.cdn-vk.ru
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
# All .oracle domains
|
||||
oracle
|
||||
|
||||
include:addthis
|
||||
include:java
|
||||
|
||||
ateam-oracle.com
|
||||
bronto.com
|
||||
covid19-rx.org
|
||||
covid19rx.org
|
||||
custhelp.com
|
||||
oracle.com
|
||||
oraclecloud.com
|
||||
oraclefoundation.org
|
||||
@@ -12,6 +16,3 @@ oracleimg.com
|
||||
oracleinfinity.io
|
||||
sun.com
|
||||
virtualbox.org
|
||||
|
||||
include:addthis
|
||||
include:java
|
||||
|
||||
@@ -2,4 +2,5 @@ perplexity.ai
|
||||
perplexity.com
|
||||
pplx.ai
|
||||
|
||||
full:ppl-ai-file-upload.s3.amazonaws.com
|
||||
full:pplx-res.cloudinary.com
|
||||
|
||||
14
data/plex
Normal file
14
data/plex
Normal file
@@ -0,0 +1,14 @@
|
||||
# Plex Media Server domains
|
||||
# Basic domains for Plex services
|
||||
plex.com
|
||||
plex.services
|
||||
plex.tv
|
||||
plexapp.com
|
||||
|
||||
# Note for Plex users
|
||||
# * Plex's mechanism requires certain domains to go through a direct connection.
|
||||
# * Using a proxy for these domains may cause the system to malfunction.
|
||||
# * If you wish to access plex domains through a proxy, remember to ensure the following domains remain directly connected.
|
||||
# * Related domains:
|
||||
# plex.direct
|
||||
# v4.plex.tv
|
||||
@@ -22,7 +22,6 @@ internal
|
||||
|
||||
# References: https://www.iana.org/assignments/locally-served-dns-zones/locally-served-dns-zones.xhtml
|
||||
# https://www.rfc-editor.org/rfc/rfc6303.html
|
||||
0.in-addr.arpa
|
||||
2.0.192.in-addr.arpa
|
||||
10.in-addr.arpa
|
||||
16.172.in-addr.arpa
|
||||
@@ -47,7 +46,6 @@ internal
|
||||
168.192.in-addr.arpa
|
||||
254.169.in-addr.arpa
|
||||
255.255.255.255.in-addr.arpa
|
||||
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa
|
||||
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa
|
||||
8.b.d.0.1.0.0.2.ip6.arpa
|
||||
8.e.f.ip6.arpa
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
piwheels.org
|
||||
30
data/qcloud
30
data/qcloud
@@ -258,13 +258,14 @@ tdnsv14.net
|
||||
tdnsv15.net
|
||||
|
||||
# myqcloud inside mainland China
|
||||
regexp:\.(.+-)?ap-beijing(-.+)?\.myqcloud\.com$ #北京
|
||||
regexp:\.(.+-)?ap-nanjing(-.+)?\.myqcloud\.com$ #南京
|
||||
regexp:\.(.+-)?ap-shanghai(-.+)?\.myqcloud\.com$ #上海
|
||||
regexp:\.(.+-)?ap-guangzhou(-.+)?\.myqcloud\.com$ #广州
|
||||
regexp:\.(.+-)?ap-chengdu(-.+)?\.myqcloud\.com$ #成都
|
||||
regexp:\.(.+-)?ap-chongqing(-.+)?\.myqcloud\.com$ #重庆
|
||||
regexp:\.(.+-)?ap-shenzhen(-.+)?\.myqcloud\.com$ #深圳
|
||||
# overrided by myqcloud.com
|
||||
#regexp:\.(.+-)?ap-beijing(-.+)?\.myqcloud\.com$ #北京
|
||||
#regexp:\.(.+-)?ap-nanjing(-.+)?\.myqcloud\.com$ #南京
|
||||
#regexp:\.(.+-)?ap-shanghai(-.+)?\.myqcloud\.com$ #上海
|
||||
#regexp:\.(.+-)?ap-guangzhou(-.+)?\.myqcloud\.com$ #广州
|
||||
#regexp:\.(.+-)?ap-chengdu(-.+)?\.myqcloud\.com$ #成都
|
||||
#regexp:\.(.+-)?ap-chongqing(-.+)?\.myqcloud\.com$ #重庆
|
||||
#regexp:\.(.+-)?ap-shenzhen(-.+)?\.myqcloud\.com$ #深圳
|
||||
|
||||
# COS 使用到的非中国大陆的地域与可用区,参见 https://cloud.tencent.com/document/product/436/6224
|
||||
ap-hongkong.myqcloud.com @!cn #中国香港
|
||||
@@ -282,13 +283,14 @@ eu-frankfurt.myqcloud.com @!cn #法兰克福
|
||||
eu-moscow.myqcloud.com @!cn #莫斯科
|
||||
|
||||
# tencentcos inside mainland China
|
||||
regexp:\.(.+-)?ap-beijing(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #北京
|
||||
regexp:\.(.+-)?ap-nanjing(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #南京
|
||||
regexp:\.(.+-)?ap-shanghai(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #上海
|
||||
regexp:\.(.+-)?ap-guangzhou(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #广州
|
||||
regexp:\.(.+-)?ap-chengdu(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #成都
|
||||
regexp:\.(.+-)?ap-chongqing(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #重庆
|
||||
regexp:\.(.+-)?ap-shenzhen(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #深圳
|
||||
# overrided by tencentcos.cn, tencentcos.com, tencentcos.com.cn
|
||||
#regexp:\.(.+-)?ap-beijing(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #北京
|
||||
#regexp:\.(.+-)?ap-nanjing(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #南京
|
||||
#regexp:\.(.+-)?ap-shanghai(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #上海
|
||||
#regexp:\.(.+-)?ap-guangzhou(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #广州
|
||||
#regexp:\.(.+-)?ap-chengdu(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #成都
|
||||
#regexp:\.(.+-)?ap-chongqing(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #重庆
|
||||
#regexp:\.(.+-)?ap-shenzhen(-.+)?\.tencentcos\.(cn|com(\.cn)?)$ #深圳
|
||||
|
||||
# tencentcos outside mainland China
|
||||
# regexp:.+\.ap-hongkong\.tencentcos\.(cn|com(\.cn)?)$ @!cn #中国香港
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
remirepo.net
|
||||
@@ -25,6 +25,7 @@ quotable.com
|
||||
radian6.com
|
||||
relateiq.com
|
||||
salesforce-setup.com
|
||||
salesforce-sites.com
|
||||
salesforce.com
|
||||
salesforce.org
|
||||
salesforceiq.com
|
||||
|
||||
@@ -19,7 +19,9 @@ samsungeshop.com.cn @cn
|
||||
samsunggalaxyfriends.com
|
||||
samsunghealth.com
|
||||
samsungiotcloud.com
|
||||
samsungiots.com
|
||||
samsungknox.com
|
||||
samsungosp.com
|
||||
samsungqbe.com
|
||||
samsungrs.com
|
||||
smartthings.com
|
||||
|
||||
@@ -19,13 +19,14 @@ th.weibo.com @!cn
|
||||
tw.weibo.com @!cn
|
||||
us.weibo.com @!cn
|
||||
videoself.cn
|
||||
wbimg.com
|
||||
wbimg.cn
|
||||
wbimg.com
|
||||
wcdn.cn
|
||||
weibo.cn
|
||||
weibo.com
|
||||
weibo.com.cn
|
||||
weibocdn.com
|
||||
weibopay.com
|
||||
xhaiwai.com
|
||||
|
||||
# Ads/tracking
|
||||
|
||||
@@ -9,6 +9,10 @@ itc.cn
|
||||
sohu.com
|
||||
sohucs.com
|
||||
|
||||
# 56网
|
||||
56.com
|
||||
56img.com
|
||||
|
||||
# Ads/tracking
|
||||
adnet.sohu.com @ads
|
||||
ads.sohu.com @ads
|
||||
|
||||
@@ -20,6 +20,7 @@ tiktokv.eu @!cn
|
||||
tiktokv.us @!cn
|
||||
tiktokw.eu @!cn
|
||||
tiktokw.us @!cn
|
||||
ttcdn-us.com @!cn
|
||||
ttlivecdn.com @!cn
|
||||
ttoverseaus.net @!cn
|
||||
ttwstatic.com @!cn
|
||||
|
||||
5
data/tilda
Normal file
5
data/tilda
Normal file
@@ -0,0 +1,5 @@
|
||||
tilda.cc
|
||||
tilda.ru
|
||||
tilda.ws
|
||||
tildaapi.com
|
||||
tildacdn.com
|
||||
@@ -1 +0,0 @@
|
||||
topcoder.com
|
||||
@@ -1,6 +1,7 @@
|
||||
videopress.com
|
||||
w.org
|
||||
wordpress.com
|
||||
wordpress.net
|
||||
wordpress.org
|
||||
wordpress.tv
|
||||
wp-themes.com
|
||||
|
||||
@@ -3,6 +3,8 @@ xhamster.desi
|
||||
xhamster.xxx
|
||||
xhamster18.com
|
||||
xhamster18.desi
|
||||
xhamster19.com
|
||||
xhamster3.com
|
||||
xhamsterlive.com
|
||||
xhcdn.com
|
||||
|
||||
|
||||
@@ -53,8 +53,10 @@ yandexadexchange.net
|
||||
yandexcloud.net
|
||||
yandexcom.net
|
||||
yandexmetrica.com
|
||||
yandexwebcache.net
|
||||
yandexwebcache.org
|
||||
yastat.net
|
||||
yastatic-net.ru
|
||||
yastatic.net
|
||||
|
||||
# Watching movies, included in the Yandex subscription
|
||||
|
||||
449
main.go
449
main.go
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
@@ -19,21 +20,15 @@ var (
|
||||
dataPath = flag.String("datapath", "./data", "Path to your custom 'data' directory")
|
||||
outputName = flag.String("outputname", "dlc.dat", "Name of the generated dat file")
|
||||
outputDir = flag.String("outputdir", "./", "Directory to place all generated files")
|
||||
datProfile = flag.String("datprofile", "", "Path of config file used to assemble custom dats")
|
||||
exportLists = flag.String("exportlists", "", "Lists to be flattened and exported in plaintext format, separated by ',' comma")
|
||||
)
|
||||
|
||||
var (
|
||||
plMap = make(map[string]*ParsedList)
|
||||
finalMap = make(map[string][]*Entry)
|
||||
cirIncMap = make(map[string]bool) // Used for circular inclusion detection
|
||||
)
|
||||
|
||||
type Entry struct {
|
||||
Type string
|
||||
Value string
|
||||
Attrs []string
|
||||
Plain string
|
||||
Affs []string
|
||||
}
|
||||
|
||||
type Inclusion struct {
|
||||
@@ -48,7 +43,30 @@ type ParsedList struct {
|
||||
Entries []*Entry
|
||||
}
|
||||
|
||||
func makeProtoList(listName string, entries []*Entry) (*router.GeoSite, error) {
|
||||
type Processor struct {
|
||||
plMap map[string]*ParsedList
|
||||
finalMap map[string][]*Entry
|
||||
cirIncMap map[string]bool
|
||||
}
|
||||
|
||||
type GeoSites struct {
|
||||
Sites []*router.GeoSite
|
||||
SiteIdx map[string]int
|
||||
}
|
||||
|
||||
type DatTask struct {
|
||||
Name string `json:"name"`
|
||||
Mode string `json:"mode"`
|
||||
Lists []string `json:"lists"`
|
||||
}
|
||||
|
||||
const (
|
||||
ModeAll string = "all"
|
||||
ModeAllowlist string = "allowlist"
|
||||
ModeDenylist string = "denylist"
|
||||
)
|
||||
|
||||
func makeProtoList(listName string, entries []*Entry) *router.GeoSite {
|
||||
site := &router.GeoSite{
|
||||
CountryCode: listName,
|
||||
Domain: make([]*router.Domain, 0, len(entries)),
|
||||
@@ -74,7 +92,91 @@ func makeProtoList(listName string, entries []*Entry) (*router.GeoSite, error) {
|
||||
}
|
||||
site.Domain = append(site.Domain, pdomain)
|
||||
}
|
||||
return site, nil
|
||||
return site
|
||||
}
|
||||
|
||||
func loadTasks(path string) ([]DatTask, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
var tasks []DatTask
|
||||
dec := json.NewDecoder(f)
|
||||
if err := dec.Decode(&tasks); err != nil {
|
||||
return nil, fmt.Errorf("failed to decode json: %w", err)
|
||||
}
|
||||
for i, t := range tasks {
|
||||
if t.Name == "" {
|
||||
return nil, fmt.Errorf("task[%d]: name is required", i)
|
||||
}
|
||||
switch t.Mode {
|
||||
case ModeAll, ModeAllowlist, ModeDenylist:
|
||||
default:
|
||||
return nil, fmt.Errorf("task[%d] %q: invalid mode %q", i, t.Name, t.Mode)
|
||||
}
|
||||
}
|
||||
return tasks, nil
|
||||
}
|
||||
|
||||
func (gs *GeoSites) assembleDat(task DatTask) error {
|
||||
datFileName := strings.ToLower(filepath.Base(task.Name))
|
||||
geoSiteList := new(router.GeoSiteList)
|
||||
|
||||
switch task.Mode {
|
||||
case ModeAll:
|
||||
geoSiteList.Entry = gs.Sites
|
||||
case ModeAllowlist:
|
||||
allowedIdxes := make([]int, 0, len(task.Lists))
|
||||
for _, list := range task.Lists {
|
||||
if idx, ok := gs.SiteIdx[strings.ToUpper(list)]; ok {
|
||||
allowedIdxes = append(allowedIdxes, idx)
|
||||
} else {
|
||||
return fmt.Errorf("list %q not found for allowlist task", list)
|
||||
}
|
||||
}
|
||||
slices.Sort(allowedIdxes)
|
||||
allowedlen := len(allowedIdxes)
|
||||
if allowedlen == 0 {
|
||||
return fmt.Errorf("allowlist needs at least one valid list")
|
||||
}
|
||||
geoSiteList.Entry = make([]*router.GeoSite, allowedlen)
|
||||
for i, idx := range allowedIdxes {
|
||||
geoSiteList.Entry[i] = gs.Sites[idx]
|
||||
}
|
||||
case ModeDenylist:
|
||||
deniedMap := make(map[int]bool, len(task.Lists))
|
||||
for _, list := range task.Lists {
|
||||
if idx, ok := gs.SiteIdx[strings.ToUpper(list)]; ok {
|
||||
deniedMap[idx] = true
|
||||
} else {
|
||||
fmt.Printf("[Warn] list %q not found in denylist task %q", list, task.Name)
|
||||
}
|
||||
}
|
||||
deniedlen := len(deniedMap)
|
||||
if deniedlen == 0 {
|
||||
fmt.Printf("[Warn] nothing to deny in task %q", task.Name)
|
||||
geoSiteList.Entry = gs.Sites
|
||||
} else {
|
||||
geoSiteList.Entry = make([]*router.GeoSite, 0, len(gs.Sites)-deniedlen)
|
||||
for i, site := range gs.Sites {
|
||||
if !deniedMap[i] {
|
||||
geoSiteList.Entry = append(geoSiteList.Entry, site)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protoBytes, err := proto.Marshal(geoSiteList)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal: %w", err)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(*outputDir, datFileName), protoBytes, 0644); err != nil {
|
||||
return fmt.Errorf("failed to write file %q: %w", datFileName, err)
|
||||
}
|
||||
fmt.Printf("dat %q has been generated successfully\n", datFileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
func writePlainList(listname string, entries []*Entry) error {
|
||||
@@ -90,72 +192,55 @@ func writePlainList(listname string, entries []*Entry) error {
|
||||
return w.Flush()
|
||||
}
|
||||
|
||||
func parseEntry(line string) (Entry, error) {
|
||||
var entry Entry
|
||||
parts := strings.Fields(line)
|
||||
func parseEntry(typ, rule string) (*Entry, []string, error) {
|
||||
entry := &Entry{Type: typ}
|
||||
parts := strings.Fields(rule)
|
||||
if len(parts) == 0 {
|
||||
return entry, fmt.Errorf("empty line")
|
||||
return entry, nil, fmt.Errorf("empty domain rule")
|
||||
}
|
||||
|
||||
// Parse type and value
|
||||
v := parts[0]
|
||||
colonIndex := strings.Index(v, ":")
|
||||
if colonIndex == -1 {
|
||||
entry.Type = dlc.RuleTypeDomain // Default type
|
||||
entry.Value = strings.ToLower(v)
|
||||
// Parse value
|
||||
switch entry.Type {
|
||||
case dlc.RuleTypeRegexp:
|
||||
if _, err := regexp.Compile(parts[0]); err != nil {
|
||||
return entry, nil, fmt.Errorf("invalid regexp %q: %w", parts[0], err)
|
||||
}
|
||||
entry.Value = parts[0]
|
||||
case dlc.RuleTypeDomain, dlc.RuleTypeFullDomain, dlc.RuleTypeKeyword:
|
||||
entry.Value = strings.ToLower(parts[0])
|
||||
if !validateDomainChars(entry.Value) {
|
||||
return entry, fmt.Errorf("invalid domain: %q", entry.Value)
|
||||
}
|
||||
} else {
|
||||
typ := strings.ToLower(v[:colonIndex])
|
||||
val := v[colonIndex+1:]
|
||||
switch typ {
|
||||
case dlc.RuleTypeRegexp:
|
||||
if _, err := regexp.Compile(val); err != nil {
|
||||
return entry, fmt.Errorf("invalid regexp %q: %w", val, err)
|
||||
}
|
||||
entry.Type = dlc.RuleTypeRegexp
|
||||
entry.Value = val
|
||||
case dlc.RuleTypeInclude:
|
||||
entry.Type = dlc.RuleTypeInclude
|
||||
entry.Value = strings.ToUpper(val)
|
||||
if !validateSiteName(entry.Value) {
|
||||
return entry, fmt.Errorf("invalid include list name: %q", entry.Value)
|
||||
}
|
||||
case dlc.RuleTypeDomain, dlc.RuleTypeFullDomain, dlc.RuleTypeKeyword:
|
||||
entry.Type = typ
|
||||
entry.Value = strings.ToLower(val)
|
||||
if !validateDomainChars(entry.Value) {
|
||||
return entry, fmt.Errorf("invalid domain: %q", entry.Value)
|
||||
}
|
||||
default:
|
||||
return entry, fmt.Errorf("invalid type: %q", typ)
|
||||
return entry, nil, fmt.Errorf("invalid domain: %q", entry.Value)
|
||||
}
|
||||
default:
|
||||
return entry, nil, fmt.Errorf("unknown rule type: %q", entry.Type)
|
||||
}
|
||||
plen := len(entry.Type) + len(entry.Value) + 1
|
||||
|
||||
// Parse attributes and affiliations
|
||||
var affs []string
|
||||
for _, part := range parts[1:] {
|
||||
if strings.HasPrefix(part, "@") {
|
||||
attr := strings.ToLower(part[1:]) // Trim attribute prefix `@` character
|
||||
switch part[0] {
|
||||
case '@':
|
||||
attr := strings.ToLower(part[1:])
|
||||
if !validateAttrChars(attr) {
|
||||
return entry, fmt.Errorf("invalid attribute: %q", attr)
|
||||
return entry, affs, fmt.Errorf("invalid attribute: %q", attr)
|
||||
}
|
||||
entry.Attrs = append(entry.Attrs, attr)
|
||||
} else if strings.HasPrefix(part, "&") {
|
||||
aff := strings.ToUpper(part[1:]) // Trim affiliation prefix `&` character
|
||||
plen += 2 + len(attr)
|
||||
case '&':
|
||||
aff := strings.ToUpper(part[1:])
|
||||
if !validateSiteName(aff) {
|
||||
return entry, fmt.Errorf("invalid affiliation: %q", aff)
|
||||
return entry, affs, fmt.Errorf("invalid affiliation: %q", aff)
|
||||
}
|
||||
entry.Affs = append(entry.Affs, aff)
|
||||
} else {
|
||||
return entry, fmt.Errorf("invalid attribute/affiliation: %q", part)
|
||||
affs = append(affs, aff)
|
||||
default:
|
||||
return entry, affs, fmt.Errorf("unknown field: %q", part)
|
||||
}
|
||||
}
|
||||
// Sort attributes
|
||||
slices.Sort(entry.Attrs)
|
||||
|
||||
slices.Sort(entry.Attrs) // Sort attributes
|
||||
// Formated plain entry: type:domain.tld:@attr1,@attr2
|
||||
var plain strings.Builder
|
||||
plain.Grow(len(entry.Type) + len(entry.Value) + 10)
|
||||
plain.Grow(plen)
|
||||
plain.WriteString(entry.Type)
|
||||
plain.WriteByte(':')
|
||||
plain.WriteString(entry.Value)
|
||||
@@ -169,11 +254,49 @@ func parseEntry(line string) (Entry, error) {
|
||||
plain.WriteString(attr)
|
||||
}
|
||||
entry.Plain = plain.String()
|
||||
return entry, affs, nil
|
||||
}
|
||||
|
||||
return entry, nil
|
||||
func parseInclusion(rule string) (*Inclusion, error) {
|
||||
parts := strings.Fields(rule)
|
||||
if len(parts) == 0 {
|
||||
return nil, fmt.Errorf("empty inclusion")
|
||||
}
|
||||
inc := &Inclusion{Source: strings.ToUpper(parts[0])}
|
||||
if !validateSiteName(inc.Source) {
|
||||
return inc, fmt.Errorf("invalid included list name: %q", inc.Source)
|
||||
}
|
||||
|
||||
// Parse attributes
|
||||
for _, part := range parts[1:] {
|
||||
switch part[0] {
|
||||
case '@':
|
||||
attr := strings.ToLower(part[1:])
|
||||
if attr[0] == '-' {
|
||||
battr := attr[1:]
|
||||
if !validateAttrChars(battr) {
|
||||
return inc, fmt.Errorf("invalid ban attribute: %q", battr)
|
||||
}
|
||||
inc.BanAttrs = append(inc.BanAttrs, battr)
|
||||
} else {
|
||||
if !validateAttrChars(attr) {
|
||||
return inc, fmt.Errorf("invalid must attribute: %q", attr)
|
||||
}
|
||||
inc.MustAttrs = append(inc.MustAttrs, attr)
|
||||
}
|
||||
case '&':
|
||||
return inc, fmt.Errorf("affiliation is not allowed for inclusion")
|
||||
default:
|
||||
return inc, fmt.Errorf("unknown field: %q", part)
|
||||
}
|
||||
}
|
||||
return inc, nil
|
||||
}
|
||||
|
||||
func validateDomainChars(domain string) bool {
|
||||
if domain == "" {
|
||||
return false
|
||||
}
|
||||
for i := range domain {
|
||||
c := domain[i]
|
||||
if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '.' || c == '-' {
|
||||
@@ -185,9 +308,12 @@ func validateDomainChars(domain string) bool {
|
||||
}
|
||||
|
||||
func validateAttrChars(attr string) bool {
|
||||
if attr == "" {
|
||||
return false
|
||||
}
|
||||
for i := range attr {
|
||||
c := attr[i]
|
||||
if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '!' || c == '-' {
|
||||
if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '!' {
|
||||
continue
|
||||
}
|
||||
return false
|
||||
@@ -196,6 +322,9 @@ func validateAttrChars(attr string) bool {
|
||||
}
|
||||
|
||||
func validateSiteName(name string) bool {
|
||||
if name == "" {
|
||||
return false
|
||||
}
|
||||
for i := range name {
|
||||
c := name[i]
|
||||
if (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '!' || c == '-' {
|
||||
@@ -206,74 +335,60 @@ func validateSiteName(name string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func loadData(path string) ([]*Entry, error) {
|
||||
func (p *Processor) getOrCreateParsedList(name string) *ParsedList {
|
||||
pl, exist := p.plMap[name]
|
||||
if !exist {
|
||||
pl = &ParsedList{Name: name}
|
||||
p.plMap[name] = pl
|
||||
}
|
||||
return pl
|
||||
}
|
||||
|
||||
func (p *Processor) loadData(listName string, path string) error {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
var entries []*Entry
|
||||
pl := p.getOrCreateParsedList(listName)
|
||||
scanner := bufio.NewScanner(file)
|
||||
lineIdx := 0
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
lineIdx++
|
||||
if idx := strings.Index(line, "#"); idx != -1 {
|
||||
line = line[:idx] // Remove comments
|
||||
}
|
||||
line, _, _ := strings.Cut(scanner.Text(), "#") // Remove comments
|
||||
line = strings.TrimSpace(line)
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
entry, err := parseEntry(line)
|
||||
if err != nil {
|
||||
return entries, fmt.Errorf("error in %q at line %d: %w", path, lineIdx, err)
|
||||
typ, rule, isTypeSpecified := strings.Cut(line, ":")
|
||||
if !isTypeSpecified { // Default RuleType
|
||||
typ, rule = dlc.RuleTypeDomain, typ
|
||||
} else {
|
||||
typ = strings.ToLower(typ)
|
||||
}
|
||||
entries = append(entries, &entry)
|
||||
}
|
||||
return entries, nil
|
||||
}
|
||||
|
||||
func parseList(refName string, refList []*Entry) error {
|
||||
pl, _ := plMap[refName]
|
||||
if pl == nil {
|
||||
pl = &ParsedList{Name: refName}
|
||||
plMap[refName] = pl
|
||||
}
|
||||
for _, entry := range refList {
|
||||
if entry.Type == dlc.RuleTypeInclude {
|
||||
if len(entry.Affs) != 0 {
|
||||
return fmt.Errorf("affiliation is not allowed for include:%q", entry.Value)
|
||||
}
|
||||
inc := &Inclusion{Source: entry.Value}
|
||||
for _, attr := range entry.Attrs {
|
||||
if strings.HasPrefix(attr, "-") {
|
||||
inc.BanAttrs = append(inc.BanAttrs, attr[1:]) // Trim attribute prefix `-` character
|
||||
} else {
|
||||
inc.MustAttrs = append(inc.MustAttrs, attr)
|
||||
}
|
||||
if typ == dlc.RuleTypeInclude {
|
||||
inc, err := parseInclusion(rule)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error in %q at line %d: %w", path, lineIdx, err)
|
||||
}
|
||||
pl.Inclusions = append(pl.Inclusions, inc)
|
||||
} else {
|
||||
for _, aff := range entry.Affs {
|
||||
apl, _ := plMap[aff]
|
||||
if apl == nil {
|
||||
apl = &ParsedList{Name: aff}
|
||||
plMap[aff] = apl
|
||||
}
|
||||
entry, affs, err := parseEntry(typ, rule)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error in %q at line %d: %w", path, lineIdx, err)
|
||||
}
|
||||
for _, aff := range affs {
|
||||
apl := p.getOrCreateParsedList(aff)
|
||||
apl.Entries = append(apl.Entries, entry)
|
||||
}
|
||||
pl.Entries = append(pl.Entries, entry)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return scanner.Err()
|
||||
}
|
||||
|
||||
func isMatchAttrFilters(entry *Entry, incFilter *Inclusion) bool {
|
||||
if len(incFilter.MustAttrs) == 0 && len(incFilter.BanAttrs) == 0 {
|
||||
return true
|
||||
}
|
||||
if len(entry.Attrs) == 0 {
|
||||
return len(incFilter.MustAttrs) == 0
|
||||
}
|
||||
@@ -296,9 +411,7 @@ func polishList(roughMap map[string]*Entry) []*Entry {
|
||||
domainsMap := make(map[string]bool)
|
||||
for _, entry := range roughMap {
|
||||
switch entry.Type { // Bypass regexp, keyword and "full/domain with attr"
|
||||
case dlc.RuleTypeRegexp:
|
||||
finalList = append(finalList, entry)
|
||||
case dlc.RuleTypeKeyword:
|
||||
case dlc.RuleTypeRegexp, dlc.RuleTypeKeyword:
|
||||
finalList = append(finalList, entry)
|
||||
case dlc.RuleTypeDomain:
|
||||
domainsMap[entry.Value] = true
|
||||
@@ -323,11 +436,11 @@ func polishList(roughMap map[string]*Entry) []*Entry {
|
||||
pd = "." + pd // So that `domain:example.org` overrides `full:example.org`
|
||||
}
|
||||
for {
|
||||
idx := strings.Index(pd, ".")
|
||||
if idx == -1 {
|
||||
var hasParent bool
|
||||
_, pd, hasParent = strings.Cut(pd, ".") // Go for next parent
|
||||
if !hasParent {
|
||||
break
|
||||
}
|
||||
pd = pd[idx+1:] // Go for next parent
|
||||
if domainsMap[pd] {
|
||||
isRedundant = true
|
||||
break
|
||||
@@ -344,36 +457,39 @@ func polishList(roughMap map[string]*Entry) []*Entry {
|
||||
return finalList
|
||||
}
|
||||
|
||||
func resolveList(pl *ParsedList) error {
|
||||
if _, pldone := finalMap[pl.Name]; pldone {
|
||||
func (p *Processor) resolveList(plname string) error {
|
||||
if _, pldone := p.finalMap[plname]; pldone {
|
||||
return nil
|
||||
}
|
||||
|
||||
if cirIncMap[pl.Name] {
|
||||
return fmt.Errorf("circular inclusion in: %q", pl.Name)
|
||||
pl, plexist := p.plMap[plname]
|
||||
if !plexist {
|
||||
return fmt.Errorf("list %q not found", plname)
|
||||
}
|
||||
cirIncMap[pl.Name] = true
|
||||
defer delete(cirIncMap, pl.Name)
|
||||
if p.cirIncMap[plname] {
|
||||
return fmt.Errorf("circular inclusion in: %q", plname)
|
||||
}
|
||||
p.cirIncMap[plname] = true
|
||||
defer delete(p.cirIncMap, plname)
|
||||
|
||||
roughMap := make(map[string]*Entry) // Avoid basic duplicates
|
||||
for _, dentry := range pl.Entries { // Add direct entries
|
||||
roughMap[dentry.Plain] = dentry
|
||||
}
|
||||
for _, inc := range pl.Inclusions {
|
||||
incPl, exist := plMap[inc.Source]
|
||||
if !exist {
|
||||
return fmt.Errorf("list %q includes a non-existent list: %q", pl.Name, inc.Source)
|
||||
for _, inc := range pl.Inclusions { // Add included entries
|
||||
if err := p.resolveList(inc.Source); err != nil {
|
||||
return fmt.Errorf("failed to resolve inclusion %q: %w", inc.Source, err)
|
||||
}
|
||||
if err := resolveList(incPl); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, ientry := range finalMap[inc.Source] {
|
||||
if isMatchAttrFilters(ientry, inc) { // Add included entries
|
||||
isFullInc := len(inc.MustAttrs) == 0 && len(inc.BanAttrs) == 0
|
||||
for _, ientry := range p.finalMap[inc.Source] {
|
||||
if isFullInc || isMatchAttrFilters(ientry, inc) {
|
||||
roughMap[ientry.Plain] = ientry
|
||||
}
|
||||
}
|
||||
}
|
||||
finalMap[pl.Name] = polishList(roughMap)
|
||||
if len(roughMap) == 0 {
|
||||
return fmt.Errorf("empty list")
|
||||
}
|
||||
p.finalMap[plname] = polishList(roughMap)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -381,8 +497,8 @@ func run() error {
|
||||
dir := *dataPath
|
||||
fmt.Printf("using domain lists data in %q\n", dir)
|
||||
|
||||
// Generate refMap
|
||||
refMap := make(map[string][]*Entry)
|
||||
// Generate plMap
|
||||
processor := &Processor{plMap: make(map[string]*ParsedList)}
|
||||
err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -394,77 +510,82 @@ func run() error {
|
||||
if !validateSiteName(listName) {
|
||||
return fmt.Errorf("invalid list name: %q", listName)
|
||||
}
|
||||
refMap[listName], err = loadData(path)
|
||||
return err
|
||||
return processor.loadData(listName, path)
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to loadData: %w", err)
|
||||
}
|
||||
|
||||
// Generate plMap
|
||||
for refName, refList := range refMap {
|
||||
if err := parseList(refName, refList); err != nil {
|
||||
return fmt.Errorf("failed to parseList %q: %w", refName, err)
|
||||
}
|
||||
}
|
||||
|
||||
// Generate finalMap
|
||||
for plname, pl := range plMap {
|
||||
if err := resolveList(pl); err != nil {
|
||||
sitesCount := len(processor.plMap)
|
||||
processor.finalMap = make(map[string][]*Entry, sitesCount)
|
||||
processor.cirIncMap = make(map[string]bool)
|
||||
for plname := range processor.plMap {
|
||||
if err := processor.resolveList(plname); err != nil {
|
||||
return fmt.Errorf("failed to resolveList %q: %w", plname, err)
|
||||
}
|
||||
}
|
||||
processor.plMap = nil
|
||||
|
||||
// Make sure output directory exists
|
||||
if err := os.MkdirAll(*outputDir, 0755); err != nil {
|
||||
return fmt.Errorf("failed to create output directory: %w", err)
|
||||
}
|
||||
|
||||
// Export plaintext list
|
||||
// Export plaintext lists
|
||||
for rawEpList := range strings.SplitSeq(*exportLists, ",") {
|
||||
if epList := strings.TrimSpace(rawEpList); epList != "" {
|
||||
entries, exist := finalMap[strings.ToUpper(epList)]
|
||||
if !exist || len(entries) == 0 {
|
||||
fmt.Printf("list %q does not exist or is empty\n", epList)
|
||||
entries, exist := processor.finalMap[strings.ToUpper(epList)]
|
||||
if !exist {
|
||||
fmt.Printf("[Warn] list %q does not exist\n", epList)
|
||||
continue
|
||||
}
|
||||
if err := writePlainList(epList, entries); err != nil {
|
||||
fmt.Printf("failed to write list %q: %v\n", epList, err)
|
||||
fmt.Printf("[Error] failed to write list %q: %v\n", epList, err)
|
||||
continue
|
||||
}
|
||||
fmt.Printf("list %q has been generated successfully.\n", epList)
|
||||
fmt.Printf("list %q has been generated successfully\n", epList)
|
||||
}
|
||||
}
|
||||
|
||||
// Generate dat file
|
||||
protoList := new(router.GeoSiteList)
|
||||
for siteName, siteEntries := range finalMap {
|
||||
site, err := makeProtoList(siteName, siteEntries)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to makeProtoList %q: %w", siteName, err)
|
||||
}
|
||||
protoList.Entry = append(protoList.Entry, site)
|
||||
// Generate proto sites
|
||||
gs := &GeoSites{
|
||||
Sites: make([]*router.GeoSite, 0, sitesCount),
|
||||
SiteIdx: make(map[string]int, sitesCount),
|
||||
}
|
||||
// Sort protoList so the marshaled list is reproducible
|
||||
slices.SortFunc(protoList.Entry, func(a, b *router.GeoSite) int {
|
||||
for siteName, siteEntries := range processor.finalMap {
|
||||
gs.Sites = append(gs.Sites, makeProtoList(siteName, siteEntries))
|
||||
}
|
||||
processor = nil
|
||||
// Sort proto sites so the generated file is reproducible
|
||||
slices.SortFunc(gs.Sites, func(a, b *router.GeoSite) int {
|
||||
return strings.Compare(a.CountryCode, b.CountryCode)
|
||||
})
|
||||
for i := range sitesCount {
|
||||
gs.SiteIdx[gs.Sites[i].CountryCode] = i
|
||||
}
|
||||
|
||||
protoBytes, err := proto.Marshal(protoList)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal: %w", err)
|
||||
// Load tasks and generate dat files
|
||||
var tasks []DatTask
|
||||
if *datProfile == "" {
|
||||
tasks = []DatTask{{Name: *outputName, Mode: ModeAll}}
|
||||
} else {
|
||||
var err error
|
||||
tasks, err = loadTasks(*datProfile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to loadTasks %q: %v", *datProfile, err)
|
||||
}
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(*outputDir, *outputName), protoBytes, 0644); err != nil {
|
||||
return fmt.Errorf("failed to write output: %w", err)
|
||||
for _, task := range tasks {
|
||||
if err := gs.assembleDat(task); err != nil {
|
||||
fmt.Printf("[Error] failed to assembleDat %q: %v", task.Name, err)
|
||||
}
|
||||
}
|
||||
fmt.Printf("%q has been generated successfully.\n", *outputName)
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
if err := run(); err != nil {
|
||||
fmt.Printf("Fatal error: %v\n", err)
|
||||
fmt.Printf("[Fatal] critical error: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user