router.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package api
  2. import (
  3. "html/template"
  4. "net/http"
  5. "os"
  6. "github.com/gin-gonic/gin"
  7. _ "github.com/heroku/x/hmetrics/onload"
  8. "github.com/zu1k/proxypool/config"
  9. binhtml "github.com/zu1k/proxypool/internal/bindata/html"
  10. "github.com/zu1k/proxypool/internal/cache"
  11. "github.com/zu1k/proxypool/pkg/provider"
  12. )
  13. const version = "v0.3.2"
  14. var router *gin.Engine
  15. func setupRouter() {
  16. gin.SetMode(gin.ReleaseMode)
  17. router = gin.New()
  18. router.Use(gin.Logger(), gin.Recovery())
  19. temp, err := loadTemplate()
  20. if err != nil {
  21. panic(err)
  22. }
  23. router.SetHTMLTemplate(temp)
  24. router.GET("/", func(c *gin.Context) {
  25. c.HTML(http.StatusOK, "assets/html/index.html", gin.H{
  26. "domain": config.Config.Domain,
  27. "getters_count": cache.GettersCount,
  28. "all_proxies_count": cache.AllProxiesCount,
  29. "ss_proxies_count": cache.SSProxiesCount,
  30. "ssr_proxies_count": cache.SSRProxiesCount,
  31. "vmess_proxies_count": cache.VmessProxiesCount,
  32. "trojan_proxies_count": cache.TrojanProxiesCount,
  33. "useful_proxies_count": cache.UsefullProxiesCount,
  34. "last_crawl_time": cache.LastCrawlTime,
  35. "version": version,
  36. })
  37. })
  38. router.GET("/clash", func(c *gin.Context) {
  39. c.HTML(http.StatusOK, "assets/html/clash.html", gin.H{
  40. "domain": config.Config.Domain,
  41. })
  42. })
  43. router.GET("/surge", func(c *gin.Context) {
  44. c.HTML(http.StatusOK, "assets/html/surge.html", gin.H{
  45. "domain": config.Config.Domain,
  46. })
  47. })
  48. router.GET("/clash/config", func(c *gin.Context) {
  49. c.HTML(http.StatusOK, "assets/html/clash-config.yaml", gin.H{
  50. "domain": config.Config.Domain,
  51. })
  52. })
  53. router.GET("/surge/config", func(c *gin.Context) {
  54. c.HTML(http.StatusOK, "assets/html/surge.conf", gin.H{
  55. "domain": config.Config.Domain,
  56. })
  57. })
  58. router.GET("/clash/proxies", func(c *gin.Context) {
  59. proxyTypes := c.DefaultQuery("type", "")
  60. proxyCountry := c.DefaultQuery("c", "")
  61. text := ""
  62. if proxyTypes == "" && proxyCountry == "" {
  63. text = cache.GetString("clashproxies")
  64. if text == "" {
  65. proxies := cache.GetProxies("proxies")
  66. clash := provider.Clash{Proxies: proxies}
  67. text = clash.Provide()
  68. cache.SetString("clashproxies", text)
  69. }
  70. } else if proxyTypes == "all" {
  71. proxies := cache.GetProxies("allproxies")
  72. clash := provider.Clash{Proxies: proxies, Types: proxyTypes, Country: proxyCountry}
  73. text = clash.Provide()
  74. } else {
  75. proxies := cache.GetProxies("proxies")
  76. clash := provider.Clash{Proxies: proxies, Types: proxyTypes, Country: proxyCountry}
  77. text = clash.Provide()
  78. }
  79. c.String(200, text)
  80. })
  81. router.GET("/surge/proxies", func(c *gin.Context) {
  82. text := cache.GetString("surgeproxies")
  83. if text == "" {
  84. proxies := cache.GetProxies("proxies")
  85. surge := provider.Surge{Proxies: proxies}
  86. text = surge.Provide()
  87. cache.SetString("surgeproxies", text)
  88. }
  89. c.String(200, text)
  90. })
  91. }
  92. func Run() {
  93. setupRouter()
  94. port := os.Getenv("PORT")
  95. if port == "" {
  96. port = "8080"
  97. }
  98. router.Run(":" + port)
  99. }
  100. func loadTemplate() (t *template.Template, err error) {
  101. t = template.New("")
  102. for _, fileName := range binhtml.AssetNames() {
  103. data := binhtml.MustAsset(fileName)
  104. t, err = t.New(fileName).Parse(string(data))
  105. if err != nil {
  106. return nil, err
  107. }
  108. }
  109. return t, nil
  110. }