帮助文档>代理IP>代码示例 > 隧道代理(固定时长)Go语言代码示例

隧道代理(固定时长)Go语言代码示例

发布时间:2023-03-27 21:39
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. "sync"
  8. "time"
  9. )
  10. /** 返回内容
  11. 第一次循环
  12. 当前 IP:121.230.91.188 来自于:中国 江苏 泰州 电信
  13. 当前 IP:60.184.205.115 来自于:中国 浙江 丽水 电信
  14. 当前 IP:125.112.205.149 来自于:中国 浙江 金华 电信
  15. 当前 IP:60.184.108.175 来自于:中国 浙江 丽水 电信
  16. 当前 IP:58.214.87.31 来自于:中国 江苏 无锡 电信
  17. 当前 IP:183.143.131.24 来自于:中国 浙江 湖州 电信
  18. 当前 IP:42.53.99.119 来自于:中国 辽宁 锦州 联通
  19. 当前 IP:59.60.142.70 来自于:中国 福建 漳州 电信
  20. 当前 IP:114.226.175.159 来自于:中国 江苏 常州 电信
  21. 当前 IP:123.162.194.223 来自于:中国 河南 驻马店 电信
  22. max channel reached
  23. 第二次循环
  24. 当前 IP:114.226.175.159 来自于:中国 江苏 常州 电信
  25. 当前 IP:60.184.205.115 来自于:中国 浙江 丽水 电信
  26. 当前 IP:121.230.91.188 来自于:中国 江苏 泰州 电信
  27. 当前 IP:125.112.205.149 来自于:中国 浙江 金华 电信
  28. 当前 IP:123.162.194.223 来自于:中国 河南 驻马店 电信
  29. 当前 IP:58.214.87.31 来自于:中国 江苏 无锡 电信
  30. 当前 IP:183.143.131.24 来自于:中国 浙江 湖州 电信
  31. 当前 IP:60.184.108.175 来自于:中国 浙江 丽水 电信
  32. 当前 IP:59.60.142.70 来自于:中国 福建 漳州 电信
  33. 当前 IP:42.53.99.119 来自于:中国 辽宁 锦州 联通
  34. 第二次循环返回的IP与第一次循环相同,因为goroutine是异步的,所以返回顺序和第一次不一致
  35. myip.ipip.net服务器可能比较容易失败,用户可以自己找一个其他获取客户端IP的服务器来测试
  36. */
  37. // 固定时长多通道隧道模式
  38. func main() {
  39. authKey := "请改成您的Key" //固定时长1分钟的隧道,通道数10
  40. password := "请改成您的AuthPwd"
  41. proxyServer := "请改成您的隧道地址" //如:tunnel3.qg.net:19263
  42. targetURL := "https://ip.cn/api/index?ip=&type=0"
  43. rawURL := fmt.Sprintf("http://%s:%s@%s", authKey, password, proxyServer)
  44. proxyUrl, _ := url.Parse(rawURL)
  45. wg := sync.WaitGroup{}
  46. wg.Add(11)
  47. // 十个通道分别使用不同的十个IP,第十一次会返回错误,通道数超出
  48. for i := 0; i < 11; i++ {
  49. go func(index int) {
  50. defer wg.Done()
  51. client := http.Client{
  52. Transport: &http.Transport{
  53. ProxyConnectHeader: http.Header{
  54. "Proxy-TunnelID": []string{fmt.Sprintf("channel-%d", index)}, // 指定通道ID
  55. },
  56. Proxy: http.ProxyURL(proxyUrl),
  57. },
  58. }
  59. req, _ := http.NewRequest("GET", targetURL, nil)
  60. rsp, err := client.Do(req)
  61. if err != nil {
  62. fmt.Printf("request failed: %s\n", err)
  63. return
  64. }
  65. defer rsp.Body.Close()
  66. body, err := ioutil.ReadAll(rsp.Body)
  67. if err != nil {
  68. fmt.Println(err)
  69. } else {
  70. fmt.Println(string(body))
  71. }
  72. }(i)
  73. }
  74. wg.Wait()
  75. // 因为固定时长为1分钟,所以在1分钟内继续使用已有通道,仍是之前的IP
  76. time.Sleep(time.Second * 10)
  77. wg.Add(10)
  78. for i := 0; i < 10; i++ {
  79. go func(index int) {
  80. defer wg.Done()
  81. client := http.Client{
  82. Transport: &http.Transport{
  83. ProxyConnectHeader: http.Header{
  84. "Proxy-TunnelID": []string{fmt.Sprintf("channel-%d", index)}, // 指定通道ID
  85. },
  86. Proxy: http.ProxyURL(proxyUrl),
  87. },
  88. }
  89. req, _ := http.NewRequest("GET", targetURL, nil)
  90. rsp, err := client.Do(req)
  91. if err != nil {
  92. fmt.Printf("request failed: %s\n", err)
  93. return
  94. }
  95. defer rsp.Body.Close()
  96. body, err := ioutil.ReadAll(rsp.Body)
  97. if err != nil {
  98. fmt.Println(err)
  99. } else {
  100. fmt.Println(string(body))
  101. }
  102. }(i)
  103. }
  104. wg.Wait()
  105. }
本文导读

客户热线: