Compare commits

..

15 Commits

Author SHA1 Message Date
zu1k
2c4a6a833d update html 2020-08-21 10:21:11 +08:00
zu1k
9f6ae0cb9b add type len 2020-08-21 09:53:08 +08:00
zu1k
6262f510e9 mod html 2020-08-21 09:48:05 +08:00
zu1k
eea6a692e6 fix trojan provider 2020-08-21 09:38:10 +08:00
zu1k
f9d2dbbed9 remoe fanqiangdang num limit 2020-08-21 09:05:17 +08:00
zu1k
6f70ee0b7b update web fanqiangdang 2020-08-21 09:00:26 +08:00
zu1k
bb6600cdd6 fix trojan 2020-08-21 08:31:45 +08:00
zu1k
5a2b0a4188 comment on source.yaml 2020-08-21 08:16:24 +08:00
zu1k
5c2b14f836 update readme 2020-08-20 22:44:15 +08:00
zu1k
345c6f89b6 add trojan link grep 2020-08-20 22:42:40 +08:00
zu1k
097c2d2241 add trojan support 2020-08-20 22:30:59 +08:00
zu1k
023de15f0e config file not found 2020-08-20 20:32:03 +08:00
zu1k
70dea95241 remove config test 2020-08-20 19:25:30 +08:00
zu1k
1a713ed8e4 use local config source default 2020-08-20 19:21:51 +08:00
zu1k
d92cd20d88 add config file path param 2020-08-20 19:06:25 +08:00
19 changed files with 304 additions and 407 deletions

View File

@@ -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"]

View File

@@ -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 开源,在此基础上,所有使用本项目提供服务者都必须在网站首页保留指向本项目的链接
禁止使用本项目进行营利和做其他违法事情,产生的一切后果本项目概不负责

View File

@@ -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,
})
})

View File

@@ -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
}
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"`

View File

@@ -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:

View File

@@ -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
}
}
}

View File

@@ -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
}

View File

@@ -1,6 +1,11 @@
package cache
var (
AllProxiesCount = 0
AllProxiesCount = 0
SSRProxiesCount = 0
SSProxiesCount = 0
VmessProxiesCount = 0
TrojanProxiesCount = 0
UsefullProxiesCount = 0
)

36
main.go
View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -64,6 +64,8 @@ func checkClashSupport(p proxy.Proxy) bool {
if checkInList(ssCipherList, ss.Cipher) {
return true
}
case "trojan":
return true
default:
return false
}

View File

@@ -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
View 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
}

View File

@@ -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: