232 lines
5.5 KiB
Go
232 lines
5.5 KiB
Go
package api
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
"os"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
_ "github.com/heroku/x/hmetrics/onload"
|
|
"github.com/zu1k/proxypool/config"
|
|
binhtml "github.com/zu1k/proxypool/internal/bindata/html"
|
|
"github.com/zu1k/proxypool/internal/cache"
|
|
"github.com/zu1k/proxypool/pkg/provider"
|
|
)
|
|
|
|
const version = "v0.3.9"
|
|
|
|
var router *gin.Engine
|
|
|
|
func setupRouter() {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
router = gin.New()
|
|
router.Use(gin.Recovery())
|
|
temp, err := loadTemplate()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
router.SetHTMLTemplate(temp)
|
|
|
|
router.GET("/", func(c *gin.Context) {
|
|
c.HTML(http.StatusOK, "assets/html/index.html", gin.H{
|
|
"domain": config.Config.Domain,
|
|
"getters_count": cache.GettersCount,
|
|
"all_proxies_count": cache.AllProxiesCount,
|
|
"ss_proxies_count": cache.SSProxiesCount,
|
|
"ssr_proxies_count": cache.SSRProxiesCount,
|
|
"vmess_proxies_count": cache.VmessProxiesCount,
|
|
"trojan_proxies_count": cache.TrojanProxiesCount,
|
|
"useful_proxies_count": cache.UsefullProxiesCount,
|
|
"last_crawl_time": cache.LastCrawlTime,
|
|
"version": version,
|
|
})
|
|
})
|
|
|
|
router.GET("/clash", func(c *gin.Context) {
|
|
c.HTML(http.StatusOK, "assets/html/clash.html", gin.H{
|
|
"domain": config.Config.Domain,
|
|
})
|
|
})
|
|
|
|
router.GET("/surge", func(c *gin.Context) {
|
|
c.HTML(http.StatusOK, "assets/html/surge.html", gin.H{
|
|
"domain": config.Config.Domain,
|
|
})
|
|
})
|
|
|
|
router.GET("/clash/config", func(c *gin.Context) {
|
|
c.HTML(http.StatusOK, "assets/html/clash-config.yaml", gin.H{
|
|
"domain": config.Config.Domain,
|
|
})
|
|
})
|
|
|
|
router.GET("/surge/config", func(c *gin.Context) {
|
|
c.HTML(http.StatusOK, "assets/html/surge.conf", gin.H{
|
|
"domain": config.Config.Domain,
|
|
})
|
|
})
|
|
|
|
router.GET("/clash/proxies", func(c *gin.Context) {
|
|
proxyTypes := c.DefaultQuery("type", "")
|
|
proxyCountry := c.DefaultQuery("c", "")
|
|
proxyNotCountry := c.DefaultQuery("nc", "")
|
|
text := ""
|
|
if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" {
|
|
text = cache.GetString("clashproxies")
|
|
if text == "" {
|
|
proxies := cache.GetProxies("proxies")
|
|
clash := provider.Clash{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
},
|
|
}
|
|
text = clash.Provide()
|
|
cache.SetString("clashproxies", text)
|
|
}
|
|
} else if proxyTypes == "all" {
|
|
proxies := cache.GetProxies("allproxies")
|
|
clash := provider.Clash{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: proxyTypes,
|
|
Country: proxyCountry,
|
|
NotCountry: proxyNotCountry,
|
|
},
|
|
}
|
|
text = clash.Provide()
|
|
} else {
|
|
proxies := cache.GetProxies("proxies")
|
|
clash := provider.Clash{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: proxyTypes,
|
|
Country: proxyCountry,
|
|
NotCountry: proxyNotCountry,
|
|
},
|
|
}
|
|
text = clash.Provide()
|
|
}
|
|
c.String(200, text)
|
|
})
|
|
router.GET("/surge/proxies", func(c *gin.Context) {
|
|
proxyTypes := c.DefaultQuery("type", "")
|
|
proxyCountry := c.DefaultQuery("c", "")
|
|
proxyNotCountry := c.DefaultQuery("nc", "")
|
|
text := ""
|
|
if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" {
|
|
text = cache.GetString("surgeproxies")
|
|
if text == "" {
|
|
proxies := cache.GetProxies("proxies")
|
|
surge := provider.Surge{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
},
|
|
}
|
|
text = surge.Provide()
|
|
cache.SetString("surgeproxies", text)
|
|
}
|
|
} else if proxyTypes == "all" {
|
|
proxies := cache.GetProxies("allproxies")
|
|
surge := provider.Surge{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: proxyTypes,
|
|
Country: proxyCountry,
|
|
NotCountry: proxyNotCountry,
|
|
},
|
|
}
|
|
text = surge.Provide()
|
|
} else {
|
|
proxies := cache.GetProxies("proxies")
|
|
surge := provider.Surge{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: proxyTypes,
|
|
Country: proxyCountry,
|
|
NotCountry: proxyNotCountry,
|
|
},
|
|
}
|
|
text = surge.Provide()
|
|
}
|
|
c.String(200, text)
|
|
})
|
|
|
|
router.GET("/ss/sub", func(c *gin.Context) {
|
|
proxies := cache.GetProxies("proxies")
|
|
ssSub := provider.SSSub{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: "ss",
|
|
},
|
|
}
|
|
c.String(200, ssSub.Provide())
|
|
})
|
|
router.GET("/ssr/sub", func(c *gin.Context) {
|
|
proxies := cache.GetProxies("proxies")
|
|
ssrSub := provider.SSRSub{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: "ssr",
|
|
},
|
|
}
|
|
c.String(200, ssrSub.Provide())
|
|
})
|
|
router.GET("/vmess/sub", func(c *gin.Context) {
|
|
proxies := cache.GetProxies("proxies")
|
|
vmessSub := provider.VmessSub{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: "vmess",
|
|
},
|
|
}
|
|
c.String(200, vmessSub.Provide())
|
|
})
|
|
|
|
router.GET("/sip002/sub", func(c *gin.Context) {
|
|
proxies := cache.GetProxies("proxies")
|
|
sip002Sub := provider.SIP002Sub{
|
|
provider.Base{
|
|
Proxies: &proxies,
|
|
Types: "ss",
|
|
},
|
|
}
|
|
c.String(200, sip002Sub.Provide())
|
|
})
|
|
|
|
router.GET("/link/:id", func(c *gin.Context) {
|
|
idx := c.Param("id")
|
|
proxies := cache.GetProxies("allproxies")
|
|
id, err := strconv.Atoi(idx)
|
|
if err != nil {
|
|
c.String(500, err.Error())
|
|
}
|
|
if id >= proxies.Len() {
|
|
c.String(500, "id too big")
|
|
}
|
|
c.String(200, proxies[id].Link())
|
|
})
|
|
}
|
|
|
|
func Run() {
|
|
setupRouter()
|
|
port := os.Getenv("PORT")
|
|
if port == "" {
|
|
port = "8080"
|
|
}
|
|
router.Run(":" + port)
|
|
}
|
|
|
|
func loadTemplate() (t *template.Template, err error) {
|
|
_ = binhtml.RestoreAssets("", "assets/html")
|
|
t = template.New("")
|
|
for _, fileName := range binhtml.AssetNames() {
|
|
data := binhtml.MustAsset(fileName)
|
|
t, err = t.New(fileName).Parse(string(data))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return t, nil
|
|
}
|