Skip to content

Commit

Permalink
feat: 优化clash解析,异常端口处理
Browse files Browse the repository at this point in the history
  • Loading branch information
Leon406 committed Apr 20, 2024
1 parent 27d2403 commit 799e523
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 74 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
implementation 'com.google.code.gson:gson:2.10.1'
//for yaml 1.1, 1.32 limit maxsize 3M
implementation 'org.yaml:snakeyaml:2.2'
implementation 'org.yaml:snakeyaml:1.31'
//mmdb格式
implementation 'com.maxmind.geoip2:geoip2:4.2.0'
//dat格式
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/me/leon/Clash.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ data class Clash(
var ipv6: Boolean = false
var `cfw-bypass`: List<String> = mutableListOf()
var `cfw-latency-timeout`: Int = 0
var `experimental`: Any = Any()
var experimental: Any = Any()
var `find-process-mode`: Any = Any()
var `global-client-fingerprint`: Any = Any()
var sniffer: Any = Any()
var rule: List<String> = mutableListOf()
var `proxy-providers`: LinkedHashMap<String, Any> = linkedMapOf()
}
Expand Down Expand Up @@ -73,7 +76,9 @@ data class Node(

// hysteria
var auth_str: String = ""
var `auth-str`: String = ""
var alpn: String = ""
var up: String = ""
var disable_mtu_discovery: Boolean = false

// http协议
Expand All @@ -82,6 +87,8 @@ data class Node(
var `grpc-opts`: LinkedHashMap<String, Any> = linkedMapOf()

var group: String = ""
// vmess
var `client-fingerprint` :String = ""
data class VmessWsOpts(
var path: String = "",
var headers: LinkedHashMap<String, String> = linkedMapOf()
Expand Down
1 change: 1 addition & 0 deletions src/main/java/me/leon/Parser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ object Parser {
// 移除yaml中的标签
{
data
.replace("\\[[^\"]+?]".toRegex(),"")
.parseYaml<Clash>()
.proxies
.asSequence()
Expand Down
15 changes: 8 additions & 7 deletions src/main/java/me/leon/Subs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ data class V2ray(
ps = value
}
override var serverPort: Int = 0
get() = port.toInt()
get() = runCatching { port.toInt() }.getOrDefault(-1)
override val SERVER
get() = add
override var nation: String = ""
Expand All @@ -90,7 +90,7 @@ data class SS(
remark = value
}
override val serverPort
get() = port.toInt()
get() = runCatching { port.toInt() }.getOrDefault(-1)
override val SERVER
get() = server

Expand Down Expand Up @@ -119,7 +119,7 @@ data class SSR(
remarks = value
}
override val serverPort
get() = port.toInt()
get() = runCatching { port.toInt() }.getOrDefault(-1)
override val SERVER
get() = server
override var nation: String = ""
Expand Down Expand Up @@ -150,7 +150,7 @@ data class Trojan(val password: String = "", val server: String = "", val port:
private val params
get() = if (query.isEmpty()) "" else "?$query"
override val serverPort
get() = port.toInt()
get() = runCatching { port.toInt() }.getOrDefault(-1)
override val SERVER
get() = server
override var nation: String = ""
Expand All @@ -176,13 +176,14 @@ data class Vless(val uuid: String = "", val server: String = "", val port: Strin
private val params
get() = if (query.isEmpty()) "" else "?$query"
override val serverPort
get() = port.toInt()
get() = runCatching { port.toInt() }.getOrDefault(-1)
override val SERVER
get() = server
override var nation: String = ""

override fun toUri() =
"vless://${"${uuid.urlEncode()}@$server:$port$params"}#${name.urlEncode()}"

override fun info() =
if (query.isEmpty()) {
"$nation $name vless $server:$port"
Expand All @@ -193,8 +194,8 @@ data class Vless(val uuid: String = "", val server: String = "", val port: Strin

fun Sub.methodUnSupported() =
this is SSR && (method in SSR_unSupportMethod || protocol in SSR_unSupportProtocol) ||
this is SS && method in SS_unSupportCipher ||
this is V2ray && net in VMESS_unSupportProtocol
this is SS && method in SS_unSupportCipher ||
this is V2ray && net in VMESS_unSupportProtocol

val SSR_unSupportMethod = arrayOf("none", "rc4", "rc4-md5")
val SSR_unSupportProtocol = arrayOf("auth_chain_a")
Expand Down
4 changes: 1 addition & 3 deletions src/test/java/me/leon/ConnectTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class ConnectTest {
@Test
fun url404() {
runBlocking {
("$ROOT/pool/sublists".readLines() + "$ROOT/pool/subs")
("$ROOT/pool/sublists".readLines() + "$ROOT/pool/subs".readLines())
.filterNot { it.startsWith("#") }
.map {
async(DISPATCHER) {
Expand All @@ -54,7 +54,5 @@ class ConnectTest {
println(it)
}
}


}
}
33 changes: 11 additions & 22 deletions src/test/java/me/leon/NetworkSubTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,9 @@ import org.junit.jupiter.api.Test
class NetworkSubTest {
@Test
fun subParse() {
/**
* https://qiaomenzhuanfx.netlify.app/
* https://ghproxy.net/https://raw.githubusercontent.com/learnhard-cn/free_proxy_ss/main/clash/providers/provider_home_netflix.yaml
* https://ghproxy.com/https://raw.githubusercontent.com/Jsnzkpg/Jsnzkpg/Jsnzkpg/Jsnzkpg
* https://ghproxy.net/https://raw.githubusercontent.com/git-yusteven/openit/main/long
* https://ghproxy.net/https://raw.githubusercontent.com/webdao/v2ray/master/nodes.txt
* https://ghproxy.com/https://raw.githubusercontent.com/mahdibland/get_v2/main/pub/changfengoss13.yaml
* https://ghproxy.com/https://raw.githubusercontent.com/mahdibland/get_v2/main/pub/changfengoss1.yaml
* https://ghproxy.com/https://raw.githubusercontent.com/eycorsican/rule-sets/master/kitsunebi_sub
* https://ghproxy.net/https://raw.githubusercontent.com/alanbobs999/TopFreeProxies/master/sub/sub_merge_base64.txt
* https://ghproxy.net/https://raw.githubusercontent.com/JasonZhao2k08/fly/main/index.html
*/
// https://ghproxy.com/https://raw.githubusercontent.com/samjoeyang/subscribe/main/fly

val e =
"https://ghproxy.net/https://raw.githubusercontent.com/alanbobs999/TopFreeProxies/master/sub/sub_merge_base64.txt"
// runBlocking {
// Parser.parseFromSub(e)
// .map { it to async(DISPATCHER) { it.SERVER.quickConnect(it.serverPort,
// 1000) } }
// .filter { it.second.await() > -1 }
// .also { println(it.size) }
// .forEach { println(it.first.info() + ":" + it.second) }
// }
"https://gitlab.com/univstar1/v2ray/-/raw/main/data/clash/general.yaml"

listOf(
e,
Expand Down Expand Up @@ -74,6 +54,15 @@ class NetworkSubTest {
println(it.info())
}
}
@Test
fun parseSs() {
val uri =
"ss://YWVzLTI1Ni1jZmI6OWQ2Y2NlYWEzNzNiZjJjOGFjYjIyZTYwYjZhNThiZTZANDUuNzkuMTExLjIxNDo0NDM=#%E7%BE%8E%E5%9B%BD"
Parser.parseSs(uri).also {
Assertions.assertEquals(uri, it.toUri())
println(it.info())
}
}

@Test
fun parseText() {
Expand Down
79 changes: 41 additions & 38 deletions src/test/java/me/leon/NodeCrawler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import me.leon.support.*
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import java.text.SimpleDateFormat
import java.util.Date
import java.util.*

@Suppress("LongMethod")
class NodeCrawler {
Expand All @@ -33,53 +33,35 @@ class NodeCrawler {
nodeGroup()
}

/** 爬取配置文件数据,并去重写入文件 */
/** 爬取配置文件数据,并去重写入文件 */
@Test
@Disabled
fun crawlNodes() {
val subs1 = "$ROOT/pool/subpool".readLines()
val subs2 = "$ROOT/pool/subs".readLines()
// val subs3 = "$SHARE2/tmp".readLines()
val sublist = "$ROOT/pool/sublists".readLines()
val subs3 =
sublist
.map { it.readFromNet() }
.flatMap { it.split("\r\n|\n".toRegex()) }
.distinct()
.also { println("before ${it.size}") }
.filterNot { it.startsWith("#") || it.trim().isEmpty() }
.also {
println(it)
println("after ${it.size}")
}
val subs = (subs1 + subs2 + subs3).toHashSet()
println(subs.size)
val mergeSubs = mergeAllNodesUrl()
println(mergeSubs.size)
val prefix = SimpleDateFormat("MMddHH").format(Date())
val countryMap = mutableMapOf<String, Int>()
val errorList = mutableListOf<String>()
POOL.writeLine()
runBlocking {
subs
.filterNot { it.trim().startsWith("#") || it.trim().isEmpty() }
.also { println("共有订阅源:${it.size.also { subCount = it }}") }
.map { sub ->
sub to
async(DISPATCHER) {
runCatching {
val uri = sub
Parser.parseFromSub(uri).also {
println("$uri ${it.size}")
if (it.size == 0) {
errorList.add(uri)
}
mergeSubs.map { sub ->
sub to
async(DISPATCHER) {
runCatching {
val uri = sub
Parser.parseFromSub(uri).also {
println("$uri ${it.size}")
if (it.size == 0) {
errorList.add(uri)
}
}
.getOrElse {
println("___parse failed $sub ${it.message}")
linkedSetOf()
}
}
}
.getOrElse {
println("___parse failed $sub ${it.message}")
linkedSetOf()
}
}
}
.map { it.first to it.second.await() }
.fold(linkedSetOf<Sub>()) { acc, linkedHashSet ->
maps[linkedHashSet.first] = linkedHashSet.second
Expand Down Expand Up @@ -142,12 +124,33 @@ class NodeCrawler {
return
}
typeMapper[clazz]?.run {
first.writeLine(data,false).also {
first.writeLine(data, false).also {
println("$second${subList.size}".also { nodeInfo.writeLine("- $it") })
}
}
}

private fun mergeAllNodesUrl(): HashSet<String> {
val sub1 = "$ROOT/pool/subs".readLines()
val sublist = "$ROOT/pool/sublists".readLines()
val sub2 =
sublist
.map { it.readFromNet() }
.flatMap { it.split("\r\n|\n".toRegex()) }
.distinct()
.filterNot { it.startsWith("#") || it.trim().isEmpty() }
.also {
println(it)
println("after ${it.size}")
}
val mergeSubs = (sub1 + sub2)
.filterNot { it.trim().startsWith("#") || it.trim().isEmpty() }
.toHashSet()
.also { println("共有订阅源:${it.size.also { subCount = it }}") }

return mergeSubs
}

companion object {
private val nodeInfo = "$ROOT/info.md"
const val CUSTOM_INFO = "防失效github SubCrawler"
Expand Down
2 changes: 0 additions & 2 deletions sub/pool/subpool

This file was deleted.

0 comments on commit 799e523

Please sign in to comment.