Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
 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))
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
	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))
Ejemplo n.º 6
0
 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))
Ejemplo n.º 7
0
 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))
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
	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
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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