MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

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

    开发交流
    2
    4
    429
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Oeed
      Oeed 最后由 编辑

      最近正在尝试使用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 条回复 最后回复 回复 引用 0
      • cssxsh
        cssxsh 最后由 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 条回复 最后回复 回复 引用 0
        • cssxsh
          cssxsh 最后由 编辑

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

          1 条回复 最后回复 回复 引用 0
          • Oeed
            Oeed @cssxsh 最后由 编辑

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

            1 条回复 最后回复 回复 引用 0
            • 1 / 1
            • First post
              Last post
            Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact