-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpurify.py
167 lines (131 loc) · 4.13 KB
/
purify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
'''
Author: DBin_K [email protected]
Date: 2023-11-12 01:09:06
LastEditors: DBin_K [email protected]
LastEditTime: 2023-11-13 01:44:12
FilePath: \Link-Purify\purify.py
Description:
'''
import re
import yaml
import requests
url = "" # 初始化URL
config_file = './rule.yml' # 配置文件地址
# 短链接列表
# 从配置文件中加载规则
with open(config_file, 'r', encoding='utf-8') as file:
config = yaml.safe_load(file)
def process_url(text):
"""
主要功能, 提取文字中的域名, 如果是短链接则将其扩展
参数:
text, 任意带链接的文字输入
返回:
url, 文字中的链接
"""
global origin_text
origin_text = text
print(f'原始text: {origin_text}\n')
url = extract_url(text)
domain = extract_domain(url)
short_url_domains = [
'b23.tv',
'xhslink.com']
for short_url_domain in short_url_domains:
if short_url_domain == domain:
url = expand_short_url(url)
url = remove_tracking_params(url)
return url
def extract_domain(url):
"""
提取文字中的域名
参数:
url: 链接
返回:
域名,或 `None`
"""
# 匹配域名的正则表达式
regex = r"(https?://)?(www\.)?(\w+(?:\.\w+)+)"
# 提取域名
match = re.match(regex, url)
if match:
return match.group(3)
else:
return None
def extract_url(text):
"""
提取文本中的链接并返回。
参数:
- text: 要提取链接的文本
返回:
- url: 链接列表
"""
# 定义链接的正则表达式模式
pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
# 使用正则表达式模式匹配文本中的链接
match = re.search(pattern, text)
if match:
link = match.group(0)
return link
else:
return "未找到链接"
def expand_short_url(short_url):
"""
展开短链接并返回完整的URL。
参数:
- short_url: 要展开的短链接
返回:
- expanded_url: 展开后的完整URL,如果展开失败则返回None
"""
try:
response = requests.head(
short_url,
allow_redirects=True,
verify=False)
expanded_url = response.url
return expanded_url
except requests.exceptions.RequestException as e:
print("发生错误: ", e)
return None
def remove_tracking_params(url):
"""
根据给定的规则列表,清除URL中的跟踪参数并返回净化后的URL。
参数:
- url: 要清除跟踪参数的URL
返回:
- url: 清除跟踪参数后的净化URL
"""
global config #使用全局配置文件
print(f'原始url: {url}\n')
# 获取全局配置中的 provider
providers = config['providers']
for provider, provider_config in providers.items():
# 获取当前提供者的URL匹配域名
pattern = provider_config['urlPattern']
# 如果URL匹配当前提供者的域名,则执行跟踪参数清除操作
if re.match(pattern, url):
# 获取当前提供者的规则列表
rules = provider_config['rules']
# 遍历规则列表,逐个清除URL中的跟踪参数
for rule in rules:
# 构建匹配规则的正则表达式
pattern = r'(\?|&){0}=[^&]*'.format(rule)
# 使用正则表达式替换URL中的匹配项为空字符串,实现参数清除
url = re.sub(pattern, '', url)
break
# 返回净化后的URL
print(f'净化url: {url}\n')
return url
def replace_url(origin_text, url):
"""
将文本中的链接替换为指定的URL。
参数:
- text: 要处理的文本
- url: 替换链接的目标URL
返回:
- replaced_text: 替换后的文本
"""
# 使用正则表达式匹配文本中的链接
pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
replaced_text = re.sub(pattern, url, origin_text)
return replaced_text