forked from tfornik/RussiaTools
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1028 lines
32 KiB
1028 lines
32 KiB
<?php
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
// http://127.0.0.1:9980/config.php
|
|
|
|
// 初始化站点计数器
|
|
$siteCount = 0;
|
|
|
|
// ==================
|
|
// 1. 生成固定配置
|
|
// ==================
|
|
$config = [
|
|
// 站点数量提示
|
|
"notice" => "提示:正在计算站源数量...",
|
|
|
|
// 主jar配置(用于本地固定站点和本地生成站点)
|
|
"spider" => "http://127.0.0.1:9978/file/江湖/jar/yt.jar",
|
|
|
|
// 固定headers配置
|
|
"headers" => [
|
|
[
|
|
"host" => "img\\d+.doubanio.com",
|
|
"header" => [
|
|
"Referer" => "https://movie.douban.com"
|
|
]
|
|
],
|
|
[
|
|
"host" => "img1.doubanio.com",
|
|
"header" => [
|
|
"Referer" => "https://movie.douban.com"
|
|
]
|
|
],
|
|
[
|
|
"host" => "img2.doubanio.com",
|
|
"header" => [
|
|
"Referer" => "https://movie.douban.com"
|
|
]
|
|
],
|
|
[
|
|
"host" => "img3.doubanio.com",
|
|
"header" => [
|
|
"Referer" => "https://movie.douban.com"
|
|
]
|
|
],
|
|
[
|
|
"host" => "img4.doubanio.com",
|
|
"header" => [
|
|
"Referer" => "https://movie.douban.com"
|
|
]
|
|
],
|
|
[
|
|
"host" => "img5.doubanio.com",
|
|
"header" => [
|
|
"Referer" => "https://movie.douban.com"
|
|
]
|
|
]
|
|
],
|
|
|
|
// 固定lives配置
|
|
"lives" => [
|
|
[
|
|
"name" => "litv",
|
|
"url" => "http://127.0.0.1:8084/litv.php"
|
|
],
|
|
[
|
|
"name" => "直播-央视频",
|
|
"url" => "http://127.0.0.1:8083/ysp.php?action=txt"
|
|
],
|
|
[
|
|
"name" => "直播-虎牙直播",
|
|
"url" => "http://127.0.0.1:8084/huya.php"
|
|
],
|
|
[
|
|
"name" => "电影-虎牙一起看",
|
|
"url" => "http://127.0.0.1:8084/hyyqk.php"
|
|
],
|
|
[
|
|
"name" => "直播-xx",
|
|
"url" => "http://127.0.0.1:8080/xx.php"
|
|
],
|
|
[
|
|
"name" => "免费",
|
|
"type" => 0,
|
|
"url" => "https://live.catvod.com/tv.m3u",
|
|
"epg" => "https://fy.188766.xyz/e.xml",
|
|
"logo" => "https://epg.112114.xyz/logo/{name}.png",
|
|
"ua" => "okhttp3.1"
|
|
],
|
|
[
|
|
"name" => "冰茶",
|
|
"type" => 0,
|
|
"playerType" => 2,
|
|
"url" => "https://fy.188766.xyz/?ip=true&mima=bingcha1130&json=true&huikan=1",
|
|
"epg" => "https://fy.188766.xyz/e.xml",
|
|
"logo" => "https://epg.112114.xyz/logo/{name}.png",
|
|
"ua" => "bingcha/1.1 (mianfeifenxiang) "
|
|
],
|
|
[
|
|
"name" => "电视家",
|
|
"url" => "https://down.nigx.cn/dsj.zzong6599.workers.dev/",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
],
|
|
"epg" => "https://iptv.crestekk.cn/epgphp/index.php"
|
|
],
|
|
[
|
|
"name" => "裤佬",
|
|
"url" => "https://down.nigx.cn/raw.githubusercontent.com/Jsnzkpg/Jsnzkpg/Jsnzkpg/Jsnzkpg1",
|
|
"header" => [
|
|
"Referer" => "https://www.kds.tw/"
|
|
],
|
|
"epg" => "https://iptv.crestekk.cn/epgphp/index.php"
|
|
],
|
|
[
|
|
"name" => "黄色",
|
|
"url" => "https://down.nigx.cn/mpimg.cn/down.php/25da10b0cb7b90d422ae22852bd7d414.txt",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
],
|
|
"epg" => "http://epg.112114.xyz/?ch={name}&date={date}"
|
|
],
|
|
[
|
|
"name" => "直播",
|
|
"url" => "https://rt.http3.lol/index.php?q=aHR0cHM6Ly96Yi56em9uZzY1OTkud29ya2Vycy5kZXY="
|
|
],
|
|
[
|
|
"name" => "咪咕",
|
|
"url" => "https://down.nigx.cn/raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
]
|
|
],
|
|
[
|
|
"name" => "日本",
|
|
"url" => "https://down.nigx.cn/raw.githubusercontent.com/luongz/iptv-jp/refs/heads/main/jp_clean.m3u",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
]
|
|
],
|
|
[
|
|
"name" => "日本1",
|
|
"url" => "https://down.nigx.cn/raw.githubusercontent.com/luongz/iptv-jp/refs/heads/main/jp.m3u",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
]
|
|
],
|
|
[
|
|
"name" => "随机亚麻跌",
|
|
"type" => 0,
|
|
"url" => "https://sjymd.zzong6599.workers.dev/",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
],
|
|
"epg" => "http://diyp5.112114.xyz/?ch={name}&date={date}",
|
|
"logo" => "http://diyp5.112114.xyz/{name}.png"
|
|
],
|
|
[
|
|
"name" => "秘密花园",
|
|
"type" => 0,
|
|
"url" => "https://down.nigx.cn/mmhy.zzong6599.workers.dev/",
|
|
"header" => [
|
|
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
|
"Referer" => "",
|
|
"cookie" => ""
|
|
],
|
|
"epg" => "http://diyp5.112114.xyz/?ch={name}&date={date}",
|
|
"logo" => "http://diyp5.112114.xyz/{name}.png"
|
|
],
|
|
[
|
|
"name" => "SMT(py)",
|
|
"type" => 3,
|
|
"api" => "http://127.0.0.1:9978/file/江湖/py/lives-SMT.py",
|
|
"ext" => []
|
|
],
|
|
[
|
|
"name" => "iptv345",
|
|
"type" => 3,
|
|
"api" => "http://127.0.0.1:9978/file/江湖/py/lives-iptv345.py",
|
|
"ext" => []
|
|
],
|
|
[
|
|
"name" => "zxbv",
|
|
"type" => 3,
|
|
"api" => "http://127.0.0.1:9978/file/江湖/py/live_zxbv.py",
|
|
"ext" => []
|
|
],
|
|
[
|
|
"name" => "kzb",
|
|
"type" => 3,
|
|
"api" => "http://127.0.0.1:9978/file/江湖/py/lives-kzb.py",
|
|
"ext" => []
|
|
],
|
|
[
|
|
"name" => "直播bx5kge(js)",
|
|
"type" => 3,
|
|
"url" => "https://b6f56s23.bx5kge.com/assets/js/tv.js",
|
|
"api" => "http://127.0.0.1:9978/file/江湖/普通js/直播bx5kge.min.js",
|
|
"ext" => []
|
|
],
|
|
[
|
|
"name" => "快直播(js)",
|
|
"type" => 3,
|
|
"url" => "https://jzb5kqln.huajiaedu.com",
|
|
"api" => "http://127.0.0.1:9978/file/江湖/普通js/快直播.min.js",
|
|
"ext" => []
|
|
]
|
|
],
|
|
|
|
// 固定parses配置
|
|
"parses" => [
|
|
[
|
|
"name" => "五妹轮询",
|
|
"type" => 0,
|
|
"url" => "https://down.nigx.cn/jx.zzong6599.workers.dev/?url=",
|
|
"ext" => [
|
|
"flag" => [".*."],
|
|
"header" => [
|
|
"User-Agent" => "okhttp/4.9.1"
|
|
]
|
|
]
|
|
],
|
|
[
|
|
"name" => "五妹自动",
|
|
"type" => 0,
|
|
"url" => "https://down.nigx.cn/xjx.zzong6599.workers.dev/?url="
|
|
],
|
|
[
|
|
"name" => "4K智家",
|
|
"type" => 1,
|
|
"url" => "http://125.208.23.251:1314/lunxun/?url="
|
|
],
|
|
[
|
|
"name" => "星睿⚡4K",
|
|
"type" => 1,
|
|
"url" => "http://sspa8.top:8100/api/?cat_ext=eyJmbGFnIjpbInFxIiwi6IW+6K6vIiwicWl5aSIsIueIseWlh+iJuiIsIuWlh+iJuiIsInlvdWt1Iiwi5LyY6YW3Iiwic29odSIsIuaQnOeLkCIsImxldHYiLCLkuZDop4YiLCJtZ3R2Iiwi6IqS5p6cIiwidG5tYiIsInNldmVuIiwiYmlsaWJpbGkiLCIxOTA1Il0sImhlYWRlciI6eyJVc2VyLUFnZW50Ijoib2todHRwLzQuOS4xIn19&key=星睿4k&url="
|
|
],
|
|
[
|
|
"name" => "HD⚡腾讯解析",
|
|
"type" => 1,
|
|
"url" => "http://shybot.top/v2/video/jx/?shykey=4595a71a4e7712568edcfa43949236b42fcfcb04997788ebe7984d6da2c6a51c&url="
|
|
],
|
|
[
|
|
"name" => "4k芒果⚡专解",
|
|
"type" => 1,
|
|
"url" => "http://shybot.top/v2/video/jx/?shykey=4595a71a4e7712568edcfa43949236b42fcfcb04997788ebe7984d6da2c6a51c&qn=max&url="
|
|
],
|
|
[
|
|
"name" => "岁岁解析8888次",
|
|
"type" => 1,
|
|
"url" => "http://sspa8.top:8100/api/?key=1060089351&url="
|
|
],
|
|
[
|
|
"name" => "解析1",
|
|
"type" => 1,
|
|
"url" => "https://kalbim.xatut.top/kalbim2025/781718/play/video_player.php?url="
|
|
]
|
|
],
|
|
|
|
// 固定环境市场配置(没有jar字段,使用主jar)
|
|
"sites" => [
|
|
[
|
|
"key" => "csp_BinMarket",
|
|
"name" => "环境市场",
|
|
"api" => "csp_BinMarket",
|
|
"type" => "3"
|
|
],
|
|
[
|
|
"key" => "PHP爬虫第六代",
|
|
"name" => "PHP爬虫第六代",
|
|
"type" => 3,
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"api" => "csp_PhpServer",
|
|
"timeout" => 300
|
|
],
|
|
[
|
|
"key" => "PHP爬虫第五代",
|
|
"name" => "PHP爬虫第五代",
|
|
"type" => 3,
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"api" => "csp_php第5代",
|
|
"timeout" => 300
|
|
],
|
|
[
|
|
"key" => "PHP爬虫第四代",
|
|
"name" => "PHP爬虫第四代",
|
|
"type" => 3,
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"api" => "csp_php第4代",
|
|
"timeout" => 300
|
|
],
|
|
[
|
|
"key" => "Cntvjar",
|
|
"name" => "Cntvjar",
|
|
"type" => 3,
|
|
"api" => "csp_CntvSpider",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "jable-jar",
|
|
"name" => "jable-jar",
|
|
"type" => 3,
|
|
"api" => "csp_Jable",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "PTTjar",
|
|
"name" => "PTTjar",
|
|
"type" => 3,
|
|
"api" => "csp_PTT",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "看球jar",
|
|
"name" => "看球jar",
|
|
"type" => 3,
|
|
"searchable" => 1,
|
|
"api" => "csp_Kanqiu",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
]
|
|
],
|
|
[
|
|
"key" => "动漫jar",
|
|
"name" => "动漫jar",
|
|
"type" => 3,
|
|
"api" => "csp_YHDM",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "爱看机器人jar",
|
|
"name" => "爱看机器人jar",
|
|
"type" => 3,
|
|
"searchable" => 1,
|
|
"api" => "csp_Ikanbot"
|
|
],
|
|
[
|
|
"key" => "本地文件",
|
|
"name" => "本地文件",
|
|
"type" => 3,
|
|
"searchable" => 1,
|
|
"api" => "csp_Local"
|
|
],
|
|
[
|
|
"key" => "服务器cctv",
|
|
"name" => "服务器cctv",
|
|
"type" => 1,
|
|
"api" => "http://zhangqun1818.serv00.net/cctv.php",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "服务器小苹果",
|
|
"name" => "服务器小苹果",
|
|
"type" => 4,
|
|
"api" => "http://zhangqun19.serv00.net/pingguo.php",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "哔哩lz",
|
|
"name" => "哔哩lz",
|
|
"type" => 3,
|
|
"api" => "csp_Bilibili",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1,
|
|
"changeable" => 1
|
|
],
|
|
[
|
|
"key" => "哔哩fm",
|
|
"name" => "哔哩fm",
|
|
"type" => 3,
|
|
"api" => "csp_Bili",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"ext" => [
|
|
"cookie" => "",
|
|
"type" => "沙雕仙逆#沙雕动画#风景#听书#太空#海洋#动物#一口气#综合#音乐#影视"
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "界影视",
|
|
"name" => "界影视",
|
|
"type" => 3,
|
|
"api" => "csp_JieYingShi",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"changeable" => 1
|
|
],
|
|
[
|
|
"key" => "爱瓜电视",
|
|
"name" => "爱瓜电视",
|
|
"type" => 3,
|
|
"api" => "csp_AiguaTV1",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"changeable" => 1
|
|
],
|
|
[
|
|
"key" => "苹果jar",
|
|
"name" => "苹果jar",
|
|
"type" => 3,
|
|
"api" => "csp_PingGuo",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "文件不正经m3u",
|
|
"name" => "🔞文件不正经m3u",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=13",
|
|
"ext" => "/storage/emulated/0/江湖/php/wj/不正经/",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "不正经json清单",
|
|
"name" => "🔞不正经json清单",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=9",
|
|
"ext" => "/storage/emulated/0/江湖/php/json/不正经/",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "完整版老张json",
|
|
"name" => "完整版老张json",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=9",
|
|
"ext" => "/storage/emulated/0/江湖/php/json/",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "完整版老张文件",
|
|
"name" => "完整版老张文件",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=8",
|
|
"ext" => "/storage/emulated/0/江湖/php/wj/",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "文件采集",
|
|
"name" => "文件采集",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=8",
|
|
"ext" => "/storage/emulated/0/江湖/php/wj/采集",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "在线json",
|
|
"name" => "🔞在线json",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=8",
|
|
"ext" => "/storage/emulated/0/江湖",
|
|
"style" => [
|
|
"type" => "rect",
|
|
"ratio" => 1.33
|
|
],
|
|
"searchable" => 1
|
|
],
|
|
[
|
|
"key" => "听书go",
|
|
"name" => "听书go",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=11"
|
|
],
|
|
[
|
|
"key" => "采集go",
|
|
"name" => "采集go",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=12",
|
|
"ext" => "0"
|
|
],
|
|
[
|
|
"key" => "油管go",
|
|
"name" => "油管go",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988"
|
|
],
|
|
[
|
|
"key" => "欧乐影院",
|
|
"name" => "欧乐影院",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=4"
|
|
],
|
|
[
|
|
"key" => "采集集合",
|
|
"name" => "采集集合",
|
|
"type" => 1,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=3"
|
|
],
|
|
[
|
|
"key" => "短剧",
|
|
"name" => "短剧",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=2"
|
|
],
|
|
[
|
|
"key" => "服务器的油管",
|
|
"name" => "服务器的油管",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:1988/lb?lb=油管"
|
|
]
|
|
]
|
|
];
|
|
|
|
// 计算固定站点数量
|
|
$siteCount = count($config['sites']);
|
|
|
|
// ==================
|
|
// 2. 生成 /storage/emulated/0/江湖/wwwroot/php/ 目录的 PHP sites(无jar)
|
|
// ==================
|
|
$phpDir = "/storage/emulated/0/江湖/wwwroot/php/";
|
|
|
|
if (is_dir($phpDir)) {
|
|
$files = scandir($phpDir);
|
|
|
|
// 扫描指定目录的PHP文件(无jar)
|
|
foreach ($files as $file) {
|
|
if (pathinfo($file, PATHINFO_EXTENSION) !== 'php') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过index.php或其他不需要的文件
|
|
if ($file === 'index.php') {
|
|
continue;
|
|
}
|
|
|
|
$filename = pathinfo($file, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => "php_" . $filename,
|
|
"name" => $filename . "(PHP)",
|
|
"type" => 4,
|
|
"api" => "http://127.0.0.1:8901/php/" . $filename . ".php",
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"changeable" => 0
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果PHP目录不存在,记录日志
|
|
error_log("PHP目录不存在: " . $phpDir);
|
|
}
|
|
|
|
// ==================
|
|
// 3. 生成 PY sites
|
|
// ==================
|
|
$pyDir = "/storage/emulated/0/江湖/py";
|
|
|
|
if (is_dir($pyDir)) {
|
|
$pyFiles = scandir($pyDir);
|
|
|
|
foreach ($pyFiles as $pyFile) {
|
|
if (pathinfo($pyFile, PATHINFO_EXTENSION) !== 'py') {
|
|
continue;
|
|
}
|
|
|
|
if ($pyFile === '__init__.py' || $pyFile === '__pycache__') {
|
|
continue;
|
|
}
|
|
|
|
$pyFilename = pathinfo($pyFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => "py_" . $pyFilename,
|
|
"name" => $pyFilename . "(py)",
|
|
"type" => 3,
|
|
"api" => "http://127.0.0.1:9978/file/江湖/py/" . $pyFile,
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"changeable" => 0
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果PY目录不存在,可以记录日志或忽略
|
|
error_log("PY目录不存在: " . $pyDir);
|
|
}
|
|
|
|
// ==================
|
|
// 4. 生成普通 JS sites(无jar)
|
|
// ==================
|
|
$jsDir = "/storage/emulated/0/江湖/quickjs";
|
|
|
|
if (is_dir($jsDir)) {
|
|
$jsFiles = scandir($jsDir);
|
|
|
|
foreach ($jsFiles as $jsFile) {
|
|
if (pathinfo($jsFile, PATHINFO_EXTENSION) !== 'js') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过隐藏文件和目录
|
|
if ($jsFile[0] === '.') {
|
|
continue;
|
|
}
|
|
|
|
$jsFilename = pathinfo($jsFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => "js_" . $jsFilename,
|
|
"name" => $jsFilename . "(quickjs)",
|
|
"type" => 3,
|
|
"api" => "http://127.0.0.1:9978/file/江湖/quickjs/" . $jsFile,
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果JS目录不存在,可以记录日志或忽略
|
|
error_log("QUICKJS目录不存在: " . $jsDir);
|
|
}
|
|
|
|
// ==================
|
|
// 5. 生成需要外挂jar的 JS sites (NodeJS类型) - 使用主jar
|
|
// ==================
|
|
$nodeJsDir = "/storage/emulated/0/江湖/files";
|
|
|
|
if (is_dir($nodeJsDir)) {
|
|
$nodeJsFiles = scandir($nodeJsDir);
|
|
|
|
foreach ($nodeJsFiles as $jsFile) {
|
|
// 只处理js文件
|
|
if (pathinfo($jsFile, PATHINFO_EXTENSION) !== 'js') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过隐藏文件和目录
|
|
if ($jsFile[0] === '.') {
|
|
continue;
|
|
}
|
|
|
|
$jsFilename = pathinfo($jsFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => "Nodejs_" . $jsFilename,
|
|
"name" => "(NodeJs)" . $jsFilename,
|
|
"api" => "csp_FileLoader",
|
|
"type" => "3",
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"ext" => "/storage/emulated/0/江湖/files/" . $jsFile
|
|
// 注意:这里没有jar字段,使用主jar
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果files目录不存在,可以记录日志或忽略
|
|
error_log("NodeJS目录不存在: " . $nodeJsDir);
|
|
}
|
|
|
|
// ==================
|
|
// 6. 生成需要外挂jar的 PHP sites - 使用主jar
|
|
// ==================
|
|
$nodePhpDir = "/storage/emulated/0/江湖/scripts";
|
|
|
|
if (is_dir($nodePhpDir)) {
|
|
$nodePhpFiles = scandir($nodePhpDir);
|
|
|
|
foreach ($nodePhpFiles as $phpFile) {
|
|
// 只处理php文件
|
|
if (pathinfo($phpFile, PATHINFO_EXTENSION) !== 'php') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过隐藏文件和目录
|
|
if ($phpFile[0] === '.') {
|
|
continue;
|
|
}
|
|
|
|
$phpFilename = pathinfo($phpFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => "NodePhp_" . $phpFilename,
|
|
"name" => "(NodePhp)" . $phpFilename,
|
|
"api" => "csp_FileLoader",
|
|
"type" => "3",
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"ext" => "/storage/emulated/0/江湖/scripts/" . $phpFile
|
|
// 注意:这里没有jar字段,使用主jar
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果files目录不存在,可以记录日志或忽略
|
|
error_log("NodePHP目录不存在: " . $nodePhpDir);
|
|
}
|
|
|
|
// ==================
|
|
// 7. 生成需要外挂jar的 WV JS sites (csp_WvSpider6类型) - 使用主jar
|
|
// ==================
|
|
$wvJsDir = "/storage/emulated/0/江湖/wv";
|
|
|
|
if (is_dir($wvJsDir)) {
|
|
$wvJsFiles = scandir($wvJsDir);
|
|
|
|
foreach ($wvJsFiles as $jsFile) {
|
|
// 只处理js文件
|
|
if (pathinfo($jsFile, PATHINFO_EXTENSION) !== 'js') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过隐藏文件和目录
|
|
if ($jsFile[0] === '.') {
|
|
continue;
|
|
}
|
|
|
|
$jsFilename = pathinfo($jsFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => $jsFilename . "wv_",
|
|
"name" => $jsFilename . "(wv)",
|
|
"api" => "csp_WvSpider6",
|
|
"type" => "3",
|
|
"ext" => "http://127.0.0.1:9978/file/江湖/wv/" . $jsFile,
|
|
"searchable" => 1,
|
|
"filterable" => 1,
|
|
"switchable" => 1
|
|
// 注意:这里没有jar字段,使用主jar
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果wv目录不存在,可以记录日志或忽略
|
|
error_log("WV JS目录不存在: " . $wvJsDir);
|
|
}
|
|
|
|
// ==================
|
|
// 8. 生成需要外挂jar的 XBPQ JSON sites (csp_XBPQ类型) - 使用主jar
|
|
// ==================
|
|
$xbpqDir = "/storage/emulated/0/江湖/xbpq";
|
|
|
|
if (is_dir($xbpqDir)) {
|
|
$xbpqFiles = scandir($xbpqDir);
|
|
|
|
foreach ($xbpqFiles as $jsonFile) {
|
|
// 只处理json文件
|
|
if (pathinfo($jsonFile, PATHINFO_EXTENSION) !== 'json') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过隐藏文件和目录
|
|
if ($jsonFile[0] === '.') {
|
|
continue;
|
|
}
|
|
|
|
$jsonFilename = pathinfo($jsonFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => $jsonFilename . "xbpq_",
|
|
"name" => $jsonFilename . "(xbpq)",
|
|
"type" => 3,
|
|
"api" => "csp_XBPQ",
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"ext" => "http://127.0.0.1:9978/file/江湖/xbpq/" . $jsonFile
|
|
// 注意:这里没有jar字段,使用主jar
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果xbpq目录不存在,可以记录日志或忽略
|
|
error_log("XBPQ目录不存在: " . $xbpqDir);
|
|
}
|
|
|
|
// ==================
|
|
// 9. 生成需要外挂jar的 XYQ JSON sites (csp_XYQHiker类型) - 使用主jar
|
|
// ==================
|
|
$xyqDir = "/storage/emulated/0/江湖/xyq";
|
|
|
|
if (is_dir($xyqDir)) {
|
|
$xyqFiles = scandir($xyqDir);
|
|
|
|
foreach ($xyqFiles as $jsonFile) {
|
|
// 只处理json文件
|
|
if (pathinfo($jsonFile, PATHINFO_EXTENSION) !== 'json') {
|
|
continue;
|
|
}
|
|
|
|
// 跳过隐藏文件和目录
|
|
if ($jsonFile[0] === '.') {
|
|
continue;
|
|
}
|
|
|
|
$jsonFilename = pathinfo($jsonFile, PATHINFO_FILENAME);
|
|
|
|
$config['sites'][] = [
|
|
"key" => $jsonFilename . "xyq_",
|
|
"name" => $jsonFilename . "(xyq)",
|
|
"type" => 3,
|
|
"api" => "csp_XYQHiker",
|
|
"searchable" => 1,
|
|
"quickSearch" => 1,
|
|
"filterable" => 1,
|
|
"ext" => "http://127.0.0.1:9978/file/江湖/xyq/" . $jsonFile
|
|
// 注意:这里没有jar字段,使用主jar
|
|
];
|
|
|
|
$siteCount++;
|
|
}
|
|
} else {
|
|
// 如果xyq目录不存在,可以记录日志或忽略
|
|
error_log("XYQ目录不存在: " . $xyqDir);
|
|
}
|
|
|
|
// ==================
|
|
// 10. 更新notice字段,显示站点总数
|
|
// ==================
|
|
$config['notice'] = "提示:共生成" . $siteCount . "个站源";
|
|
|
|
// ==================
|
|
// 11. 定义多个远程配置URL
|
|
// ==================
|
|
$remoteConfigUrls = [
|
|
"http://127.0.0.1:5757/config/1",
|
|
// 可以添加OK接口,pg接口,各大屌接口
|
|
// 可以添加更多远程配置URL
|
|
// "http://example.com/config/2",
|
|
// "http://example.com/config/3",
|
|
];
|
|
|
|
// ==================
|
|
// 12. 加载多个远程配置并合并(修改关键部分)
|
|
// ==================
|
|
$remoteSiteCount = 0;
|
|
$remoteSites = [];
|
|
$allRemoteConfigs = [];
|
|
$remoteMainJars = []; // 存储每个远程配置的主jar
|
|
|
|
foreach ($remoteConfigUrls as $index => $remoteConfigUrl) {
|
|
// 使用 cURL 获取远程配置
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $remoteConfigUrl);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 10秒超时
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
|
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
|
|
curl_setopt($ch, CURLOPT_MAXREDIRS, 3); // 最大重定向次数
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
// 检查是否成功获取远程配置
|
|
if ($response && $httpCode === 200) {
|
|
$json = json_decode($response, true);
|
|
|
|
// JSON 合法并且是数组
|
|
if (is_array($json)) {
|
|
$allRemoteConfigs[] = $json;
|
|
|
|
// 保存远程配置的主jar
|
|
if (isset($json['spider'])) {
|
|
$remoteMainJars[$index] = $json['spider'];
|
|
}
|
|
|
|
// 收集远程站点
|
|
if (isset($json['sites']) && is_array($json['sites'])) {
|
|
foreach ($json['sites'] as $remoteSite) {
|
|
$remoteSites[] = [
|
|
'site' => $remoteSite,
|
|
'config_index' => $index // 记录站点来自哪个远程配置
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 如果有远程配置
|
|
if (!empty($allRemoteConfigs)) {
|
|
// 1. 创建本地固定站点唯一标识映射
|
|
$localSiteMap = [];
|
|
foreach ($config['sites'] as $site) {
|
|
if (isset($site['api']) && isset($site['name'])) {
|
|
$key = $site['api'] . '|' . $site['name'];
|
|
$localSiteMap[$key] = $site;
|
|
}
|
|
}
|
|
|
|
// 2. 去重处理远程站点,并处理jar字段
|
|
$uniqueRemoteSites = [];
|
|
$remoteSiteMap = []; // 用于远程站点内部去重
|
|
|
|
foreach ($remoteSites as $remoteItem) {
|
|
$remoteSite = $remoteItem['site'];
|
|
$configIndex = $remoteItem['config_index'];
|
|
|
|
if (isset($remoteSite['api']) && isset($remoteSite['name'])) {
|
|
$key = $remoteSite['api'] . '|' . $remoteSite['name'];
|
|
|
|
// 如果远程站点与本地固定站点重复,跳过(使用本地配置)
|
|
if (isset($localSiteMap[$key])) {
|
|
continue;
|
|
}
|
|
|
|
// 如果远程站点在远程配置中重复,跳过(只保留第一个)
|
|
if (isset($remoteSiteMap[$key])) {
|
|
continue;
|
|
}
|
|
|
|
// 重要:jar字段处理逻辑
|
|
// 如果远程站点有自己的jar字段,保留它
|
|
// 如果远程站点没有jar字段,但对应的远程配置有主jar,则添加主jar
|
|
if (!isset($remoteSite['jar']) && isset($remoteMainJars[$configIndex])) {
|
|
$remoteSite['jar'] = $remoteMainJars[$configIndex];
|
|
}
|
|
// 如果远程站点没有jar字段,且远程配置也没有主jar,则不添加jar字段
|
|
// (这样的站点会使用本地主jar或其他默认jar)
|
|
|
|
$uniqueRemoteSites[] = $remoteSite;
|
|
$remoteSiteMap[$key] = $remoteSite;
|
|
$remoteSiteCount++;
|
|
}
|
|
}
|
|
|
|
// 3. 合并站点:本地站点 + 去重后的远程站点
|
|
$config['sites'] = array_merge($config['sites'], $uniqueRemoteSites);
|
|
|
|
// 4. 合并其他配置(但本地固定配置优先)
|
|
foreach ($allRemoteConfigs as $remoteConfig) {
|
|
foreach ($remoteConfig as $key => $value) {
|
|
// 跳过sites和spider,sites已经处理,spider保留本地
|
|
if (!in_array($key, ['headers', 'lives', 'parses', 'sites', 'spider']) && !isset($config[$key])) {
|
|
$config[$key] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 5. 更新notice字段
|
|
$totalSiteCount = $siteCount + $remoteSiteCount;
|
|
$config['notice'] = "提示:共生成" . $totalSiteCount . "个站源(本地" . $siteCount . "个 + 去重后远程" . $remoteSiteCount . "个)";
|
|
}
|
|
|
|
// ==================
|
|
// 13. 输出最终配置
|
|
// ==================
|
|
echo json_encode(
|
|
$config,
|
|
JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
|
|
); |