def _parseLink(self, link): _config = self._getShadowsocksBaseConfig() if (link[:5] != "ss://"): logger.error("Unsupport link : %s" % link) return None urlData = urllib.parse.unquote(link) urlResult = urllib.parse.urlparse(urlData) decoded = b64plus.decode( urlResult.netloc[:urlResult.netloc.find("@")]).decode("utf-8") method = decoded.split(":")[0] password = decoded.split(":")[1] addrPort = urlResult.netloc[urlResult.netloc.find("@") + 1:].split(":") remarks = urlResult.fragment if (len(addrPort) != 2): return None serverAddr = addrPort[0] serverPort = int(addrPort[1]) queryResult = urlResult.query plugin = "" pluginOpts = "" group = "N/A" if ("group=" in queryResult): index1 = queryResult.find("group=") + 6 index2 = queryResult.find("&", index1) group = b64plus.decode( queryResult[index1:index2 if index2 != -1 else None]).decode( "utf-8") if ("plugin=" in queryResult): index1 = queryResult.find("plugin=") + 7 index2 = queryResult.find(";", index1) plugin = queryResult[index1:index2] index3 = queryResult.find("&", index2) pluginOpts = queryResult[index2 + 1:index3 if index3 != -1 else None] _config["server"] = serverAddr _config["server_port"] = serverPort _config["method"] = method _config["password"] = password _config["group"] = group _config["remarks"] = remarks _config["plugin"] = plugin _config["plugin_opts"] = pluginOpts if (_config["remarks"] == ""): _config["remarks"] = _config["server"] # print(_config["remarks"]) return _config
def readSubscriptionConfig(self, url): header = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" } rep = requests.get(url, headers=header) rep.encoding = "utf-8" rep = rep.content.decode("utf-8") if (rep[:6] == "ssd://"): pssd = ParserShadowsocksD(self._getShadowsocksBaseConfig()) self._configList = pssd.parseSubsConfig( b64plus.decode(rep[6:]).decode("utf-8")) else: linksArr = (b64plus.decode(rep).decode("utf-8")).split("\n") pssb = ParserShadowsocksBasic(self._getShadowsocksBaseConfig()) self._configList = pssb.parseSubsConfig(linksArr) logger.info("Read %d node(s)" % len(self._configList))
def parseConfig(self, rawLink): link = rawLink[8:] linkDecoded = b64plus.decode(link).decode("utf-8") try: _conf = json.loads(linkDecoded, encoding="utf-8") except json.JSONDecodeError: return None try: cfgVersion = _conf.get("v", "1") server = _conf["add"] port = int(_conf["port"]) _type = _conf.get("type", "none") #Obfs type uuid = _conf["id"] aid = int(_conf["aid"]) net = _conf["net"] if (cfgVersion == "2"): host = _conf.get( "host", "" ) # http host,web socket host,h2 host,quic encrypt method path = _conf.get( "path", "") #Websocket path, http path, quic encrypt key #V2RayN Version 1 Share Link Support else: try: host = _conf.get("host", ";").split(";")[0] path = _conf.get("host", ";").split(";")[1] except IndexError: pass tls = _conf.get("tls", "none") #TLS security = _conf.get("security", "auto") remarks = _conf.get("ps", server) logger.debug( "Server : {},Port : {},Path : {},Type : {},UUID : {},AlterId : {},Network : {},Host : {},TLS : {},Remarks : {}" .format(server, port, path, _type, uuid, aid, net, host, tls, remarks)) _config = { "remarks": remarks, "server": server, "server_port": port, "id": uuid, "alterId": aid, "security": security, "type": _type, "path": path, "network": net, "host": host, "tls": tls } return _config except: logger.exception("Parse {} failed.(V2RayN Method)".format(rawLink)) return None
def parseConfig(self, rawLink): link = rawLink[8:] linkDecoded = b64plus.decode(link).decode("utf-8") try: linkSplited = linkDecoded.split(",") remarks = linkSplited[0].split(" = ")[0] server = linkSplited[1] port = int(linkSplited[2]) method = linkSplited[3] uuid = linkSplited[4] group = linkSplited[5].split("=")[1] tls = "none" if (linkSplited[6].split("=")[1] == "true"): tls = "tls" path = _conf.get("path", "") #Websocket path, http path, quic encrypt key _type = _conf.get("type", "none") #Obfs type uuid = _conf["id"] aid = int(_conf["aid"]) net = _conf["net"] host = _conf.get( "host", "") # http host,web socket host,h2 host,quic encrypt method tls = _conf.get("tls", "") #TLS security = _conf.get("security", "auto") logger.debug( "Server : {},Port : {},Path : {},Type : {},UUID : {},AlterId : {},Network : {},Host : {},TLS : {},Remarks : {},group={}" .format(server, port, path, _type, uuid, aid, net, host, tls, remarks, group)) _config = { "remarks": remarks, "group": group, "server": server, "server_port": port, "id": uuid, "alterId": aid, "security": security, "type": _type, "path": path, "network": net, "host": host, "tls": tls } return _config except: logger.exception( "Parse {} failed.(Quantumult Method)".format(rawLink)) return None
def readSubscriptionConfig(self,url): header = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" } rep = requests.get(url,headers = header) rep.encoding = "utf-8" rep = rep.content.decode("utf-8") linksArr = (b64plus.decode(rep).decode("utf-8")).split("\n") for link in linksArr: # print(link) link = link.strip() cfg = self.__parseLink(link) if (cfg): self.__configList.append(cfg) logger.info("Read %d node(s)" % len(self.__configList))
def __parseShadowsocksDSubscription(self, ssdSubs): ssdConfig = json.loads(b64plus.decode(ssdSubs).decode("utf-8")) group = ssdConfig.get("airport", "N/A") defaultPort = int(ssdConfig["port"]) defaultMethod = ssdConfig["encryption"] defaultPassword = ssdConfig["password"] defaultPlugin = ssdConfig.get("plugin", "") defaultPluginOpts = ssdConfig.get("plugin_options", "") servers = ssdConfig["servers"] for server in servers: _config = self._getShadowsocksBaseConfig() _config["server"] = server["server"] _config["server_port"] = int(server.get("port", defaultPort)) _config["method"] = server.get("encryption", defaultMethod) _config["password"] = server.get("password", defaultPassword) _config["plugin"] = server.get("plugin", defaultPlugin) _config["plugin_opts"] = server.get("plugin_options", defaultPluginOpts) _config["group"] = group _config["remarks"] = server.get("remarks", server["server"]) self._configList.append(_config) logger.info("Read %d node(s)" % len(self._configList))
def readSubscriptionConfig(self, url): header = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" } rep = requests.get(url, headers=header, timeout=15) rep.encoding = "utf-8" rep = rep.content.decode("utf-8") try: linksArr = (b64plus.decode(rep).decode("utf-8")).split("\n") for link in linksArr: link = link.strip() # print(link) cfg = self._parseLink(link) if (cfg): # print(cfg["remarks"]) self._configList.append(cfg) except ValueError: logger.info("Try V2Ray Clash Parser.") pv2rc = ParserV2RayClash() self._configList = pv2rc.parseSubsConfig(rep) logger.info("Read %d node(s)" % len(self._configList))
def _parseLink(self, link): _config = self._getShadowsocksBaseConfig() # print(self._baseShadowsocksConfig["remarks"]) if (link[:6] != "ssr://"): logger.error("Unsupport link : %s" % link) return None link = link[6:] decoded = b64plus.decode(link).decode("utf-8") decoded1 = decoded.split("/?")[0].split(":")[::-1] if (len(decoded1) != 6): return None addr = "" for i in range(5, len(decoded1) - 1): addr += decoded1[i] + ":" addr += decoded1[len(decoded1) - 1] decoded1[5] = addr decoded2 = decoded.split("/?")[1].split("&") _config["server"] = decoded1[5] _config["server_port"] = int(decoded1[4]) _config["method"] = decoded1[2] _config["protocol"] = decoded1[3] _config["obfs"] = decoded1[1] _config["password"] = b64plus.decode(decoded1[0]).decode("utf-8") for ii in decoded2: if ("obfsparam" in ii): _config["obfs_param"] = b64plus.decode( ii.split("=")[1]).decode("utf-8") continue elif ("protocolparam" in ii or "protoparam" in ii): _config["protocol_param"] = b64plus.decode( ii.split("=")[1]).decode("utf-8") continue elif ("remarks" in ii): _config["remarks"] = b64plus.decode( ii.split("=")[1]).decode("utf-8") continue elif ("group" in ii): _config["group"] = b64plus.decode( ii.split("=")[1]).decode("utf-8") continue if (_config["remarks"] == ""): _config["remarks"] = _config["server"] return _config
def __parseLink(self,link): _config = { "server":"", "server_port":-1, "method":"", "protocol":"", "obfs":"", "plugin":"", "password":"", "protocol_param":"", "obfsparam":"", "plugin_opts":"", "plugin_args":"", "remarks":"", "timeout":5, "group":"N/A" } serverType = "" if (link[:6] == "ssr://"): serverType = "SSR" elif(link[:5] == "ss://"): # link = link[5:] serverType = "SS" if (serverType == ""): logger.error("Unsupport link : %s" % link) return None if (serverType == "SSR"): link = link[6:] decoded = b64plus.decode(link).decode("utf-8") decoded1 = decoded.split("/?")[0].split(":")[::-1] if (len(decoded1) != 6): return None addr = "" for i in range(5,len(decoded1) - 1): addr += decoded1[i] + ":" addr += decoded1[len(decoded1) - 1] decoded1[5] = addr decoded2 = decoded.split("/?")[1].split("&") _config["server"] = decoded1[5] _config["server_port"] = int(decoded1[4]) _config["method"] = decoded1[2] _config["protocol"] = decoded1[3] _config["obfs"] = decoded1[1] _config["password"] = b64plus.decode(decoded1[0]).decode("utf-8") for ii in decoded2: if ("obfsparam" in ii): _config["obfs_param"] = b64plus.decode(ii.split("=")[1]).decode("utf-8") continue elif ("protocolparam" in ii or "protoparam" in ii): _config["protocol_param"] = b64plus.decode(ii.split("=")[1]).decode("utf-8") continue elif ("remarks" in ii): _config["remarks"] = b64plus.decode(ii.split("=")[1]).decode("utf-8") continue elif("group" in ii): _config["group"] = b64plus.decode(ii.split("=")[1]).decode("utf-8") continue elif(serverType == "SS"): urlData = urllib.parse.unquote(link) urlResult = urllib.parse.urlparse(urlData) decoded = b64plus.decode(urlResult.netloc[:urlResult.netloc.find("@")]).decode("utf-8") method = decoded.split(":")[0] password = decoded.split(":")[1] addrPort = urlResult.netloc[urlResult.netloc.find("@") + 1:].split(":") remarks = urlResult.fragment if (len(addrPort) != 2): return None serverAddr = addrPort[0] serverPort = int(addrPort[1]) queryResult = urlResult.query # qsResult = urllib.parse.parse_qs(urlResult.query) # plugin = qsResult.get("plugin") plugin = "" pluginOpts = "" group = "N/A" if ("group=" in queryResult): index1 = queryResult.find("group=") + 6 index2 = queryResult.find("&",index1) group = b64plus.decode(queryResult[index1:index2 if index2 != -1 else None]).decode("utf-8") if ("plugin=" in queryResult): index1 = queryResult.find("plugin=") + 7 index2 = queryResult.find(";",index1) plugin = queryResult[index1:index2] index3 = queryResult.find("&",index2) pluginOpts = queryResult[index2 + 1:index3 if index3 != -1 else None] _config["server"] = serverAddr _config["server_port"] = serverPort _config["method"] = method _config["password"] = password _config["group"] = group _config["remarks"] = remarks _config["plugin"] = plugin _config["plugin_opts"] = pluginOpts # decoded1 = decoded.split("@")[1].split(":")[::-1] # decoded2 = decoded.split("@")[0].split(":") # if (len(decoded1) != 2): # return None # addr = "" # for i in range(1,len(decoded1) - 1): # addr += decoded1[i] + ":" # addr += decoded1[len(decoded1) - 1] # decoded1[1] = addr # _config["server"] = decoded1[1] # _config["port"] = int(decoded1[0]) # _config["method"] = decoded2[0] # _config["password"] = decoded2[1] # _config["group"] = "Shadowsocks" # _config["remarks"] = _config["server"] #print(decoded) #print(decoded2) if (_config["remarks"] == ""): _config["remarks"] = _config["server"] _config["local_port"] = LOCAL_PORT _config["local_address"] = LOCAL_ADDRESS _config["timeout"] = TIMEOUT _config["fast_open"] = False return _config
def parseSubsConfig(self, rawLink): link = rawLink[8:] linkDecoded = b64plus.decode(link).decode("utf-8") try: linkSplited = linkDecoded.split(",") remarks = linkSplited[0].split(" = ")[0] server = linkSplited[1] port = int(linkSplited[2]) security = linkSplited[3] uuid = linkSplited[4].replace("\"", "") group = linkSplited[5].split("=")[1] tls = "" tlsHost = "" host = "" # http host,web socket host,h2 host,quic encrypt method net = "tcp" path = "" #Websocket path, http path, quic encrypt key headers = [] if (linkSplited[6].split("=")[1] == "true"): tls = "tls" tlsHost = linkSplited[7].split("=")[1] allowInsecure = False if (linkSplited[8].split("=")[1] == "1") else True else: allowInsecure = True i = 7 if (tls): i = 8 if (len(linkSplited) == 12): net = linkSplited[i + 1].split("=")[1] path = linkSplited[i + 2].split("=")[1].replace("\"", "") header = linkSplited[i + 3].split("=")[1].replace( "\"", "").split("[Rr][Nn]") if (len(header) > 0): host = header[0].split(": ")[1] for h in range(1, len(header)): headers.append({ "header": header[h].split(": ")[0], "value": header[h].split(": ")[1] }) _type = "none" #Obfs type under tcp mode aid = 0 logger.debug( "Server : {},Port : {}, tls-host : {}, Path : {},Type : {},UUID : {},AlterId : {},Network : {},Host : {}, Headers : {},TLS : {},Remarks : {},group={}" .format(server, port, tlsHost, path, _type, uuid, aid, net, host, headers, tls, remarks, group)) _config = { "remarks": remarks, "group": group, "server": server, "server_port": port, "id": uuid, "alterId": aid, "security": security, "allowInsecure": allowInsecure, "type": _type, "path": path, "network": net, "host": host, "headers": headers, "tls": tls, "tls-host": tlsHost } return _config except: logger.exception( "Parse {} failed.(Quantumult Method)".format(rawLink)) return None
def __parseLink(self, link): _config = { "server": "", "server_port": -1, "method": "", "plugin": "", "password": "", "plugin_opts": "", "plugin_args": "", "remarks": "", "timeout": TIMEOUT, "group": "N/A" } urlData = urllib.parse.unquote(link) urlResult = urllib.parse.urlparse(urlData) decoded = b64plus.decode( urlResult.netloc[:urlResult.netloc.find("@")]).decode("utf-8") method = decoded.split(":")[0] password = decoded.split(":")[1] addrPort = urlResult.netloc[urlResult.netloc.find("@") + 1:].split(":") remarks = urlResult.fragment if (len(addrPort) != 2): return None serverAddr = addrPort[0] serverPort = int(addrPort[1]) queryResult = urlResult.query # qsResult = urllib.parse.parse_qs(urlResult.query) # plugin = qsResult.get("plugin") plugin = "" pluginOpts = "" group = "N/A" if ("group=" in queryResult): index1 = queryResult.find("group=") + 6 index2 = queryResult.find("&", index1) group = b64plus.decode( queryResult[index1:index2 if index2 != -1 else None]).decode( "utf-8") if ("plugin=" in queryResult): index1 = queryResult.find("plugin=") + 7 index2 = queryResult.find(";", index1) plugin = queryResult[index1:index2] index3 = queryResult.find("&", index2) pluginOpts = queryResult[index2 + 1:index3 if index3 != -1 else None] _config["server"] = serverAddr _config["server_port"] = serverPort _config["method"] = method _config["password"] = password _config["group"] = group _config["remarks"] = remarks _config["plugin"] = plugin _config["plugin_opts"] = pluginOpts if (_config["remarks"] == ""): _config["remarks"] = _config["server"] _config["local_port"] = LOCAL_PORT _config["local_address"] = LOCAL_ADDRESS _config["timeout"] = TIMEOUT _config["fast_open"] = False return _config