Compare commits
13 Commits
v20241204.
...
v20250213.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab03a97789 | ||
|
|
ac4fb7b19b | ||
|
|
f810a66b0c | ||
|
|
e6129a6dd4 | ||
|
|
f1df8acaba | ||
|
|
7add95746e | ||
|
|
9622bd4456 | ||
|
|
3949a407b0 | ||
|
|
8b51175a34 | ||
|
|
bdc53dd5ca | ||
|
|
f3d1085c2d | ||
|
|
932d427c01 | ||
|
|
d554c444cc |
14
.github/workflows/auto-generate-pac.yml
vendored
14
.github/workflows/auto-generate-pac.yml
vendored
@@ -11,7 +11,6 @@ on:
|
|||||||
- 'direct-domains.txt'
|
- 'direct-domains.txt'
|
||||||
- 'proxy-domains.txt'
|
- 'proxy-domains.txt'
|
||||||
- 'cidrs-cn.txt'
|
- 'cidrs-cn.txt'
|
||||||
- '!gfw.pac'
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -21,13 +20,25 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Check if gfw.pac is in the commit
|
||||||
|
id: check-file
|
||||||
|
run: |
|
||||||
|
if git diff --name-only HEAD^ HEAD | grep -q 'gfw\.pac'; then
|
||||||
|
echo "file-exists=true" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "file-exists=false" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Download the latest cn.txt
|
- name: Download the latest cn.txt
|
||||||
|
if: env.file-exists == 'false'
|
||||||
run: curl -L https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt -o cidrs-cn.txt
|
run: curl -L https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt -o cidrs-cn.txt
|
||||||
|
|
||||||
- name: Run gfw-pac.py script
|
- name: Run gfw-pac.py script
|
||||||
|
if: env.file-exists == 'false'
|
||||||
run: ./gfw-pac.py -f gfw.pac -p "PROXY 127.0.0.1:3128" --proxy-domains=proxy-domains.txt --direct-domains=direct-domains.txt --localtld-domains=local-tlds.txt --ip-file=cidrs-cn.txt
|
run: ./gfw-pac.py -f gfw.pac -p "PROXY 127.0.0.1:3128" --proxy-domains=proxy-domains.txt --direct-domains=direct-domains.txt --localtld-domains=local-tlds.txt --ip-file=cidrs-cn.txt
|
||||||
|
|
||||||
- name: Commit and push changes
|
- name: Commit and push changes
|
||||||
|
if: env.file-exists == 'false'
|
||||||
run: |
|
run: |
|
||||||
last_commit_message=$(git log -1 --pretty=%B)
|
last_commit_message=$(git log -1 --pretty=%B)
|
||||||
commit_message=$([[ "${{ github.event_name }}" == "schedule" ]] && echo "定期更新数据并生成 gfw.pac" || echo "自动生成 gfw.pac: $last_commit_message")
|
commit_message=$([[ "${{ github.event_name }}" == "schedule" ]] && echo "定期更新数据并生成 gfw.pac" || echo "自动生成 gfw.pac: $last_commit_message")
|
||||||
@@ -38,6 +49,7 @@ jobs:
|
|||||||
git push
|
git push
|
||||||
|
|
||||||
- name: Trigger Auto-Release
|
- name: Trigger Auto-Release
|
||||||
|
if: env.file-exists == 'false'
|
||||||
uses: benc-uk/workflow-dispatch@v1
|
uses: benc-uk/workflow-dispatch@v1
|
||||||
with:
|
with:
|
||||||
workflow: Auto Generate Release
|
workflow: Auto Generate Release
|
||||||
|
|||||||
2841
cidrs-cn.txt
2841
cidrs-cn.txt
File diff suppressed because it is too large
Load Diff
23
gfw-pac.py
23
gfw-pac.py
@@ -33,6 +33,13 @@ def convert_cidr(cidr):
|
|||||||
network_address = network
|
network_address = network
|
||||||
return hex(int(network_address))[2:]
|
return hex(int(network_address))[2:]
|
||||||
|
|
||||||
|
def longest_common_prefix(str1, str2):
|
||||||
|
min_length = min(len(str1), len(str2))
|
||||||
|
for i in range(min_length):
|
||||||
|
if str1[i] != str2[i]:
|
||||||
|
return str1[:i]
|
||||||
|
return str1[:min_length]
|
||||||
|
|
||||||
def generate_cnip_cidrs():
|
def generate_cnip_cidrs():
|
||||||
""" 从文件中读取CIDR地址 """
|
""" 从文件中读取CIDR地址 """
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
@@ -42,6 +49,22 @@ def generate_cnip_cidrs():
|
|||||||
for cidr in cidrs:
|
for cidr in cidrs:
|
||||||
converted_cidrs.append(convert_cidr(cidr))
|
converted_cidrs.append(convert_cidr(cidr))
|
||||||
|
|
||||||
|
converted_cidrs.sort(key=lambda x: (len(x), x), reverse=False)
|
||||||
|
converted_cidrs_clone = converted_cidrs[:]
|
||||||
|
|
||||||
|
lastFullCidr = ''
|
||||||
|
for i in range(len(converted_cidrs)):
|
||||||
|
prevCidr = converted_cidrs_clone[i-1] if i > 0 else ''
|
||||||
|
currentCidr = converted_cidrs[i]
|
||||||
|
if len(prevCidr) != len(currentCidr):
|
||||||
|
lastFullCidr = currentCidr
|
||||||
|
continue
|
||||||
|
prefix = longest_common_prefix(lastFullCidr, currentCidr)
|
||||||
|
if len(prefix) < len(lastFullCidr)//1.2:
|
||||||
|
lastFullCidr = currentCidr
|
||||||
|
continue
|
||||||
|
converted_cidrs[i] = '~' + currentCidr[len(prefix):]
|
||||||
|
|
||||||
cidr_list = ','.join(converted_cidrs)
|
cidr_list = ','.join(converted_cidrs)
|
||||||
return f"'{cidr_list}'.split(',')"
|
return f"'{cidr_list}'.split(',')"
|
||||||
|
|
||||||
|
|||||||
@@ -163,8 +163,14 @@ var radixTree = new RadixTree();
|
|||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
debug('开始生成 Radix Tree', 'PAC文件载入开始');
|
debug('开始生成 Radix Tree', 'PAC文件载入开始');
|
||||||
|
lastFullPrefix = ''
|
||||||
for (let i=0; i<cidrs.length; i++) {
|
for (let i=0; i<cidrs.length; i++) {
|
||||||
var prefix = cidrs[i];
|
var prefix = cidrs[i];
|
||||||
|
if (prefix.substring(0, 1) !== '~') {
|
||||||
|
lastFullPrefix = prefix
|
||||||
|
} else {
|
||||||
|
prefix = lastFullPrefix.substring(0, lastFullPrefix.length-prefix.length+1) + prefix.substring(1)
|
||||||
|
}
|
||||||
var bits = (parseInt(prefix, 16)).toString(2);
|
var bits = (parseInt(prefix, 16)).toString(2);
|
||||||
radixTree.insert(bits);
|
radixTree.insert(bits);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user