简易订阅整合工具
一个用php写的简易订阅整合
支持:合并订阅,零散节点,去重,以普通或base64格式返回
<?php
function response($code, $message, $header = "")
{
http_response_code($code);
if ($header != "") {
header($header);
}
echo $message;
exit;
}
function download_file($url, $retry = 0)
{
$attempt = 0;
while ($attempt <= $retry) {
$attempt++;
$content = @file_get_contents($url);
if ($content !== false) {
return $content;
}
}
response(500, "Failed to download file: $url", "Content-Type: text/plain; charset=UTF-8");
}
function load_file_to_array($file_path)
{
$file_content = file_get_contents($file_path);
$file_content = str_replace("\r\n", "\n", $file_content);
$lines = explode("\n", $file_content);
$lines = array_filter($lines);
return $lines;
}
function load_string_to_array($string)
{
$string = str_replace("\r\n", "\n", $string);
$lines = explode("\n", $string);
$lines = array_filter($lines);
return $lines;
}
function response_nodes($node_array)
{
$content = implode("\n", $node_array);
$query_string = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : "";
if ($query_string == "base64") {
$content = base64_encode($content);
}
if ($query_string == "clash") {
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: text/plain; charset=UTF-8',
'content' => $content
]
];
$context = stream_context_create($options);
$content = file_get_contents(
"https://v2ray2clash.netlify.app/.netlify/functions/clash",
false,
$context
);
}
response(200, $content, "Content-Type: text/plain; charset=UTF-8");
}
// load sub and scatter node list
$sub_list = load_file_to_array("sub.txt");
$scatter_nodes = load_file_to_array("scatter.txt");
// get sub node list
$sub_nodes = array();
foreach ($sub_list as $sub) {
$sub_content = download_file($sub, 3);
if (strpos($sub_content, "://") === false) {
$sub_content = base64_decode($sub_content);
}
$sub_nodes = array_merge($sub_nodes, load_string_to_array($sub_content));
}
// merge sub nodes and scatter nodes
$nodes = array_merge($sub_nodes, $scatter_nodes);
$nodes = array_filter($nodes);
$nodes = array_unique($nodes);
// response
response_nodes($nodes);
?>
在同级目录新建 sub.txt
放置订阅,例如
https://sub.vip.sd/JPa6vvFgygVtNP2sGJ2r/download/nlmjj?target=V2Ray
https://fly.j-s.us.kg/api/v1/client/subscribe?token=3275fdb3e5ff32434a293ca8ca8fe9dc
在同级目录新建 scatter.txt
放置零散节点,例如
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@c9pwn-g01.fr01-ae5.entry.v50307shvkaa.art:20065#%E6%B3%95%E5%9B%BDW01
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@kn183-g01.us01-ae5.entry.v50307shvkaa.art:20010#%E7%BE%8E%E5%9B%BDW01
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@b0sdx-g01.ua01-ae5.entry.v50307shvkaa.art:20070#%E4%B9%8C%E5%85%8B%E5%85%B0W01
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@uh4r9-g01.us02-ae5.entry.v50307shvkaa.art:20015#%E7%BE%8E%E5%9B%BDW02
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@5e3gk-g01.de01-ae5.entry.v50307shvkaa.art:20050#%E5%BE%B7%E5%9B%BDW01
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@6tfkp-g01.ar01-ae5.entry.v50307shvkaa.art:20025#%E9%98%BF%E6%A0%B9%E5%BB%B7W01
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@tsh16-g01.ru01-ae5.entry.v50307shvkaa.art:20030#%E4%BF%84%E7%BD%97%E6%96%AFW01
ss://YWVzLTI1Ni1nY206NmQwNDMwNDEtOTY3Ni0zNDllLWE3MDYtMzgwYWY5NGUwNjJh@13uc8-g01.tr01-ae5.entry.v50307shvkaa.art:20035#%E5%9C%9F%E8%80%B3%E5%85%B6W01
默认url格式,要以base64返回应增加 ?base64
后缀
clash配置应增加 ?clash
后缀
demo: https://runoneall.serv00.net/NodeShare/
评论已关闭