关于使用ktor挂代理方面的问题请教
-
最近正在尝试使用ktor进行代理下载pixiv的图片。
object KtorUtils {
// 使用代理的ktor客户端
@OptIn(KtorExperimentalAPI::class)
val proxyClient = HttpClient(OkHttp) {
engine {
when(SettingsConfig.proxyConfig) {
2 -> proxy = ProxyBuilder.socks(host = SettingsConfig.socksProxy.host, port = SettingsConfig.socksProxy.port)
1 -> proxy = ProxyBuilder.http(SettingsConfig.httpProxy.proxy)
0 -> null
else -> {
null
}
}
//proxy = ProxyBuilder.http("http://127.0.0.1:4556")
//null
}
}
如这个代码所示,我这边使用When通过设置SettingsConfig来控制代理的地址和模式。
可我发现这行代码总是无法正常地进行代理的。
但我这边将when包括里面的函数全部注释掉只使用上面代码中已注释掉的:
proxy = ProxyBuilder.http("http://127.0.0.1:4556")却可以正常地进行代理下载。
有谁能告诉我具体是什么情况吗?SettingsConfigdia的代码:
import kotlinx.serialization.Serializable
import net.mamoe.mirai.console.data.ReadOnlyPluginConfig
import net.mamoe.mirai.console.data.ValueDescription
import net.mamoe.mirai.console.data.value
object SettingsConfig : ReadOnlyPluginConfig("Settings") {
@ValueDescription(
"""
代理设置
0 不使用代理
1 使用http代理
2 使用socks代理
"""
)
val proxyConfig by value(0)
val httpProxy by value(HttpProxy())
val socksProxy by value(SocksProxy())@Serializable data class SocksProxy( val host: String = '127.0.0.1', val port: Int = 4001 ) @Serializable data class HttpProxy( val proxy: String = "http://127.0.0.0.1:4556" )
}
代码源自于:Mirai-Setu插件的源代码
-
HttpClient(OkHttp) { engine { config { // okhttp 的代理设置要在 config 这里比较好 proxy(proxy = Url("http://127.0.0.1:8080").toProxy()) } } }
ktor自带的 Proxy Build 不好用,推荐你使用我这个函数
可以把Url转成 Proxyfun Url.toProxy(): Proxy { val type = when (protocol) { URLProtocol.SOCKS -> Proxy.Type.SOCKS URLProtocol.HTTP -> Proxy.Type.HTTP else -> throw IllegalArgumentException("不支持的代理类型, $protocol") } return Proxy(type, InetSocketAddress(host, port)) } Url("http://127.0.0.1:8080").toProxy() Url("socks://127.0.0.1:1080").toProxy()
-
另外下载pixiv 的图片可以不用代理,有办法免代理下载图片
-
@cssxsh 十分感谢
主要是为了学习一下如何使用Ktor挂代理进行下载