diff --git a/parsers/clash2base64.py b/parsers/clash2base64.py index 6841f84e6..88b8320bb 100644 --- a/parsers/clash2base64.py +++ b/parsers/clash2base64.py @@ -4,49 +4,52 @@ def clash2v2ray(share_link): link = '' if share_link['type'] == 'vmess': - vmess_info = { - "v": "2", - "ps": share_link['name'].encode('utf-8', 'surrogatepass').decode('utf-8'), - "add": share_link['server'], - "port": share_link['port'], - "id": share_link['uuid'], - "aid": share_link['alterId'], - "net": share_link.get('network', 'tcp'), - "scy": share_link.get('cipher', 'auto'), - "type": "none", - "host": share_link.get('ws-opts', {}).get('headers', {}).get('Host', '') or share_link.get('ws-headers', {}).get('Host', ''), - "path": share_link.get('ws-path', '') or share_link.get('ws-opts', {}).get('path', ''), - "tls": '' - } - if share_link.get('skip-cert-verify') == False: - vmess_info['verify_cert'] = False - if share_link.get('tls') and share_link['tls'] != False: - vmess_info['tls'] = 'tls' - vmess_info["sni"] = share_link.get('servername', '') - if vmess_info['net'] == 'grpc': - vmess_info["type"] = share_link.get('grpc-opts', {}).get('grpc-mode') - if share_link.get('grpc-opts', {}).get('grpc-service-name') != '/': - vmess_info["path"] = share_link.get('grpc-opts', {}).get('grpc-service-name') - else: - vmess_info["path"] = '' - elif vmess_info['net'] == 'h2': - vmess_info['host'] = share_link.get('h2-opts', {}).get('host', []) - vmess_info["path"] = share_link.get('h2-opts', {}).get('path', '') - elif vmess_info['net'] == 'http': - vmess_info["headers"] = share_link.get('http-opts', {}).get('headers', {}) - vmess_info["host"] = share_link.get('http-opts', {}).get('headers', {}).get('Host', []) - vmess_info["path"] = share_link.get('http-opts', {}).get('path', []) - if share_link.get('smux',{}).get('enabled', '') == True: - vmess_info["protocol"] = share_link['smux']['protocol'] - vmess_info["max_connections"] = share_link['smux'].get('max-connections','') - vmess_info["min_streams"] = share_link['smux'].get('min-streams','') - vmess_info["max_streams"] = share_link['smux'].get('max-streams','') - vmess_info["padding"] = share_link['smux'].get('padding','') + try: + vmess_info = { + "v": "2", + "ps": share_link['name'].encode('utf-8', 'surrogatepass').decode('utf-8'), + "add": share_link['server'], + "port": share_link['port'], + "id": share_link['uuid'], + "aid": share_link['alterId'], + "net": share_link.get('network', 'tcp'), + "scy": share_link.get('cipher', 'auto'), + "type": "none", + "host": share_link.get('ws-opts', {}).get('headers', {}).get('Host', '') or share_link.get('ws-headers', {}).get('Host', ''), + "path": share_link.get('ws-path', '') or share_link.get('ws-opts', {}).get('path', ''), + "tls": '' + } + if share_link.get('skip-cert-verify') == False: + vmess_info['verify_cert'] = False + if share_link.get('tls') and share_link['tls'] != False: + vmess_info['tls'] = 'tls' + vmess_info["sni"] = share_link.get('servername', '') + if vmess_info['net'] == 'grpc': + vmess_info["type"] = share_link.get('grpc-opts', {}).get('grpc-mode') + if share_link.get('grpc-opts', {}).get('grpc-service-name') != '/': + vmess_info["path"] = share_link.get('grpc-opts', {}).get('grpc-service-name') + else: + vmess_info["path"] = '' + elif vmess_info['net'] == 'h2': + vmess_info['host'] = share_link.get('h2-opts', {}).get('host', []) + vmess_info["path"] = share_link.get('h2-opts', {}).get('path', '') + elif vmess_info['net'] == 'http': + vmess_info["headers"] = share_link.get('http-opts', {}).get('headers', {}) + vmess_info["host"] = share_link.get('http-opts', {}).get('headers', {}).get('Host', []) + vmess_info["path"] = share_link.get('http-opts', {}).get('path', []) + if share_link.get('smux',{}).get('enabled', '') == True: + vmess_info["protocol"] = share_link['smux']['protocol'] + vmess_info["max_connections"] = share_link['smux'].get('max-connections','') + vmess_info["min_streams"] = share_link['smux'].get('min-streams','') + vmess_info["max_streams"] = share_link['smux'].get('max-streams','') + vmess_info["padding"] = share_link['smux'].get('padding','') - vmess_json = json.dumps(vmess_info).encode('utf-8') - vmess_base64 = base64.b64encode(vmess_json).decode('utf-8') - link = f"vmess://{vmess_base64}" - return link + vmess_json = json.dumps(vmess_info).encode('utf-8') + vmess_base64 = base64.b64encode(vmess_json).decode('utf-8') + link = f"vmess://{vmess_base64}" + return link + except: + pass # TODO elif share_link['type'] == 'ss': ss_info = { @@ -133,9 +136,8 @@ def clash2v2ray(share_link): "password": share_link['password'], "server": share_link['server'], "port": share_link['port'], - "allowInsecure": share_link.get('allowInsecure', '1'), "sni": share_link.get('sni', ''), - "skip_cert_verify": '1' if share_link.get('skip-cert-verify') else "", + "skip_cert_verify": share_link.get('skip-cert-verify', False), "type": share_link.get('network', 'tcp'), "fp": share_link.get('client-fingerprint', ''), "alpn": quote(','.join(share_link.get('alpn', '')), 'utf-8'), @@ -150,7 +152,7 @@ def clash2v2ray(share_link): trojan_info["serviceName"] = server_parts[-2] else: trojan_info["serviceName"] = '' - link = "trojan://{password}@{server}:{port}?allowInsecure={allowInsecure}&sni={sni}&skip_cert_verify={skip_cert_verify}&type={type}&serviceName={serviceName}&fp={fp}&alpn={alpn}".format(**trojan_info) + link = "trojan://{password}@{server}:{port}?sni={sni}&skip_cert_verify={skip_cert_verify}&type={type}&serviceName={serviceName}&fp={fp}&alpn={alpn}".format(**trojan_info) elif trojan_info['type'] == 'ws': if share_link.get('ws-opts'): trojan_info["path"] = quote(share_link['ws-opts'].get('path', ''), 'utf-8') diff --git a/parsers/ss.py b/parsers/ss.py index b6975221d..a51371ae4 100644 --- a/parsers/ss.py +++ b/parsers/ss.py @@ -84,7 +84,7 @@ def parse(data): node['multiplex']['padding'] = True try: #fuck param = param.split('?')[0] - matcher = tool.urlDecode(param) #保留'/'测试能不能解码 + matcher = tool.b64Decode(param) #保留'/'测试能不能解码 except: param = param.split('/')[0].split('?')[0] #不能解码说明'/'不是base64内容 if param.find('@') > -1: @@ -96,7 +96,7 @@ def parse(data): else: return None try: - matcher = re.match(r'(.*?):(.*)', tool.urlDecode(param).decode('utf-8')) + matcher = re.match(r'(.*?):(.*)', tool.b64Decode(param).decode('utf-8')) if matcher: node['method'] = matcher.group(1) node['password'] = matcher.group(2) @@ -110,7 +110,7 @@ def parse(data): else: return None else: - matcher = re.match(r'(.*?):(.*)@(.*):(.*)', tool.urlDecode(param).decode('utf-8')) + matcher = re.match(r'(.*?):(.*)@(.*):(.*)', tool.b64Decode(param).decode('utf-8')) if matcher: node['method'] = matcher.group(1) node['password'] = matcher.group(2) diff --git a/parsers/ssr.py b/parsers/ssr.py index bd990b383..f7f46df6b 100644 --- a/parsers/ssr.py +++ b/parsers/ssr.py @@ -4,7 +4,7 @@ def parse(data): if not info or info.isspace(): return None try: - proxy_str = tool.urlDecode(info).decode('utf-8') + proxy_str = tool.b64Decode(info).decode('utf-8') except: proxy_str = info i = 0 @@ -28,10 +28,10 @@ def parse(data): } password_params = parts[5].split('/?') if i == 0: - node['password'] = tool.urlDecode(password_params[0]).decode('utf-8') + node['password'] = tool.b64Decode(password_params[0]).decode('utf-8') params = password_params[1].split('&') else: #fuck - node['password'] = tool.urlDecode(password_params[0].split('remarks')[0]).decode('utf-8') + node['password'] = tool.b64Decode(password_params[0].split('remarks')[0]).decode('utf-8') params = password_params[-1].split(password_params[0].split('remarks')[0])[-1].split('&') pdict = {'obfsparam':'obfs_param','protoparam':'protocol_param','remarks':'tag'} for p in params: @@ -39,6 +39,6 @@ def parse(data): keyname = key_value[0] if keyname in pdict.keys(): keyname = pdict[keyname] - node[keyname] = tool.urlDecode(key_value[1]).decode('utf-8') + node[keyname] = tool.b64Decode(key_value[1]).decode('utf-8') node['tag'] = node['tag'] if node.get('tag') else tool.genName()+'_shadowsocksr' return node diff --git a/parsers/trojan.py b/parsers/trojan.py index 2039823da..ffa2ee0ac 100644 --- a/parsers/trojan.py +++ b/parsers/trojan.py @@ -24,7 +24,7 @@ def parse(data): 'insecure': False } } - if netquery.get('allowInsecure') == '1': + if netquery.get('skip_cert_verify') == True: node['tls']['insecure'] = True if netquery.get('alpn'): node['tls']['alpn'] = netquery.get('alpn').strip('{}').split(',') diff --git a/tool.py b/tool.py index 87fde3d3f..0d4c48713 100644 --- a/tool.py +++ b/tool.py @@ -16,9 +16,9 @@ def saveFile(path,content): '🇹🇼': re.compile(r'台湾|台灣|臺灣|台北|台中|新北|彰化|台|CHT|HINET|TW|Taiwan|TAIWAN'), '🇲🇴': re.compile(r'澳门|澳門|(\s|-)?MO\d*|CTM|MAC|Macao|Macau'), '🇸🇬': re.compile(r'新加坡|狮城|獅城|沪新|京新|泉新|穗新|深新|杭新|广新|廣新|滬新|SG|Singapore|SINGAPORE'), - '🇯🇵': re.compile(r'日本|东京|大阪|埼玉|京日|苏日|沪日|广日|上日|穗日|川日|中日|泉日|杭日|深日|JP|Japan|JAPAN'), + '🇯🇵': re.compile(r'日本|东京|東京|大阪|埼玉|京日|苏日|沪日|广日|上日|穗日|川日|中日|泉日|杭日|深日|JP|Japan|JAPAN'), '🇺🇸': re.compile(r'美国|美國|京美|硅谷|凤凰城|洛杉矶|西雅图|圣何塞|芝加哥|哥伦布|纽约|广美|(\s|-)?(?<![AR])US\d*|USA|America|United States'), - '🇰🇷': re.compile(r'韩国|韓國|首尔|韩|韓|春川|KOR|KR|Kr|(?<!North\s)Korea'), + '🇰🇷': re.compile(r'韩国|韓國|首尔|首爾|韩|韓|春川|KOR|KR|Kr|(?<!North\s)Korea'), '🇰🇵': re.compile(r'朝鲜|KP|North Korea'), '🇷🇺': re.compile(r'俄罗斯|俄羅斯|毛子|俄国|RU|RUS|Russia'), '🇮🇳': re.compile(r'印度|孟买|\bIN|IND|India|INDIA|Mumbai'), @@ -32,7 +32,7 @@ def saveFile(path,content): '🇻🇦': re.compile(r'梵蒂冈|梵蒂岡|(\s|-)?VA\d*|Vatican City'), '🇧🇪': re.compile(r'比利时|比利時|(\s|-)?BE\d*|Belgium'), '🇦🇺': re.compile(r'澳大利亚|澳洲|墨尔本|悉尼|(\s|-)?AU\d*|Australia|Sydney'), - '🇨🇦': re.compile(r'加拿大|蒙特利尔|温哥华|多伦多|滑铁卢|楓葉|枫叶|CA|CAN|Waterloo|Canada|CANADA'), + '🇨🇦': re.compile(r'加拿大|蒙特利尔|温哥华|多伦多|多倫多|滑铁卢|楓葉|枫叶|CA|CAN|Waterloo|Canada|CANADA'), '🇲🇾': re.compile(r'马来西亚|马来|馬來|MY|Malaysia|MALAYSIA'), '🇲🇻': re.compile(r'马尔代夫|馬爾代夫|(\s|-)?MV\d*|Maldives'), '🇹🇷': re.compile(r'土耳其|伊斯坦布尔|(\s|-)?TR\d|TR_|TUR|Turkey'), @@ -166,11 +166,6 @@ def rename(input_str): return country_code + ' ' + input_str return input_str -def urlDecode(str): - str = str.strip() - str += (len(str)%4)*'=' - return base64.urlsafe_b64decode(str) - def b64Decode(str): str = str.strip() str += (len(str)%4)*'='