MiraiForum

    • Register
    • Login
    • Search
    • Popular
    • Recent
    • Unsolved
    • Tags
    • Groups
    • 友情链接

    关于使用ktor挂代理方面的问题请教

    开发交流
    2
    4
    441
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Oeed
      Oeed last edited by

      最近正在尝试使用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插件的源代码

      1 Reply Last reply Reply Quote 0
      • cssxsh
        cssxsh last edited by cssxsh

        HttpClient(OkHttp) {
            engine {
                config {
                   // okhttp 的代理设置要在 config 这里比较好
                   proxy(proxy = Url("http://127.0.0.1:8080").toProxy())
                }
            }
        }
        

        ktor自带的 Proxy Build 不好用,推荐你使用我这个函数
        可以把Url转成 Proxy

        fun 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()
        
        Oeed 1 Reply Last reply Reply Quote 0
        • cssxsh
          cssxsh last edited by

          另外下载pixiv 的图片可以不用代理,有办法免代理下载图片

          1 Reply Last reply Reply Quote 0
          • Oeed
            Oeed @cssxsh last edited by

            @cssxsh 十分感谢
            主要是为了学习一下如何使用Ktor挂代理进行下载

            1 Reply Last reply Reply Quote 0
            • 1 / 1
            • First post
              Last post
            Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact