Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c4a6a833d | ||
|
|
9f6ae0cb9b | ||
|
|
6262f510e9 | ||
|
|
eea6a692e6 | ||
|
|
f9d2dbbed9 | ||
|
|
6f70ee0b7b | ||
|
|
bb6600cdd6 | ||
|
|
5a2b0a4188 | ||
|
|
5c2b14f836 | ||
|
|
345c6f89b6 | ||
|
|
097c2d2241 | ||
|
|
023de15f0e | ||
|
|
70dea95241 | ||
|
|
1a713ed8e4 | ||
|
|
d92cd20d88 |
@@ -12,6 +12,5 @@ FROM alpine:latest
|
||||
RUN apk add --no-cache ca-certificates
|
||||
WORKDIR /proxypool-src
|
||||
COPY ./assets /proxypool-src/assets
|
||||
COPY ./source.yaml /proxypool-src
|
||||
COPY --from=builder /proxypool /proxypool-src/
|
||||
ENTRYPOINT ["/proxypool-src/proxypool"]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<br>proxypool<br>
|
||||
</h1>
|
||||
|
||||
<h5 align="center">自动抓取tg频道、订阅地址、公开互联网上的ss、ssr、vmess节点信息,聚合去重测试可用性后提供节点列表</h5>
|
||||
<h5 align="center">自动抓取tg频道、订阅地址、公开互联网上的ss、ssr、vmess、trojan节点信息,聚合去重测试可用性后提供节点列表</h5>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/zu1k/proxypool/actions">
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
## 支持
|
||||
|
||||
- 支持ss、ssr、vmess节点链接与订阅
|
||||
- 支持ss、ssr、vmess、trojan节点链接与订阅
|
||||
- 任意 Telegram 频道抓取
|
||||
- 机场订阅地址抓取解析
|
||||
- 公开互联网页面模糊抓取
|
||||
@@ -85,6 +85,6 @@ proxypool -c source.yaml
|
||||
|
||||
## 声明
|
||||
|
||||
本项目遵循 GNU General Public License v3.0 开源,在此基础上,所有使用本项目提供服务者都必须在网站保留指向本项目的链接
|
||||
本项目遵循 GNU General Public License v3.0 开源,在此基础上,所有使用本项目提供服务者都必须在网站首页保留指向本项目的链接
|
||||
|
||||
禁止使用本项目进行营利和做其他违法事情,产生的一切后果本项目概不负责
|
||||
|
||||
@@ -5,10 +5,9 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/zu1k/proxypool/config"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
_ "github.com/heroku/x/hmetrics/onload"
|
||||
"github.com/zu1k/proxypool/config"
|
||||
"github.com/zu1k/proxypool/internal/cache"
|
||||
"github.com/zu1k/proxypool/pkg/provider"
|
||||
)
|
||||
@@ -27,6 +26,10 @@ func setupRouter() {
|
||||
c.HTML(http.StatusOK, "index.html", gin.H{
|
||||
"domain": domain,
|
||||
"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,
|
||||
})
|
||||
})
|
||||
|
||||
9
app.json
9
app.json
@@ -7,14 +7,19 @@
|
||||
"logo": "https://raw.githubusercontent.com/zu1k/proxypool/master/assets/proxy.jpg",
|
||||
"keywords": ["golang", "ss", "ssr", "vmess", "shadowsocks", "shadowsocksr"],
|
||||
"env": {
|
||||
"CONFIG_FILE": {
|
||||
"description": "Path to config file, could be a url."
|
||||
},
|
||||
"DOMAIN": {
|
||||
"description": "Domain to use."
|
||||
},
|
||||
"CF_API_EMAIL": {
|
||||
"description": "Cloudflare Email."
|
||||
"description": "Cloudflare Email.",
|
||||
"required": false
|
||||
},
|
||||
"CF_API_KEY": {
|
||||
"description": "Cloudflare API key."
|
||||
"description": "Cloudflare API key.",
|
||||
"required": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,9 +103,9 @@
|
||||
<div class='section friendly'>
|
||||
<h1><strong>免费Clash节点</strong></h1>
|
||||
<div class='article'>
|
||||
<p>自动抓取tg频道、订阅地址、公开互联网上的ss、ssr、vmess节点信息,聚合去重后提供clash配置,每15分钟更新</p>
|
||||
<p>自动抓取tg频道、订阅地址、公开互联网上的ss、ssr、vmess、trojan节点信息,聚合去重后提供clash配置,每15分钟更新</p>
|
||||
<br>
|
||||
<p>Clash配置文件:<a href="https://{{ .domain }}/clash/config">https://{{ .domain }}/clash/config</a> <a href="clash://install-config?url=https://{{ .domain }}/clash/config">一键导入</a></p>
|
||||
<p>Clash配置文件:https://{{ .domain }}/clash/config <a href="clash://install-config?url=https://{{ .domain }}/clash/config">一键导入</a></p>
|
||||
<p>Clash proxy-provider(Shadowrocket添加订阅方式可用):<a href="https://{{ .domain }}/clash/proxies">https://{{ .domain }}/clash/proxies</a></p>
|
||||
<br>
|
||||
<p>筛选代理类型(此种方式你只能自己维护配置文件):https://{{ .domain }}/clash/proxies?type=ss,ssr,vmess</p>
|
||||
|
||||
@@ -106,12 +106,16 @@
|
||||
<div class='section friendly'>
|
||||
<h1><strong>免费节点</strong></h1>
|
||||
<div class='article'>
|
||||
<p>自动抓取tg频道、订阅地址、公开互联网上的ss、ssr、vmess节点信息,聚合去重后提供节点列表,每15分钟更新</p>
|
||||
<p>自动抓取tg频道、订阅地址、公开互联网上的ss、ssr、vmess、trojan节点信息,聚合去重后提供节点列表,每15分钟更新</p>
|
||||
<p>汇总节点数量:{{ .all_proxies_count }}</p>
|
||||
<p>ss节点数量:{{ .ss_proxies_count }}</p>
|
||||
<p>ssr节点数量:{{ .ssr_proxies_count }}</p>
|
||||
<p>vmess节点数量:{{ .vmess_proxies_count }}</p>
|
||||
<p>trojan节点数量:{{ .trojan_proxies_count }}</p>
|
||||
<p>可用节点数量:{{ .useful_proxies_count }}</p>
|
||||
<br>
|
||||
<h5><a href="/clash">Clash</a></h5>
|
||||
<p>Clash配置文件:<a href="https://{{ .domain }}/clash/config">https://{{ .domain }}/clash/config</a> <a
|
||||
<p>Clash配置文件:https://{{ .domain }}/clash/config <a
|
||||
href="clash://install-config?url=https://{{ .domain }}/clash/config">一键导入</a></p>
|
||||
<p>Clash proxy-provider(Shadowrocket添加订阅方式可用):<a href="https://{{ .domain }}/clash/proxies">https://{{ .domain }}/clash/proxies</a>
|
||||
</p>
|
||||
@@ -119,11 +123,12 @@
|
||||
</p>
|
||||
<br>
|
||||
<h5><a href="/surge">Surge</a></h5>
|
||||
<p>Surge配置文件:<a href="https://{{ .domain }}/surge/config">https://{{ .domain }}/surge/config</a> <a
|
||||
<p>Surge配置文件:https://{{ .domain }}/surge/config <a
|
||||
href="surge3:///install-config?url=https://{{ .domain }}/surge/config">一键导入</a></p>
|
||||
<p>Surge proxy list:<a href="https://{{ .domain }}/surge/proxies">https://{{ .domain }}/surge/proxies</a>
|
||||
</p>
|
||||
<br>
|
||||
{{- /* 所有使用本代码提供服务的禁止删除该行*/}}
|
||||
<p>抓取程序已开源:<a href="https://github.com/zu1k/proxypool">https://github.com/zu1k/proxypool</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
<div class='article'>
|
||||
<p>自动抓取tg频道、订阅地址、公开互联网上的ss、vmess节点信息,聚合去重后提供Surge节点列表,每15分钟更新</p>
|
||||
<br>
|
||||
<p>Surge配置文件:<a href="https://{{ .domain }}/surge/config">https://{{ .domain }}/surge/config</a> <a href="surge3:///install-config?url=https://{{ .domain }}/surge/config">一键导入</a></p>
|
||||
<p>Surge配置文件:https://{{ .domain }}/surge/config <a href="surge3:///install-config?url=https://{{ .domain }}/surge/config">一键导入</a></p>
|
||||
<p>Surge proxy list:<a href="https://{{ .domain }}/surge/proxies">https://{{ .domain }}/surge/proxies</a></p>
|
||||
<br>
|
||||
<p>抓取程序已开源:<a href="https://github.com/zu1k/proxypool">https://github.com/zu1k/proxypool</a></p>
|
||||
|
||||
@@ -9,6 +9,11 @@ import (
|
||||
"github.com/zu1k/proxypool/pkg/tool"
|
||||
)
|
||||
|
||||
var (
|
||||
NeedFetch = true
|
||||
Url = "source.yaml"
|
||||
)
|
||||
|
||||
type Source struct {
|
||||
Type string `json:"type" yaml:"type"`
|
||||
Options tool.Options `json:"options" yaml:"options"`
|
||||
|
||||
@@ -1,25 +1,33 @@
|
||||
domain: proxy.tgbot.co
|
||||
cf_email: ""
|
||||
cf_key: ""
|
||||
sources:
|
||||
# 模糊抓取订阅链接
|
||||
- type: webfuzzsub
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/du5/free/master/sub.list
|
||||
|
||||
# 订阅链接
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/v2ray
|
||||
|
||||
# 网页模糊抓取
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://merlinblog.xyz/wiki/freess.html
|
||||
|
||||
# tg频道抓取
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssrList
|
||||
num: 200
|
||||
|
||||
- type: web-fanqiangdang
|
||||
# 翻墙党论坛抓取
|
||||
- type: web-fanqiangdang-rss
|
||||
options:
|
||||
url: https://fanqiangdang.com/forum.php?mod=rss&fid=50&auth=0
|
||||
num: 200
|
||||
|
||||
# 某个网站抓取
|
||||
- type: web-freessrxyz
|
||||
options:
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/zu1k/proxypool/config"
|
||||
"github.com/zu1k/proxypool/pkg/getter"
|
||||
)
|
||||
|
||||
func TestConfigFile(t *testing.T) {
|
||||
c, err := config.Parse("../../source.yaml")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
if c == nil {
|
||||
t.Error(errors.New("no sources"))
|
||||
return
|
||||
}
|
||||
for idx, source := range c.Sources {
|
||||
g, err := getter.NewGetter(source.Type, source.Options)
|
||||
if err != nil {
|
||||
t.Error(err, idx)
|
||||
fmt.Println(source)
|
||||
return
|
||||
}
|
||||
if g == nil {
|
||||
t.Error(errors.New("getter is nil:" + strconv.Itoa(idx)))
|
||||
fmt.Println(source)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,10 +14,8 @@ import (
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
var NeedFetchNewConfigFile = false
|
||||
|
||||
func CrawlGo() {
|
||||
if NeedFetchNewConfigFile {
|
||||
if config.NeedFetch {
|
||||
FetchNewConfigFileThenInit()
|
||||
}
|
||||
wg := &sync.WaitGroup{}
|
||||
@@ -43,6 +41,10 @@ func CrawlGo() {
|
||||
proxies.NameAddCounrty().Sort().NameAddIndex()
|
||||
cache.SetProxies("allproxies", proxies)
|
||||
cache.AllProxiesCount = proxies.Len()
|
||||
cache.SSProxiesCount = proxies.TypeLen("ss")
|
||||
cache.SSRProxiesCount = proxies.TypeLen("ssr")
|
||||
cache.VmessProxiesCount = proxies.TypeLen("vmess")
|
||||
cache.TrojanProxiesCount = proxies.TypeLen("trojan")
|
||||
|
||||
// 可用性检测
|
||||
proxies = proxy.CleanBadProxies(proxies)
|
||||
@@ -57,7 +59,7 @@ func CrawlGo() {
|
||||
|
||||
func FetchNewConfigFileThenInit() {
|
||||
fmt.Println("fetch new config file...")
|
||||
resp, err := tool.GetHttpClient().Get("https://raw.githubusercontent.com/zu1k/proxypool/master/source.yaml")
|
||||
resp, err := tool.GetHttpClient().Get(config.Url)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
7
internal/cache/vars.go
vendored
7
internal/cache/vars.go
vendored
@@ -1,6 +1,11 @@
|
||||
package cache
|
||||
|
||||
var (
|
||||
AllProxiesCount = 0
|
||||
AllProxiesCount = 0
|
||||
SSRProxiesCount = 0
|
||||
SSProxiesCount = 0
|
||||
VmessProxiesCount = 0
|
||||
TrojanProxiesCount = 0
|
||||
|
||||
UsefullProxiesCount = 0
|
||||
)
|
||||
|
||||
36
main.go
36
main.go
@@ -5,6 +5,10 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
_ "net/http/pprof"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/zu1k/proxypool/config"
|
||||
|
||||
"github.com/zu1k/proxypool/internal/cron"
|
||||
|
||||
@@ -28,15 +32,17 @@ func main() {
|
||||
go pprof()
|
||||
}
|
||||
|
||||
if configFilePath == "" {
|
||||
app.NeedFetchNewConfigFile = true
|
||||
app.FetchNewConfigFileThenInit()
|
||||
} else {
|
||||
err := app.InitConfigAndGetters(configFilePath)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
envConfigFilePath := os.Getenv("CONFIG_FILE")
|
||||
if envConfigFilePath == "" {
|
||||
envConfigFilePath = "source.yaml"
|
||||
}
|
||||
|
||||
if configFilePath != "" {
|
||||
initConfigFile(configFilePath)
|
||||
} else {
|
||||
initConfigFile(envConfigFilePath)
|
||||
}
|
||||
|
||||
proxy.InitGeoIpDB()
|
||||
|
||||
go cron.Cron()
|
||||
@@ -45,6 +51,20 @@ func main() {
|
||||
api.Run()
|
||||
}
|
||||
|
||||
func initConfigFile(path string) {
|
||||
if strings.HasPrefix(path, "http") {
|
||||
config.Url = path
|
||||
config.NeedFetch = true
|
||||
app.FetchNewConfigFileThenInit()
|
||||
} else {
|
||||
err := app.InitConfigAndGetters(configFilePath)
|
||||
if err != nil {
|
||||
fmt.Errorf("Config file not found")
|
||||
os.Exit(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func pprof() {
|
||||
ip := "127.0.0.1:6060"
|
||||
if err := http.ListenAndServe(ip, nil); err != nil {
|
||||
|
||||
@@ -39,6 +39,8 @@ func String2Proxy(link string) proxy.Proxy {
|
||||
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
|
||||
@@ -58,6 +60,7 @@ func GrepLinksFromString(text string) []string {
|
||||
results := proxy.GrepSSRLinkFromString(text)
|
||||
results = append(results, proxy.GrepVmessLinkFromString(text)...)
|
||||
results = append(results, proxy.GrepSSLinkFromString(text)...)
|
||||
results = append(results, proxy.GrepTrojanLinkFromString(text)...)
|
||||
return results
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package getter
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/gocolly/colly"
|
||||
@@ -10,30 +11,17 @@ import (
|
||||
)
|
||||
|
||||
func init() {
|
||||
Register("web-fanqiangdang-rss", NewWebFanqiangdangRSSGetter)
|
||||
Register("web-fanqiangdang", NewWebFanqiangdangGetter)
|
||||
}
|
||||
|
||||
type WebFanqiangdang struct {
|
||||
c *colly.Collector
|
||||
NumNeeded int
|
||||
Url string
|
||||
results []string
|
||||
results proxy.ProxyList
|
||||
}
|
||||
|
||||
func NewWebFanqiangdangGetter(options tool.Options) (getter Getter, err error) {
|
||||
num, found := options["num"]
|
||||
|
||||
t := 200
|
||||
switch num.(type) {
|
||||
case int:
|
||||
t = num.(int)
|
||||
case float64:
|
||||
t = int(num.(float64))
|
||||
}
|
||||
|
||||
if !found || t <= 0 {
|
||||
t = 200
|
||||
}
|
||||
urlInterface, found := options["url"]
|
||||
if found {
|
||||
url, err := AssertTypeStringNotNull(urlInterface)
|
||||
@@ -42,7 +30,6 @@ func NewWebFanqiangdangGetter(options tool.Options) (getter Getter, err error) {
|
||||
}
|
||||
return &WebFanqiangdang{
|
||||
c: colly.NewCollector(),
|
||||
NumNeeded: t,
|
||||
Url: url,
|
||||
}, nil
|
||||
}
|
||||
@@ -50,17 +37,69 @@ func NewWebFanqiangdangGetter(options tool.Options) (getter Getter, err error) {
|
||||
}
|
||||
|
||||
func (w *WebFanqiangdang) Get() proxy.ProxyList {
|
||||
w.results = make(proxy.ProxyList, 0)
|
||||
w.c.OnHTML("td.t_f", func(e *colly.HTMLElement) {
|
||||
w.results = append(w.results, FuzzParseProxyFromString(e.Text)...)
|
||||
subUrls := urlRe.FindAllString(e.Text, -1)
|
||||
for _, url := range subUrls {
|
||||
w.results = append(w.results, (&Subscribe{Url: url}).Get()...)
|
||||
}
|
||||
})
|
||||
|
||||
w.c.OnHTML("th.new>a[href]", func(e *colly.HTMLElement) {
|
||||
url := e.Attr("href")
|
||||
if strings.HasPrefix(url, "https://fanqiangdang.com/thread") {
|
||||
_ = e.Request.Visit(url)
|
||||
}
|
||||
})
|
||||
|
||||
w.results = make(proxy.ProxyList, 0)
|
||||
err := w.c.Visit(w.Url)
|
||||
if err != nil {
|
||||
_ = fmt.Errorf("%s", err.Error())
|
||||
}
|
||||
|
||||
return w.results
|
||||
}
|
||||
|
||||
func (w *WebFanqiangdang) Get2Chan(pc chan proxy.Proxy, wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
nodes := w.Get()
|
||||
for _, node := range nodes {
|
||||
pc <- node
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
type WebFanqiangdangRSS struct {
|
||||
c *colly.Collector
|
||||
Url string
|
||||
results []string
|
||||
}
|
||||
|
||||
func NewWebFanqiangdangRSSGetter(options tool.Options) (getter Getter, err error) {
|
||||
urlInterface, found := options["url"]
|
||||
if found {
|
||||
url, err := AssertTypeStringNotNull(urlInterface)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &WebFanqiangdangRSS{
|
||||
c: colly.NewCollector(),
|
||||
Url: url,
|
||||
}, nil
|
||||
}
|
||||
return nil, ErrorUrlNotFound
|
||||
}
|
||||
|
||||
func (w *WebFanqiangdangRSS) Get() proxy.ProxyList {
|
||||
w.results = make([]string, 0)
|
||||
// 找到所有的文字消息
|
||||
w.c.OnHTML("td.t_f", func(e *colly.HTMLElement) {
|
||||
w.results = append(w.results, GrepLinksFromString(e.Text)...)
|
||||
})
|
||||
|
||||
// 从订阅中取出每一页,因为是订阅,所以都比较新
|
||||
w.c.OnXML("//item//link", func(e *colly.XMLElement) {
|
||||
if len(w.results) < w.NumNeeded {
|
||||
_ = e.Request.Visit(e.Text)
|
||||
}
|
||||
_ = e.Request.Visit(e.Text)
|
||||
})
|
||||
|
||||
w.results = make([]string, 0)
|
||||
@@ -72,7 +111,7 @@ func (w *WebFanqiangdang) Get() proxy.ProxyList {
|
||||
return StringArray2ProxyArray(w.results)
|
||||
}
|
||||
|
||||
func (w *WebFanqiangdang) Get2Chan(pc chan proxy.Proxy, wg *sync.WaitGroup) {
|
||||
func (w *WebFanqiangdangRSS) Get2Chan(pc chan proxy.Proxy, wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
nodes := w.Get()
|
||||
for _, node := range nodes {
|
||||
|
||||
@@ -64,6 +64,8 @@ func checkClashSupport(p proxy.Proxy) bool {
|
||||
if checkInList(ssCipherList, ss.Cipher) {
|
||||
return true
|
||||
}
|
||||
case "trojan":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -11,6 +11,16 @@ func (ps ProxyList) Len() int {
|
||||
return len(ps)
|
||||
}
|
||||
|
||||
func (ps ProxyList) TypeLen(t string) int {
|
||||
l := 0
|
||||
for _, p := range ps {
|
||||
if p.TypeName() == t {
|
||||
l++
|
||||
}
|
||||
}
|
||||
return l
|
||||
}
|
||||
|
||||
func (ps ProxyList) Less(i, j int) bool {
|
||||
return ps[i].BaseInfo().Name < ps[j].BaseInfo().Name
|
||||
}
|
||||
|
||||
147
pkg/proxy/trojan.go
Normal file
147
pkg/proxy/trojan.go
Normal file
@@ -0,0 +1,147 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"math/rand"
|
||||
"net"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrorNotTrojanink = errors.New("not a correct trojan link")
|
||||
)
|
||||
|
||||
type Trojan struct {
|
||||
Base
|
||||
Password string `yaml:"password" json:"password"`
|
||||
ALPN []string `yaml:"alpn,omitempty" json:"alpn,omitempty"`
|
||||
SNI string `yaml:"sni,omitempty" json:"sni,omitempty"`
|
||||
SkipCertVerify bool `yaml:"skip-cert-verify,omitempty" json:"skip-cert-verify,omitempty"`
|
||||
UDP bool `yaml:"udp,omitempty" json:"udp,omitempty"`
|
||||
}
|
||||
|
||||
/**
|
||||
- name: "trojan"
|
||||
type: trojan
|
||||
server: server
|
||||
port: 443
|
||||
password: yourpsk
|
||||
# udp: true
|
||||
# sni: example.com # aka server name
|
||||
# alpn:
|
||||
# - h2
|
||||
# - http/1.1
|
||||
# skip-cert-verify: true
|
||||
*/
|
||||
|
||||
func (t Trojan) Identifier() string {
|
||||
return net.JoinHostPort(t.Server, strconv.Itoa(t.Port)) + t.Password
|
||||
}
|
||||
|
||||
func (t Trojan) String() string {
|
||||
data, err := json.Marshal(t)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return string(data)
|
||||
}
|
||||
|
||||
func (t Trojan) ToClash() string {
|
||||
data, err := json.Marshal(t)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return "- " + string(data)
|
||||
}
|
||||
|
||||
func (t Trojan) ToSurge() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (t Trojan) Clone() Proxy {
|
||||
return &t
|
||||
}
|
||||
|
||||
func ParseTrojanLink(link string) (*Trojan, error) {
|
||||
if !strings.HasPrefix(link, "trojan://") && !strings.HasPrefix(link, "trojan-go://") {
|
||||
return nil, ErrorNotTrojanink
|
||||
}
|
||||
|
||||
/**
|
||||
trojan-go://
|
||||
$(trojan-password)
|
||||
@
|
||||
trojan-host
|
||||
:
|
||||
port
|
||||
/?
|
||||
sni=$(tls-sni.com)&
|
||||
type=$(original|ws|h2|h2+ws)&
|
||||
host=$(websocket-host.com)&
|
||||
path=$(/websocket/path)&
|
||||
encryption=$(ss;aes-256-gcm;ss-password)&
|
||||
plugin=$(...)
|
||||
#$(descriptive-text)
|
||||
*/
|
||||
|
||||
uri, err := url.Parse(link)
|
||||
if err != nil {
|
||||
return nil, ErrorNotSSLink
|
||||
}
|
||||
|
||||
password := uri.User.Username()
|
||||
password, _ = url.QueryUnescape(password)
|
||||
|
||||
server := uri.Hostname()
|
||||
port, _ := strconv.Atoi(uri.Port())
|
||||
|
||||
moreInfos := uri.Query()
|
||||
sni := moreInfos.Get("sni")
|
||||
sni, _ = url.QueryUnescape(sni)
|
||||
transformType := moreInfos.Get("type")
|
||||
transformType, _ = url.QueryUnescape(transformType)
|
||||
host := moreInfos.Get("host")
|
||||
host, _ = url.QueryUnescape(host)
|
||||
path := moreInfos.Get("path")
|
||||
path, _ = url.QueryUnescape(path)
|
||||
|
||||
alpn := make([]string, 0)
|
||||
if transformType == "h2" {
|
||||
alpn = append(alpn, "h2")
|
||||
}
|
||||
|
||||
if port == 0 {
|
||||
return nil, ErrorNotTrojanink
|
||||
}
|
||||
|
||||
return &Trojan{
|
||||
Base: Base{
|
||||
Name: strconv.Itoa(rand.Int()),
|
||||
Server: server,
|
||||
Port: port,
|
||||
Type: "trojan",
|
||||
},
|
||||
Password: password,
|
||||
ALPN: alpn,
|
||||
UDP: true,
|
||||
SNI: host,
|
||||
SkipCertVerify: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
var (
|
||||
trojanPlainRe = regexp.MustCompile("trojan(-go)?://([A-Za-z0-9+/_&?=@:%.-])+")
|
||||
)
|
||||
|
||||
func GrepTrojanLinkFromString(text string) []string {
|
||||
results := make([]string, 0)
|
||||
texts := strings.Split(text, "trojan://")
|
||||
for _, text := range texts {
|
||||
results = append(results, trojanPlainRe.FindAllString("trojan://"+text, -1)...)
|
||||
}
|
||||
return results
|
||||
}
|
||||
320
source.yaml
320
source.yaml
@@ -1,320 +0,0 @@
|
||||
domain: proxy.tgbot.co
|
||||
cf_email: ""
|
||||
cf_key: ""
|
||||
sources:
|
||||
- type: webfuzzsub
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/du5/free/master/sub.list
|
||||
# 订阅链接
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://suda.sub.koicloud.pw/link/K9vz0uFPe9ULfdqX?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/Pcrab/Dotfiles/912c1104b3f8121f72f7ee11590f52bc9c44dde7/.config/electron-ssr/gui-config.json
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://v2.fit/modules/servers/V2raySocks/osubscribe.php?sid=7063&token=lKJwbO2onxIr
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.liesauer.net/yogurt/subscribe?ACCESS_TOKEN=d309c6921bbd7d0d
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://neurotoxinw.coding.net/p/qifei/d/qifei/git/raw/master/README.md
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sbnmsl.co/link/2cpTGUGJtHBXUK7d?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://extrm.info/link/uirPjznB7esOezjr?sub=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: http://www.sksla.pro/api/v1/client/subscribe?token=99c3fa86424539bd3bd34a893bc6dee8
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://vvsub.xyz/api/al/19786-xDX1SCq61Ymi
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://rss-node.com/link/vqOaWFJRfbYxpAhY?mu=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://tm2w.live/link/EqICUlKXmn1EJwaw?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://dingyue.suying666.info/link/o7j43Aykx8CWBehE?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://dingyue.suying666.info/link/o7j43Aykx8CWBehE?sub=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.haidaobot.xyz/link/QwdUmWolPN0LkThW?mu=2
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://pptp.cloud/sub/cXHG9wqUpQbhHr7b.html
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://suda.sub.koicloud.pw/link/JgULLCNkImsJ6Ibh?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://jiyou.world/modules/servers/V2raySocks/osubscribetest.php?sid=57394&token=V3GM60lgqZL9
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://aero.moe/link/kxdbKdopH3paUqUf?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: http://dy.tntv2.xyz/link/pTL0RgiVblXLIQjS?sub=3&extend=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://719401146.online//link/oHPA3bXVc2zeqGGq?mu=2
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.v2ray.pw/link/b5e255KbnnATXc60?mu=2+&extend=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: http://ssrdingyue.ueuo.com/v2/8y12r
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.suncloud.fun/link/Su683BQEyUdxtyuY?mu=1&extend=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sub88.xyz/link/egy4oyqok9aavpcy?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://qiaomenzhuanfx.netlify.com/
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sub88.xyz/link/lkY8Jt5Q3SHlffra?mu=2
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/hotsymbol/vpnsetting/master/v2rayopen
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/satrom/V2SSR/master/V2RAY/Sub.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/v2ray
|
||||
- type: subscribe
|
||||
options:
|
||||
url: http://qe83xk711.sabkt.gdipper.com/freev2ray.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://iwxf.netlify.app/
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://rss.getfree.win/link/w9ted9eZq1zbC3gx?sub=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://youlianboshi.netlify.com/
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/ss-sub
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://bujidao302.com/link/IJ6wKEt96Otboilb?mu=2
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/satrom/V2SSR/master/SSR/Day.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ntkernel/lantern/master/vmess_base64.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://lei-su.me//link/Dw3lmyXXJJTnvsBA?sub=3&extend=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/cdp2020/v2ray/master/README.md
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/ssrsub
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.liesauer.net/yogurt/subscribe?ACCESS_TOKEN=DAYxR3mMaZAsaqUb
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://rss.cnrss.xyz/link/Rcr8h8fvZIWE001U?mu=2
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://12o.ooo/link/JLisT80gOhRkiFnX?sub=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sub1.m87sub.xyz/link/pZDgnxhgL6Poh1GQ?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/satrom/V2SSR/master/SSR/Sub.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sub88.xyz/link/lkY8Jt5Q3SHlffra?mu=2
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://s.sublank.xyz/subscribe/66056/0yzuMVawjpr/ssr/
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sub1.m87sub.xyz/link/pZDgnxhgL6Poh1GQ?sub=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: http://qe83xk711.sabkt.gdipper.com/freess.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/pojiezhiyuanjun/freev2/master/20200808.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://sub1.m87sub.xyz/link/2488O6IM4n4nksMG?sub=3
|
||||
- type: subscribe
|
||||
options:
|
||||
url: http://103.72.166.89/v2ray.php
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://fly.lo-lita.ru/api/v1/client/subscribe?token=94be7fa3d65791197dd10c6a0b757571
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/RaymondHarris971/ssrsub/master/9a075bdee5.txt
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://bit.ly/2D5fWhX
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.suncloud.fun/link/ja3OIcMTrky6VhN6?mu=1&extend=1
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/voken100g/AutoSSR/master/recent
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://jiang.netlify.com/
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/v2ray
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/ssrsub
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ssrsub/ssr/master/ss-sub
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://heikejilaila.xyz/keji.php?id=22c7b9fdda20bb7405b270cd75971f66
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://youlianboshi.netlify.app/
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/umelabs/node.umelabs.dev/master/Subscribe/SS.md
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/umelabs/node.umelabs.dev/master/Subscribe/SSR.md
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/umelabs/node.umelabs.dev/master/Subscribe/v2ray.md
|
||||
- type: subscribe
|
||||
options:
|
||||
url: https://www.3kla.cn/subscribe/txt/Anranray.txt
|
||||
|
||||
# 网页模糊抓取
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://zfjvpn.gitbook.io/
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://www.freefq.com/d/file/free-ssr/20200811/1f3e9d0d0064f662457062712dcf1b66.txt
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://merlinblog.xyz/wiki/freess.html
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://zfjvpn.gitbook.io/123/
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ruanfei/ShadowsocksRRShare/master/ss/ss.txt
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/ruanfei/ShadowsocksRRShare/master/ssr/ssr.txt
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/pojiezhiyuanjun/freev2/master/all.txt
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://ssrtoolcrawler.tgbot.co/data/ssr.txt
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/freefq/free/master/README.md
|
||||
- type: webfuzz
|
||||
options:
|
||||
url: https://raw.githubusercontent.com/52bp/52bp.github.io/master/freesite.html
|
||||
|
||||
# tg频道
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssrList
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssList
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: SSRSUB
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: FreeSSRNode
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssrlists
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssrshares
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: V2List
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssrtool
|
||||
num: 100
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: ssrtool_crack
|
||||
num: 100
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: vmessr
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: FreeSSR666
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: fanqiang666
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: jiedianfenxiang
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: freeshadowsock
|
||||
num: 200
|
||||
- type: tgchannel
|
||||
options:
|
||||
channel: mianfeifenxiang
|
||||
num: 200
|
||||
|
||||
# 翻墙党,后面的东西都无需修改
|
||||
- type: web-fanqiangdang
|
||||
options:
|
||||
url: https://fanqiangdang.com/forum.php?mod=rss&fid=50&auth=0
|
||||
num: 200
|
||||
- type: web-fanqiangdang
|
||||
options:
|
||||
url: https://fanqiangdang.com/forum.php?mod=rss&fid=2&auth=0
|
||||
num: 200
|
||||
- type: web-fanqiangdang
|
||||
options:
|
||||
url: https://fanqiangdang.com/forum.php?mod=rss&fid=36&auth=0
|
||||
num: 200
|
||||
|
||||
- type: web-freessrxyz
|
||||
options:
|
||||
Reference in New Issue
Block a user