-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathSSR_Clash_无节点组,只需要修改订阅地址.py
158 lines (127 loc) · 5.24 KB
/
SSR_Clash_无节点组,只需要修改订阅地址.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
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import base64
import codecs
def getBasefile(url): # 获取订阅链接加密文本
try:
html = requests.get(url)
html.raise_for_status
html.encoding = html.apparent_encoding
return str(html.text)
except:
return "错误"
def getAllLinks(url): # 从加密文本解析出所有ssr链接
links = getBasefile(url)
result = decodeInfo(links)
alllinks = result.split('\\n')
if len(alllinks[-1]) < 10:
alllinks.pop()
return alllinks
def getAllNodes(url): # 从ssr链接汇总得到所有节点信息
allnodes = []
links = getAllLinks(url)
for ss in links:
link = ss.split('//')[1].split("'")[0]
# node = getNode(link) if ss.split(':')[0] == "ss" else getNodeR(link)
if ss.split(':')[0] == "ss":
print('ss')
node = getNode(link)
allnodes.append(node)
else:
print('ssr')
node = getNodeR(link)
allnodes.append(node)
return allnodes
def getNode(link): # 从ss链接中得到节点信息
info = decodeInfo(link)
method = info.split(':')[0]
pwd = info.split("@")[0].split(":")[1]
server = info.split("@")[1].split(":")[0]
port = info.split(':')[2]
remark = server
node = [remark, server, port, method, pwd]
return node
def getNodeR(link): # 从ssr链接中得到节点信息
info = decodeInfo(link)
#print (info)
pwd = decodeInfo(info.split('/')[0].split(':')[-1]).split("'")[1]
server = info.split(':')[0].split("'")[1]
port = info.split(':')[1]
protocol = info.split(':')[2]
method = info.split(':')[3]
obfs = info.split(':')[4]
remark = getName(info.split('&')[2].split('=')[1])
obfsparam = getName(info.split('&')[0].split('=')[-1])
proparam = getName(info.split('&')[1].split('=')[1])
node = [remark, server, port, method, pwd, protocol, obfs, proparam,obfsparam]
print (node)
return node
def getName(info): # 得到节点名称(有待合并)
lens = len(info)
# lenx = lens - (lens % 4 if lens % 4 else 4)
if lens % 4 == 1:
info = info + "==="
elif lens % 4 == 2:
info = info + "=="
elif lens % 4 == 3:
info = info + "="
result = base64.urlsafe_b64decode(info).decode('utf-8', errors='ignore')
return result
def decodeInfo(info): # 解码加密内容
lens = len(info)
if lens % 4 == 1:
info = info + "==="
elif lens % 4 == 2:
info = info + "=="
elif lens % 4 == 3:
info = info + "="
result = str(base64.urlsafe_b64decode(info))
return result
def setNodes(nodes): # 设置SSR节点
proxies = []
for node in nodes:
name = node[0]
server = node[1]
port = node[2]
cipher = node[3]
pwd = node[4]
protocol = node[5]
obfs = node[6]
proparam = node[7]
obparam = node[8]
proxy = "- { name: " +"\"" +str(name).strip() +"\""+ ", type: ssr, server: " +"\""+ str(server)+"\"" + ", port: " +"\""+ str(port)+"\"" +", password: " +"\""+ str(pwd)+"\""+ ", cipher: " +"\""+ str(cipher)+"\""+", protocol: "+"\""+ str(protocol)+"\""+", protocolparam: " +"\""+ str(proparam)+"\""+", obfs: "+"\"" + str(obfs)+"\""+", obfsparam: " +"\""+ str(obparam)+"\""+" }\n"
proxies.append(proxy)
proxies.insert(0, '\nProxy:\n')
return proxies
def setPG(nodes): # 设置策略组 auto,Fallback-auto,Proxy
proxy_names = []
for node in nodes:
proxy_names.append(node[0])
#auto = "- { name: \'auto\', type: url-test, proxies: " + str( proxy_names) + ", url: 'http://www.gstatic.com/generate_204', interval: 300 }\n"
#Fallback = "- { name: 'Fallback-auto', type: fallback, proxies: " + str(proxy_names) + ", url: 'http://www.gstatic.com/generate_204', interval: 300 }\n"
Proxy = "- { name: 'PROXY', type: select, proxies: " + str(proxy_names) + " }\n"
Apple = "- { name: 'Apple', type: select, proxies: "+" [\"PROXY\",\"DIRECT\"] }" +"\n"
GlobalMedia = "- { name: 'ForeignMedia', type: select, proxies: "+" [\"PROXY\"] }" +"\n"
MainlandMedia = "- { name: 'DomesticMedia', type: select, proxies: "+" [\"DIRECT\"] }" +"\n"
RejectWeb = "- { name: 'Hijacking', type: select, proxies: "+" [\"REJECT\",\"DIRECT\"] }"+"\n"
Final = "- { name: 'Final', type: select, proxies: "+ " [\"PROXY\",\"DIRECT\",\"REJECT\"] }\n" +"\n"+"\n"+"\n"+"\n"+"\n"
Rule = "#规则"+"\n"+"Rule:"+"\n"
ProxyGroup = ['\nProxy Group:\n',Proxy,Apple,GlobalMedia,MainlandMedia,RejectWeb,Final,Rule]
return ProxyGroup
def getClash(nodes): #写文件
rules = getBasefile(
'https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/Pro.yaml')
gener = rules.split('# 代理节点')[0]
with codecs.open("./config.yaml", "w",encoding = 'utf-8') as f:
f.writelines(gener)
info = setNodes(nodes) + setPG(nodes)
with codecs.open("./config.yaml", "a",encoding = 'utf-8') as f:
f.writelines(info)
rule = rules.split('Rule:\n')[1]
with codecs.open("./config.yaml", "a",encoding = 'utf-8') as f:
f.writelines(rule)
if __name__ == "__main__":
url = " " #替换订阅
nodes = getAllNodes(url)
getClash(nodes)