Compare commits

...

16 Commits

Author SHA1 Message Date
dependabot[bot]
9e2de020d2 Bump github.com/cloudflare/cloudflare-go from 0.13.2 to 0.16.0
Bumps [github.com/cloudflare/cloudflare-go](https://github.com/cloudflare/cloudflare-go) from 0.13.2 to 0.16.0.
- [Release notes](https://github.com/cloudflare/cloudflare-go/releases)
- [Commits](https://github.com/cloudflare/cloudflare-go/compare/v0.13.2...v0.16.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-12 09:33:59 +00:00
zu1k
066a449622 Merge branch 'master' of github.com:zu1k/proxypool 2020-09-07 20:54:40 +08:00
zu1k
ed29c9ba2a fix surge proxies bug 2020-09-07 20:53:54 +08:00
zu1k
a8df5fd042 Merge pull request #14 from zu1k/dependabot/github_actions/docker/build-push-action-v2
Bump docker/build-push-action from v1.1.0 to v2
2020-09-07 15:52:32 +08:00
dependabot[bot]
9dafaefa4e Bump docker/build-push-action from v1.1.0 to v2
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from v1.1.0 to v2.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Changelog](85d408708d/CHANGELOG.md)
- [Commits](https://github.com/docker/build-push-action/compare/v1.1.0...85d408708d8c09e8991e7b18899e77d7aee89287)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-07 06:36:10 +00:00
zu1k
4006705932 fix nil pointer bug 2020-09-07 13:09:07 +08:00
zu1k
c592df34ab filter nil proxy when append to slice 2020-09-07 13:04:04 +08:00
zu1k
f2d9137488 lookup ip and country when parse proxy 2020-09-07 12:59:45 +08:00
zu1k
d84f2791a3 opti country find 2020-09-07 12:48:03 +08:00
zu1k
240ac61ec0 use ip if exec nslookup 2020-09-07 12:44:55 +08:00
zu1k
5514bbff60 update html 2020-09-07 12:28:23 +08:00
zu1k
d47a3e272e fix nil pointer in derive 2020-09-07 12:12:59 +08:00
zu1k
d324325c89 bump version 2020-09-07 12:03:32 +08:00
zu1k
7554c48fa7 add sip002 support & derive proxy 2020-09-07 12:02:44 +08:00
zu1k
74e5056c60 fix db insert batch fail 2020-09-07 11:46:55 +08:00
zu1k
0e3a17a9f2 add online chat 2020-09-06 10:49:06 +08:00
14 changed files with 193 additions and 150 deletions

View File

@@ -12,7 +12,7 @@ jobs:
uses: actions/checkout@v2.3.2
- name: Build and push Docker images
uses: docker/build-push-action@v1.1.0
uses: docker/build-push-action@v2
with:
username: zu1k
password: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -14,7 +14,7 @@ import (
"github.com/zu1k/proxypool/pkg/provider"
)
const version = "v0.3.8"
const version = "v0.3.9"
var router *gin.Engine
@@ -182,6 +182,18 @@ func setupRouter() {
}
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")

3
go.mod
View File

@@ -11,7 +11,7 @@ require (
github.com/antchfx/htmlquery v1.2.3 // indirect
github.com/antchfx/xmlquery v1.2.4 // indirect
github.com/antchfx/xpath v1.1.8 // indirect
github.com/cloudflare/cloudflare-go v0.13.2
github.com/cloudflare/cloudflare-go v0.16.0
github.com/ghodss/yaml v1.0.0
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.3.0 // indirect
@@ -32,7 +32,6 @@ require (
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
github.com/temoto/robotstxt v1.1.1 // indirect
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/appengine v1.6.6 // indirect
google.golang.org/protobuf v1.25.0 // indirect

30
go.sum
View File

@@ -26,8 +26,8 @@ github.com/aws/aws-sdk-go v1.13.10/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41Zo
github.com/axiomhq/hyperloglog v0.0.0-20180317131949-fe9507de0228/go.mod h1:IOXAcuKIFq/mDyuQ4wyJuJ79XLMsmLM+5RdQ+vWrL7o=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cloudflare-go v0.13.2 h1:bhMGoNhAg21DuqJjU9jQepRRft6vYfo6pejT3NN4V6A=
github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM=
github.com/cloudflare/cloudflare-go v0.16.0 h1:Z6sTsoDXSFYNdbj0JVK0s4CRnlhQagmNqZw4pwm3X4Y=
github.com/cloudflare/cloudflare-go v0.16.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0=
@@ -230,7 +230,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
@@ -239,7 +239,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -292,8 +292,9 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/temoto/robotstxt v1.1.1 h1:Gh8RCs8ouX3hRSxxK7B1mO5RFByQ4CmJZDwgom++JaA=
github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
@@ -302,7 +303,7 @@ github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/unrolled/secure v1.0.1/go.mod h1:R6rugAuzh4TQpbFAq69oqZggyBQxFRFQIewtz5z7Jsc=
github.com/urfave/cli v1.21.0/go.mod h1:lxDj6qX9Q6lWQxIrbrT0nwecwUtRnhVZAJjJZrVUZZQ=
github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -362,8 +363,8 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d h1:1aflnvSoWWLI2k/dMUAl5lvU1YO4Mb4hz0gh+1rjcxU=
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -396,16 +397,18 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -481,6 +484,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

View File

@@ -31,8 +31,8 @@ func CrawlGo() {
proxies = append(proxies, node)
}
}
// 节点去重
proxies = proxies.Deduplication()
// 节点衍生并去重
proxies = proxies.Deduplication().Derive()
log.Println("CrawlGo node count:", len(proxies))
proxies = provider.Clash{
provider.Base{
@@ -40,7 +40,7 @@ func CrawlGo() {
},
}.CleanProxies()
log.Println("CrawlGo cleaned node count:", len(proxies))
proxies.NameAddCounrty().Sort().NameAddIndex().NameAddTG()
proxies.NameSetCounrty().Sort().NameAddIndex().NameAddTG()
log.Println("Proxy rename DONE!")
// 全节点存储到数据库

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,6 @@
package database
import (
"github.com/zu1k/proxypool/pkg/getter"
"github.com/zu1k/proxypool/pkg/proxy"
"gorm.io/gorm"
)
@@ -33,20 +32,29 @@ func SaveProxyList(pl proxy.ProxyList) {
return
}
size := pl.Len()
round := (size + roundSize - 1) / roundSize
// TODO 批量插入因为是生成一个sql如果插入失败重复就全都没了
//size := pl.Len()
//round := (size + roundSize - 1) / roundSize
//
//for r := 0; r < round; r++ {
// proxies := make([]Proxy, 0, roundSize)
// for i, j := r*roundSize, (r+1)*roundSize-1; i < j && i < size; i++ {
// p := pl[i]
// proxies = append(proxies, Proxy{
// Base: *p.BaseInfo(),
// Link: p.Link(),
// Identifier: p.Identifier(),
// })
// }
// DB.Create(&proxies)
//}
for r := 0; r < round; r++ {
proxies := make([]Proxy, 0, roundSize)
for i, j := r*roundSize, (r+1)*roundSize-1; i < j && i < size; i++ {
p := pl[i]
proxies = append(proxies, Proxy{
Base: *p.BaseInfo(),
Link: p.Link(),
Identifier: p.Identifier(),
})
}
DB.Create(&proxies)
for _, p := range pl {
DB.Create(&Proxy{
Base: *p.BaseInfo(),
Link: p.Link(),
Identifier: p.Identifier(),
})
}
}
@@ -61,7 +69,10 @@ func GetAllProxies() (proxies proxy.ProxyList) {
for _, proxyDB := range proxiesDB {
if proxiesDB != nil {
proxies = append(proxies, getter.String2Proxy(proxyDB.Link))
p, err := proxy.ParseProxyFromLink(proxyDB.Link)
if err == nil && p != nil {
proxies = append(proxies, p)
}
}
}
return

View File

@@ -2,7 +2,6 @@ package getter
import (
"errors"
"strings"
"sync"
"github.com/zu1k/proxypool/pkg/proxy"
@@ -30,28 +29,13 @@ func NewGetter(sourceType string, options tool.Options) (getter Getter, err erro
return nil, ErrorCreaterNotSupported
}
func String2Proxy(link string) proxy.Proxy {
var err error
var data proxy.Proxy
if strings.HasPrefix(link, "ssr://") {
data, err = proxy.ParseSSRLink(link)
} else if strings.HasPrefix(link, "vmess://") {
data, err = proxy.ParseVmessLink(link)
} else if strings.HasPrefix(link, "ss://") {
data, err = proxy.ParseSSLink(link)
} else if strings.HasPrefix(link, "trojan://") {
data, err = proxy.ParseTrojanLink(link)
}
if err != nil {
return nil
}
return data
}
func StringArray2ProxyArray(origin []string) proxy.ProxyList {
results := make(proxy.ProxyList, 0)
for _, link := range origin {
results = append(results, String2Proxy(link))
p, err := proxy.ParseProxyFromLink(link)
if err == nil && p != nil {
results = append(results, p)
}
}
return results
}

View File

@@ -3,8 +3,6 @@ package provider
import (
"strings"
"github.com/zu1k/proxypool/pkg/proxy"
"github.com/zu1k/proxypool/pkg/tool"
)
@@ -13,18 +11,11 @@ type SSRSub struct {
}
func (sub SSRSub) Provide() string {
sub.Types = "ssr,ss"
sub.Types = "ssr"
sub.preFilter()
var resultBuilder strings.Builder
for _, p := range *sub.Proxies {
if p.TypeName() == "ssr" {
resultBuilder.WriteString(p.Link() + "\n")
} else if p.TypeName() == "ss" {
ssr, err := proxy.SS2SSR(p.(*proxy.Shadowsocks))
if err == nil {
resultBuilder.WriteString(ssr.Link() + "\n")
}
}
resultBuilder.WriteString(p.Link() + "\n")
}
return tool.Base64EncodeString(resultBuilder.String(), false)
}

View File

@@ -3,6 +3,9 @@ package provider
import (
"encoding/json"
"strconv"
"strings"
"github.com/zu1k/proxypool/pkg/tool"
"github.com/zu1k/proxypool/pkg/proxy"
)
@@ -22,22 +25,11 @@ type ssJson struct {
}
func (sub SSSub) Provide() string {
sub.Types = "ss,ssr"
sub.Types = "ss"
sub.preFilter()
proxies := make([]ssJson, 0, sub.Proxies.Len())
for _, p := range *sub.Proxies {
var pp *proxy.Shadowsocks
if p.TypeName() == "ssr" {
var err error
pp, err = proxy.SSR2SS(p.(*proxy.ShadowsocksR))
if err != nil {
continue
}
} else if p.TypeName() == "ss" {
pp = p.(*proxy.Shadowsocks)
}
pp := p.(*proxy.Shadowsocks)
proxies = append(proxies, ssJson{
Remarks: pp.Name,
Server: pp.Server,
@@ -54,3 +46,17 @@ func (sub SSSub) Provide() string {
}
return string(text)
}
type SIP002Sub struct {
Base
}
func (sub SIP002Sub) Provide() string {
sub.Types = "ss"
sub.preFilter()
var resultBuilder strings.Builder
for _, p := range *sub.Proxies {
resultBuilder.WriteString(p.Link() + "\n")
}
return tool.Base64EncodeString(resultBuilder.String(), false)
}

View File

@@ -18,7 +18,7 @@ func (s Surge) Provide() string {
var resultBuilder strings.Builder
for _, p := range *s.Proxies {
if checkSurgeSupport(p) {
resultBuilder.WriteString(p.ToClash() + "\n")
resultBuilder.WriteString(p.ToSurge() + "\n")
}
}
return resultBuilder.String()

View File

@@ -1,5 +1,10 @@
package proxy
import (
"errors"
"strings"
)
type Base struct {
Name string `yaml:"name" json:"name" gorm:"index"`
Server string `yaml:"server" json:"server" gorm:"index"`
@@ -56,3 +61,28 @@ type Proxy interface {
SetUseable(useable bool)
SetCountry(country string)
}
func ParseProxyFromLink(link string) (p Proxy, err error) {
if strings.HasPrefix(link, "ssr://") {
p, err = ParseSSRLink(link)
} else if strings.HasPrefix(link, "vmess://") {
p, err = ParseVmessLink(link)
} else if strings.HasPrefix(link, "ss://") {
p, err = ParseSSLink(link)
} else if strings.HasPrefix(link, "trojan://") {
p, err = ParseTrojanLink(link)
}
if err != nil || p == nil {
return nil, errors.New("link parse failed")
}
ip, country, err := geoIp.Find(p.BaseInfo().Server)
if err != nil {
country = "🏁 ZZ"
}
p.SetCountry(country)
// trojan依赖域名
if p.TypeName() != "trojan" {
p.SetIP(ip)
}
return
}

View File

@@ -6,44 +6,56 @@ import (
"github.com/zu1k/proxypool/pkg/tool"
)
func SS2SSR(ss *Shadowsocks) (ssr *ShadowsocksR, err error) {
if ss == nil {
return nil, errors.New("ss is nil")
var ErrorTypeCanNotConvert = errors.New("type not support")
// Convert2SS convert proxy to ShadowsocksR if possible
func Convert2SSR(p Proxy) (ssr *ShadowsocksR, err error) {
if p.TypeName() == "ss" {
ss := p.(*Shadowsocks)
if ss == nil {
return nil, errors.New("ss is nil")
}
if !tool.CheckInList(SSRCipherList, ss.Cipher) {
return nil, errors.New("cipher not support")
}
base := ss.Base
base.Type = "ssr"
return &ShadowsocksR{
Base: base,
Password: ss.Password,
Cipher: ss.Cipher,
Protocol: "origin",
Obfs: "plain",
Group: "proxy.tgbot.co",
}, nil
}
if !tool.CheckInList(SSRCipherList, ss.Cipher) {
return nil, errors.New("cipher not support")
}
base := ss.Base
base.Type = "ssr"
return &ShadowsocksR{
Base: base,
Password: ss.Password,
Cipher: ss.Cipher,
Protocol: "origin",
Obfs: "plain",
Group: "proxy.tgbot.co",
}, nil
return nil, ErrorTypeCanNotConvert
}
func SSR2SS(ssr *ShadowsocksR) (ss *Shadowsocks, err error) {
if ssr == nil {
return nil, errors.New("ssr is nil")
// Convert2SS convert proxy to Shadowsocks if possible
func Convert2SS(p Proxy) (ss *Shadowsocks, err error) {
if p.TypeName() == "ss" {
ssr := p.(*ShadowsocksR)
if ssr == nil {
return nil, errors.New("ssr is nil")
}
if !tool.CheckInList(SSCipherList, ssr.Cipher) {
return nil, errors.New("cipher not support")
}
if ssr.Protocol != "origin" || ssr.Obfs != "plain" {
return nil, errors.New("protocol or obfs not allowed")
}
base := ssr.Base
base.Type = "ss"
return &Shadowsocks{
Base: base,
Password: ssr.Password,
Cipher: ssr.Cipher,
Plugin: "",
PluginOpts: nil,
}, nil
}
if !tool.CheckInList(SSCipherList, ssr.Cipher) {
return nil, errors.New("cipher not support")
}
if ssr.Protocol != "origin" || ssr.Obfs != "plain" {
return nil, errors.New("protocol or obfs not allowed")
}
base := ssr.Base
base.Type = "ss"
return &Shadowsocks{
Base: base,
Password: ssr.Password,
Cipher: ssr.Cipher,
Plugin: "",
PluginOpts: nil,
}, nil
return nil, ErrorTypeCanNotConvert
}
var SSRCipherList = []string{

View File

@@ -4,7 +4,6 @@ import (
"fmt"
"sort"
"strings"
"sync"
)
type ProxyList []Proxy
@@ -63,24 +62,11 @@ func (ps ProxyList) Sort() ProxyList {
return ps
}
func (ps ProxyList) NameAddCounrty() ProxyList {
func (ps ProxyList) NameSetCounrty() ProxyList {
num := len(ps)
wg := &sync.WaitGroup{}
wg.Add(num)
for i := 0; i < num; i++ {
ii := i
go func() {
defer wg.Done()
_, country, err := geoIp.Find(ps[ii].BaseInfo().Server)
if err != nil {
country = "🏁 ZZ"
}
ps[ii].SetName(fmt.Sprintf("%s", country))
ps[ii].SetCountry(country)
//ps[ii].SetIP(ip)
}()
ps[i].SetName(ps[i].BaseInfo().Country)
}
wg.Wait()
return ps
}
@@ -110,20 +96,6 @@ func (ps ProxyList) NameAddTG() ProxyList {
return ps
}
func Deduplication(src ProxyList) ProxyList {
result := make(ProxyList, 0, len(src))
temp := map[string]struct{}{}
for _, item := range src {
if item != nil {
if _, ok := temp[item.Identifier()]; !ok {
temp[item.Identifier()] = struct{}{}
result = append(result, item)
}
}
}
return result
}
func (ps ProxyList) Clone() ProxyList {
result := make(ProxyList, 0, len(ps))
for _, pp := range ps {
@@ -133,3 +105,25 @@ func (ps ProxyList) Clone() ProxyList {
}
return result
}
// Derive 将原有节点中的ss和ssr互相转换进行衍生
func (ps ProxyList) Derive() ProxyList {
proxies := ps
for _, p := range ps {
if p == nil {
continue
}
if p.TypeName() == "ss" {
ssr, err := Convert2SSR(p)
if err == nil {
proxies = append(proxies, ssr)
}
} else if p.TypeName() == "ssr" {
ss, err := Convert2SS(p)
if err == nil {
proxies = append(proxies, ss)
}
}
}
return proxies.Deduplication()
}