router.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package api
  2. import (
  3. "html/template"
  4. "net/http"
  5. "os"
  6. "strconv"
  7. "github.com/gin-gonic/gin"
  8. _ "github.com/heroku/x/hmetrics/onload"
  9. "github.com/zu1k/proxypool/config"
  10. binhtml "github.com/zu1k/proxypool/internal/bindata/html"
  11. "github.com/zu1k/proxypool/internal/cache"
  12. "github.com/zu1k/proxypool/pkg/provider"
  13. )
  14. const version = "v0.3.8"
  15. var router *gin.Engine
  16. func setupRouter() {
  17. gin.SetMode(gin.ReleaseMode)
  18. router = gin.New()
  19. router.Use(gin.Recovery())
  20. temp, err := loadTemplate()
  21. if err != nil {
  22. panic(err)
  23. }
  24. router.SetHTMLTemplate(temp)
  25. router.GET("/", func(c *gin.Context) {
  26. c.HTML(http.StatusOK, "assets/html/index.html", gin.H{
  27. "domain": config.Config.Domain,
  28. "getters_count": cache.GettersCount,
  29. "all_proxies_count": cache.AllProxiesCount,
  30. "ss_proxies_count": cache.SSProxiesCount,
  31. "ssr_proxies_count": cache.SSRProxiesCount,
  32. "vmess_proxies_count": cache.VmessProxiesCount,
  33. "trojan_proxies_count": cache.TrojanProxiesCount,
  34. "useful_proxies_count": cache.UsefullProxiesCount,
  35. "last_crawl_time": cache.LastCrawlTime,
  36. "version": version,
  37. })
  38. })
  39. router.GET("/clash", func(c *gin.Context) {
  40. c.HTML(http.StatusOK, "assets/html/clash.html", gin.H{
  41. "domain": config.Config.Domain,
  42. })
  43. })
  44. router.GET("/surge", func(c *gin.Context) {
  45. c.HTML(http.StatusOK, "assets/html/surge.html", gin.H{
  46. "domain": config.Config.Domain,
  47. })
  48. })
  49. router.GET("/clash/config", func(c *gin.Context) {
  50. c.HTML(http.StatusOK, "assets/html/clash-config.yaml", gin.H{
  51. "domain": config.Config.Domain,
  52. })
  53. })
  54. router.GET("/surge/config", func(c *gin.Context) {
  55. c.HTML(http.StatusOK, "assets/html/surge.conf", gin.H{
  56. "domain": config.Config.Domain,
  57. })
  58. })
  59. router.GET("/clash/proxies", func(c *gin.Context) {
  60. proxyTypes := c.DefaultQuery("type", "")
  61. proxyCountry := c.DefaultQuery("c", "")
  62. proxyNotCountry := c.DefaultQuery("nc", "")
  63. text := ""
  64. if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" {
  65. text = cache.GetString("clashproxies")
  66. if text == "" {
  67. proxies := cache.GetProxies("proxies")
  68. clash := provider.Clash{
  69. provider.Base{
  70. Proxies: &proxies,
  71. },
  72. }
  73. text = clash.Provide()
  74. cache.SetString("clashproxies", text)
  75. }
  76. } else if proxyTypes == "all" {
  77. proxies := cache.GetProxies("allproxies")
  78. clash := provider.Clash{
  79. provider.Base{
  80. Proxies: &proxies,
  81. Types: proxyTypes,
  82. Country: proxyCountry,
  83. NotCountry: proxyNotCountry,
  84. },
  85. }
  86. text = clash.Provide()
  87. } else {
  88. proxies := cache.GetProxies("proxies")
  89. clash := provider.Clash{
  90. provider.Base{
  91. Proxies: &proxies,
  92. Types: proxyTypes,
  93. Country: proxyCountry,
  94. NotCountry: proxyNotCountry,
  95. },
  96. }
  97. text = clash.Provide()
  98. }
  99. c.String(200, text)
  100. })
  101. router.GET("/surge/proxies", func(c *gin.Context) {
  102. proxyTypes := c.DefaultQuery("type", "")
  103. proxyCountry := c.DefaultQuery("c", "")
  104. proxyNotCountry := c.DefaultQuery("nc", "")
  105. text := ""
  106. if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" {
  107. text = cache.GetString("surgeproxies")
  108. if text == "" {
  109. proxies := cache.GetProxies("proxies")
  110. surge := provider.Surge{
  111. provider.Base{
  112. Proxies: &proxies,
  113. },
  114. }
  115. text = surge.Provide()
  116. cache.SetString("surgeproxies", text)
  117. }
  118. } else if proxyTypes == "all" {
  119. proxies := cache.GetProxies("allproxies")
  120. surge := provider.Surge{
  121. provider.Base{
  122. Proxies: &proxies,
  123. Types: proxyTypes,
  124. Country: proxyCountry,
  125. NotCountry: proxyNotCountry,
  126. },
  127. }
  128. text = surge.Provide()
  129. } else {
  130. proxies := cache.GetProxies("proxies")
  131. surge := provider.Surge{
  132. provider.Base{
  133. Proxies: &proxies,
  134. Types: proxyTypes,
  135. Country: proxyCountry,
  136. NotCountry: proxyNotCountry,
  137. },
  138. }
  139. text = surge.Provide()
  140. }
  141. c.String(200, text)
  142. })
  143. router.GET("/ss/sub", func(c *gin.Context) {
  144. proxies := cache.GetProxies("proxies")
  145. ssSub := provider.SSSub{
  146. provider.Base{
  147. Proxies: &proxies,
  148. Types: "ss",
  149. },
  150. }
  151. c.String(200, ssSub.Provide())
  152. })
  153. router.GET("/ssr/sub", func(c *gin.Context) {
  154. proxies := cache.GetProxies("proxies")
  155. ssrSub := provider.SSRSub{
  156. provider.Base{
  157. Proxies: &proxies,
  158. Types: "ssr",
  159. },
  160. }
  161. c.String(200, ssrSub.Provide())
  162. })
  163. router.GET("/vmess/sub", func(c *gin.Context) {
  164. proxies := cache.GetProxies("proxies")
  165. vmessSub := provider.VmessSub{
  166. provider.Base{
  167. Proxies: &proxies,
  168. Types: "vmess",
  169. },
  170. }
  171. c.String(200, vmessSub.Provide())
  172. })
  173. router.GET("/link/:id", func(c *gin.Context) {
  174. idx := c.Param("id")
  175. proxies := cache.GetProxies("allproxies")
  176. id, err := strconv.Atoi(idx)
  177. if err != nil {
  178. c.String(500, err.Error())
  179. }
  180. if id >= proxies.Len() {
  181. c.String(500, "id too big")
  182. }
  183. c.String(200, proxies[id].Link())
  184. })
  185. }
  186. func Run() {
  187. setupRouter()
  188. port := os.Getenv("PORT")
  189. if port == "" {
  190. port = "8080"
  191. }
  192. router.Run(":" + port)
  193. }
  194. func loadTemplate() (t *template.Template, err error) {
  195. _ = binhtml.RestoreAssets("", "assets/html")
  196. t = template.New("")
  197. for _, fileName := range binhtml.AssetNames() {
  198. data := binhtml.MustAsset(fileName)
  199. t, err = t.New(fileName).Parse(string(data))
  200. if err != nil {
  201. return nil, err
  202. }
  203. }
  204. return t, nil
  205. }