mirror of
https://github.com/tznb1/TwoNav.git
synced 2025-08-10 08:51:49 +00:00
v2.0.22-20230523
This commit is contained in:
23
system/MySQL/20230522.php
Normal file
23
system/MySQL/20230522.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
|
||||
$sql ="
|
||||
CREATE TABLE IF NOT EXISTS `global_icon` (
|
||||
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`url_md5` varchar(32) NOT NULL COMMENT 'url_md5',
|
||||
`url` text NOT NULL COMMENT 'url',
|
||||
`ico_url` text NOT NULL COMMENT 'url_ico',
|
||||
`add_time` int(10) UNSIGNED NOT NULL COMMENT '创建时间',
|
||||
`update_time` int(10) UNSIGNED NOT NULL COMMENT '更新时间',
|
||||
`file_name` text NOT NULL COMMENT '文件名',
|
||||
`file_mime` text NOT NULL COMMENT 'MIME类型',
|
||||
`extend` text NOT NULL COMMENT '预留扩展',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
|
||||
('icon_pull', '图标拉取', '允许用户拉取链接图标');
|
||||
";
|
||||
if(exe_sql($sql)){
|
||||
insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
|
||||
}else{
|
||||
msg(-1,'数据库更新失败');
|
||||
}
|
||||
22
system/SQLite/20230522.php
Normal file
22
system/SQLite/20230522.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
|
||||
$sql =<<<EOF
|
||||
CREATE TABLE IF NOT EXISTS "global_icon" (
|
||||
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"url_md5" text(32) NOT NULL DEFAULT "",
|
||||
"url" text NOT NULL DEFAULT "",
|
||||
"ico_url" text NOT NULL DEFAULT "",
|
||||
"add_time" integer(10) NOT NULL,
|
||||
"update_time" integer(10) NOT NULL,
|
||||
"file_name" text NOT NULL DEFAULT "",
|
||||
"file_mime" text NOT NULL DEFAULT "",
|
||||
"extend" text NOT NULL DEFAULT "",
|
||||
CONSTRAINT "id" UNIQUE ("id" ASC)
|
||||
);
|
||||
INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
|
||||
('icon_pull', '图标拉取', '允许用户拉取链接图标');
|
||||
EOF;
|
||||
if(exe_sql($sql)){
|
||||
insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
|
||||
}else{
|
||||
msg(-1,'数据库更新失败');
|
||||
}
|
||||
@@ -330,6 +330,10 @@ if(!defined('DIR')){
|
||||
deldir($temp_dir);
|
||||
msg(-1,'tar文件效验失败');
|
||||
}
|
||||
//检查目录
|
||||
if(!Check_Path(DIR."/data/backup/".U)){
|
||||
msg(-1,'创建backup目录失败,请检查权限');
|
||||
}
|
||||
//复制到用户数据
|
||||
try {
|
||||
$backup_dir = DIR."/data/backup/".U."/";
|
||||
|
||||
@@ -674,40 +674,40 @@ function write_link(){
|
||||
if(empty($fid)){msg(-1,'分类ID错误');}
|
||||
//加一个查找分类是否存在
|
||||
update_db('user_links',['fid'=>$fid],['uid'=>UID ,"lid" => json_decode($_POST['lid']) ],[1,'设置成功']);
|
||||
//图标拉取(不完善,未开放使用)
|
||||
//图标拉取
|
||||
}elseif($_GET['type'] === 'icon_pull'){
|
||||
$link = get_db('user_links','url',['uid'=>UID,'lid'=>$_POST['id']]);
|
||||
if($global_config['offline']){
|
||||
msg(-1,"离线模式禁止下载主题!");
|
||||
}
|
||||
if(!is_subscribe('bool')){
|
||||
msg(-1,"未检测到有效授权,无法使用该功能!");
|
||||
}
|
||||
if(!check_purview('icon_pull',1)){
|
||||
msg(-1,'无权限');
|
||||
}
|
||||
$link = get_db('user_links','*',['uid'=>UID,'lid'=>$_POST['id']]);
|
||||
if(empty($link)){
|
||||
msg(-1,'请求的链接id不存在');
|
||||
}
|
||||
$s_site = unserialize(get_db("user_config","v",["k"=>"s_site","uid"=>UID]));
|
||||
if(empty($s_site['link_icon']) || $s_site['link_icon'] == 0){
|
||||
msg(-1,'站点设置链接图标不能是离线图标!请先修改配置!');
|
||||
if(empty($_POST['cover']) && !empty($link['icon'])){
|
||||
msg(1,'skip');//跳过存在图标的链接
|
||||
}
|
||||
$icon = $s_site['link_icon'];
|
||||
if($icon ==2){
|
||||
function base64($url){
|
||||
$urls = parse_url($url);
|
||||
$scheme = empty( $urls['scheme'] ) ? 'http://' : $urls['scheme'].'://'; //获取请求协议
|
||||
$host = $urls['host']; //获取主机名
|
||||
$port = empty( $urls['port'] ) ? '' : ':'.$urls['port']; //获取端口
|
||||
$new_url = $scheme.$host.$port;
|
||||
return base64_encode($new_url);
|
||||
}
|
||||
$api = 'https://favicon.rss.ink/v1/'.base64($link);
|
||||
}elseif($icon ==4){
|
||||
$api = 'https://api.15777.cn/get.php?url='.$link;
|
||||
}elseif($icon ==5){
|
||||
$api = 'https://favicon.cccyun.cc/'.$link;
|
||||
}elseif($icon ==6){
|
||||
$api = 'https://api.iowen.cn/favicon/'.parse_url($link)['host'].'.png';
|
||||
}elseif($icon ==7){
|
||||
$api = 'https://toolb.cn/favicon/'.parse_url($link)['host'];
|
||||
$path = DIR ."/data/user/".U."/favicon";
|
||||
if(!Check_Path($path)){
|
||||
msg(-1,'创建目录失败,请检查权限');
|
||||
}
|
||||
if(downFile($api,$_POST['id'].'.ico',DIR ."/data/user/".U."/favicon/")){
|
||||
update_db('user_links',['icon'=>"./data/user/".U.'/favicon/'.$_POST['id'].'.ico'],['uid'=>UID ,"lid" => $_POST['id'] ],[1,'获取成功']);
|
||||
$api = Get_Index_URL().'?c=icon&url='.base64_encode($link['url']);
|
||||
$res = ccurl($api);
|
||||
$data = get_db('global_icon','*',['url_md5'=>md5($link['url'])]);
|
||||
if(empty($data)){
|
||||
msg(-1,'fail');
|
||||
}
|
||||
msg(-1,'获取失败');
|
||||
$new_path = "./data/user/".U.'/favicon/'.$data['file_name'];
|
||||
if(copy("./data/icon/{$data['file_name']}",$new_path)){
|
||||
update_db('user_links',['icon'=>$new_path],['uid'=>UID ,"lid" => $_POST['id'] ],[1,'success']);
|
||||
}
|
||||
|
||||
msg(-1,'fail');
|
||||
|
||||
}elseif($_GET['type'] == 'extend_list'){
|
||||
if($GLOBALS['global_config']['link_extend'] != 1 ||!check_purview('link_extend',1)){
|
||||
@@ -952,7 +952,7 @@ function write_site_setting(){
|
||||
'description'=>['empty'=>true],
|
||||
'link_model'=>['v'=>['direct','Privacy','Privacy_js','Privacy_meta','301','302','Transition'],'msg'=>'链接模式参数错误'],
|
||||
'main_link_priority'=>['int'=>true,'min'=>0,'max'=>3,'msg'=>'主链优先参数错误'],
|
||||
'link_icon'=>['int'=>true,'min'=>0,'max'=>10,'msg'=>'链接图标参数错误'],
|
||||
'link_icon'=>['int'=>true,'min'=>0,'max'=>30,'msg'=>'链接图标参数错误'],
|
||||
'site_icon'=>['empty'=>true],
|
||||
'top_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'热门链接参数错误'],
|
||||
'new_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'最新链接参数错误'],
|
||||
|
||||
@@ -718,6 +718,11 @@ function other_root(){
|
||||
$_POST['Subject'] = 'TwoNav 测试邮件' . time();
|
||||
$_POST['Body'] = '<h1>TwoNav 测试邮件</h1>' . date('Y-m-d H:i:s');
|
||||
send_email($_POST);
|
||||
}elseif($_GET['type'] == 'write_icon_config'){
|
||||
if($GLOBALS['global_config']['offline'] == '1'){msg(-1,"离线模式无法使用此功能");}
|
||||
if(!is_subscribe('bool')){msg(-1,"未检测到有效授权,无法使用该功能!");}
|
||||
write_global_config('icon_config',$_POST,'图标配置');
|
||||
msg(1,'保存成功');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
296
system/icon.php
Normal file
296
system/icon.php
Normal file
@@ -0,0 +1,296 @@
|
||||
<?php
|
||||
|
||||
//读取配置
|
||||
$config = unserialize( get_db("global_config", "v", ["k" => "icon_config"])) ?? [];
|
||||
$config['analysis_timeout'] = (intval($config['analysis_timeout']) >= 3 && intval($config['analysis_timeout']) <= 20) ? intval($config['analysis_timeout']) : 6; //解析超时
|
||||
$config['download_timeout'] = (intval($config['download_timeout']) >= 3 && intval($config['download_timeout']) <= 20) ? intval($config['download_timeout']) : 6; //下载超时
|
||||
$config['icon_size'] = (intval($config['icon_size']) >= 5 && intval($config['icon_size']) <= 1024) ? intval($config['icon_size']) : 256; //大小限制
|
||||
$favicon_url = '';
|
||||
//防盗链
|
||||
if($config['referer_test'] == 1){
|
||||
if(empty($_SERVER['HTTP_REFERER']) || !strstr($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST'])){
|
||||
header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit('404 Not Found');
|
||||
}
|
||||
}
|
||||
|
||||
//获取URL
|
||||
$url = base64_decode($_GET['url']);
|
||||
$url_md5 = md5($url);
|
||||
|
||||
//维护模式/离线模式/关闭服务 > 输出固定图标
|
||||
if($global_config['Maintenance'] != 0 || $global_config['offline'] == '1' || $config['o_switch'] == '0' || !is_subscribe('bool')){
|
||||
echo_link_type_icon();
|
||||
}
|
||||
|
||||
//如果不是http(s)则根据类型输出固定图标
|
||||
if(!preg_match("/^(http:\/\/|https:\/\/)/",$url)){
|
||||
echo_link_type_icon();
|
||||
}else{
|
||||
$uri_part = parse_url($url);
|
||||
$url_root = $uri_part['scheme'] . '://' . $uri_part['host'] . (isset($uri_part['port']) ? ':' . $uri_part['port'] : '');
|
||||
}
|
||||
|
||||
//检查目录 > 不存在则自动创建 > 创建失败显示错误图标
|
||||
if(!Check_Path(DIR.'/data/icon')){
|
||||
echo_icon(DIR . '/templates/admin/img/error.svg',$config);
|
||||
}
|
||||
|
||||
//读取缓存 > 存在且可用则输出
|
||||
$cache_data = get_db('global_icon','*',['url_md5'=>$url_md5]);
|
||||
if(!empty($cache_data) && $cache_data['update_time'] > time() - intval($config['server_cache_time']) && is_file(DIR . '/data/icon/' . $cache_data['file_name'])){
|
||||
echo_icon(DIR . '/data/icon/' . $cache_data['file_name'],$config,$cache_data);
|
||||
}
|
||||
|
||||
//缓存不可用
|
||||
//获取URL的html内容
|
||||
$html = get_html($url,$config['analysis_timeout']);
|
||||
|
||||
//获取html失败
|
||||
if(empty($html)){
|
||||
backup_api($url,$config); //调用备选接口
|
||||
}
|
||||
|
||||
//html获取成功>尝试解析
|
||||
try {
|
||||
$doc = new DOMDocument();
|
||||
@$doc->loadHTML($html);
|
||||
$links = $doc->getElementsByTagName('link');
|
||||
//后续可以考虑将所有声明的图标加入数组,然后按特定规则排序,实现多图标时获取较大尺寸的图标
|
||||
foreach ($links as $link) {
|
||||
if (in_array($link->getAttribute('rel'),['shortcut icon','icon','alternate icon','apple-touch-icon'])) {
|
||||
$favicon_url = $link->getAttribute('href');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}catch (Exception $e) {
|
||||
//解析异常,不做处理!下面继续尝试其他方法获取!
|
||||
}
|
||||
|
||||
//解析失败(可能是未设置图标)
|
||||
if(empty($favicon_url)){
|
||||
//尝试获取根目录的favicon.ico
|
||||
$res = down_ico($url_root.'/favicon.ico','./data/icon/',$url,$config['download_timeout']);
|
||||
if($res){
|
||||
echo_icon(DIR . '/data/icon/'.$url_md5.".ico",$config);
|
||||
}
|
||||
//调用备选接口
|
||||
backup_api($url,$config);
|
||||
}
|
||||
|
||||
//解析到图标
|
||||
$favicon_url = url_patch($favicon_url,$url);
|
||||
|
||||
//if 如果图标类型是base64或者svg则不需要下载
|
||||
|
||||
|
||||
//匹配图标类型>下载>输出
|
||||
$suffix = strtolower(end(explode('.',$favicon_url)));
|
||||
$suffix = preg_match('/^(jpg|jpeg|png|ico|bmp|svg|webp)$/i',$suffix) ? $suffix : 'ico';
|
||||
|
||||
//下载图标 > 成功则输出
|
||||
$res = down_ico($favicon_url,'./data/icon/',$url,$config['download_timeout']);
|
||||
if($res){
|
||||
echo_icon(DIR . '/data/icon/'.$url_md5.".$suffix",$config);
|
||||
}else{
|
||||
echo_link_type_icon();
|
||||
}
|
||||
|
||||
//使用备用接口
|
||||
function backup_api($url,$config){
|
||||
global $uri_part,$url_root;
|
||||
//未设置时直接输出ie图标
|
||||
$backup_api = intval($config['backup_api']);
|
||||
if($backup_api == 0){
|
||||
echo_icon(DIR . '/templates/admin/img/ie.svg',$config);
|
||||
}elseif($backup_api == 6){
|
||||
$res = down_ico('https://api.iowen.cn/favicon/'.parse_url($url)['host'].'.png','./data/icon/','',$config['download_timeout']);
|
||||
if($res){
|
||||
echo_icon(DIR . '/data/icon/'.$GLOBALS['url_md5'].".png",$config);
|
||||
}
|
||||
}elseif($backup_api == 2){
|
||||
$res = down_ico('https://favicon.png.pub/v1/'.base64_encode($url_root),'./data/icon/','',$config['download_timeout']);
|
||||
if($res){
|
||||
echo_icon(DIR . '/data/icon/'.$GLOBALS['url_md5'].".png",$config);
|
||||
}
|
||||
}
|
||||
|
||||
//如果都失败,则输出默认图标
|
||||
echo_icon(DIR . '/templates/admin/img/ie.svg',$config);
|
||||
}
|
||||
//检测URL自动补全
|
||||
function url_patch($favicon_url,$url){
|
||||
global $uri_part,$url_root;
|
||||
//包含协议表示URL完整,直接返回
|
||||
if(strpos($favicon_url, '://')){
|
||||
return $favicon_url;
|
||||
}
|
||||
|
||||
//忽略协议的绝对路径
|
||||
if(strpos($favicon_url, '//') === 0 ) {
|
||||
return $uri_part['scheme'] . ':' . $favicon_url;
|
||||
}
|
||||
|
||||
//位于根目录
|
||||
if(strpos($favicon_url, '/') === 0 ){
|
||||
return $url_root.$favicon_url;
|
||||
}
|
||||
//当前目录
|
||||
if(strpos($favicon_url, './') === 0){
|
||||
return $url_root . $uri_part['path'] . substr($favicon_url, 2);
|
||||
}
|
||||
//向上N级目录
|
||||
if(strpos($favicon_url, '../') === 0){
|
||||
$N = substr_count($favicon_url,'../');
|
||||
$url_temp = $uri_part['path'];
|
||||
for ($i = 0; $i < $N; $i++) {
|
||||
$url_temp = dirname($url_temp);
|
||||
$favicon_url = preg_replace('/^\.\.\//', '', $favicon_url);
|
||||
}
|
||||
return $url_root . $url_temp . $favicon_url;
|
||||
}
|
||||
|
||||
//base64
|
||||
|
||||
//SVG
|
||||
|
||||
//默认路径
|
||||
return $url_root . $uri_part['path'] . $favicon_url;
|
||||
}
|
||||
|
||||
//获取html
|
||||
function get_html($url,$TIMEOUT = 5){
|
||||
try {
|
||||
$c = curl_init();
|
||||
curl_setopt($c, CURLOPT_URL, $url);
|
||||
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($c, CURLOPT_FAILONERROR, 1);
|
||||
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
|
||||
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
|
||||
curl_setopt($c, CURLOPT_TIMEOUT, $TIMEOUT);
|
||||
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36');
|
||||
$data = curl_exec($c);
|
||||
//如果是gzip则解压
|
||||
$prefix = dechex(ord($data[0])) . dechex(ord($data[1]));
|
||||
if(strtolower($prefix) == '1f8b'){
|
||||
$data = gzdecode($data);
|
||||
}
|
||||
curl_close($c);
|
||||
return $data;
|
||||
}catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function down_ico($ico_url, $savePath = './data/temp/',$referer = '',$TIMEOUT = 60){
|
||||
$suffix = strtolower(end(explode('.',$ico_url)));
|
||||
if(!preg_match('/^(jpg|jpeg|png|ico|bmp|svg|webp)$/i',$suffix)){
|
||||
$suffix = 'ico'; //没匹配到后缀名则默认为ico
|
||||
}
|
||||
$file = "{$GLOBALS['url_md5']}.{$suffix}";
|
||||
$c = curl_init();
|
||||
curl_setopt($c, CURLOPT_URL, $ico_url);
|
||||
curl_setopt($c, CURLOPT_TIMEOUT, $TIMEOUT);
|
||||
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($c, CURLOPT_HEADER, FALSE);
|
||||
curl_setopt($c, CURLOPT_NOBODY, FALSE);
|
||||
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
|
||||
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
|
||||
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36');
|
||||
if(!empty($referer)){
|
||||
curl_setopt($c, CURLOPT_REFERER, $referer);
|
||||
}
|
||||
try{
|
||||
$res = curl_exec($c);
|
||||
}finally{
|
||||
$code = curl_getinfo($c, CURLINFO_HTTP_CODE);
|
||||
curl_close($c);
|
||||
}
|
||||
|
||||
if ($code == '200') { //状态码正常
|
||||
//十六进制取文件头
|
||||
$prefix = strtolower( dechex(ord($res[0])) . dechex(ord($res[1])) );
|
||||
//根据头判断类型
|
||||
if($prefix == '1f8b'){ //gzip解码
|
||||
$res = gzdecode($res);
|
||||
}elseif( $prefix != '3c73' && strpos($prefix, '3c') === 0){ // <开头视为文本 <?开头是svg除外
|
||||
return false;
|
||||
}
|
||||
//3c73>svg 3c21>html 1f8b>gzip
|
||||
|
||||
//文件大小限制
|
||||
if((strlen($res) / 1024)> $GLOBALS['config']['icon_size']){
|
||||
return false;
|
||||
}
|
||||
$fullName = rtrim($savePath, '/') . '/' . $file;
|
||||
$type = ['jpg'=>'jpeg','jpeg'=>'jpeg','svg'=>'svg+xml','ico'=>'x-icon']; //类型表
|
||||
$mime = $type[$suffix] ?? 'x-icon';
|
||||
|
||||
//黑名单(后期考虑使用在线名单缓存到本地,以便以更好的维护)
|
||||
$_md5 = md5($res);
|
||||
if($_md5 == 'c531ffbdad1ba93bd84f2398052958dc') return false; //阿里云
|
||||
if($_md5 == '05231fb6b69aff47c3f35efe09c11ba0') return false; //一为默认
|
||||
if($_md5 == '3ca64f83fdcf25135d87e08af65e68c9') return false; //小z默认
|
||||
|
||||
$data = ['update_time'=>time(),'file_name'=>$file,'file_mime'=>$mime,'ico_url'=>$ico_url,'extend'=>''];
|
||||
if(!has_db('global_icon',['url_md5'=>$GLOBALS['url_md5']])){
|
||||
$data['url_md5'] = $GLOBALS['url_md5'];
|
||||
$data['url'] = $GLOBALS['url'];
|
||||
$data['add_time'] = time();
|
||||
insert_db('global_icon',$data);
|
||||
}else{
|
||||
update_db('global_icon',$data,['url_md5'=>$GLOBALS['url_md5']]);
|
||||
}
|
||||
|
||||
return file_put_contents($fullName, $res);
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function echo_icon($path,$config,$db = false){
|
||||
//文件不存在时输出固定图标(理论上执行到这里不会出现文件不存在)
|
||||
if(!is_file($path)){
|
||||
echo_icon(DIR . '/templates/admin/img/ie.svg',$config);
|
||||
}
|
||||
//如果存在mime类型则直接读取,否则根据文件类型声明(从缓存读取时才会有mime)
|
||||
if(empty($db['mime'])){
|
||||
$suffix = strtolower(end(explode('.',$path))); //文件类型
|
||||
$type = ['jpg'=>'jpeg','jpeg'=>'jpeg','svg'=>'svg+xml','ico'=>'x-icon']; //类型表
|
||||
$mime = $type[$suffix] ?? 'x-icon';
|
||||
}else{
|
||||
$mime = $db['mime'];
|
||||
}
|
||||
//MIME类型
|
||||
header("Content-Type: image/{$mime};text/html; charset=utf-8");
|
||||
//缓存时间
|
||||
$cache_time = intval($config['browse_cache_time']);
|
||||
if($cache_time > 0 ){
|
||||
header ("Last-Modified: " .gmdate("D, d M Y H:i:s", empty($db['mime']) ? filemtime($path):$db['mime'] )." GMT"); //更新时间
|
||||
header("Expires: " .gmdate("D, d M Y H:i:s", time() + $cache_time)." GMT"); //过期时间 HTTP1.0
|
||||
header("Cache-Control: public, max-age={$cache_time}"); //存活时间 HTTP1.1
|
||||
}
|
||||
//输出文件
|
||||
exit(file_get_contents($path,true));
|
||||
}
|
||||
|
||||
|
||||
//根据链接类型输出图标
|
||||
function echo_link_type_icon(){
|
||||
global $config;$config['browse_cache_time'] = 60;
|
||||
if(preg_match("/^(http:\/\/|https:\/\/)/",$GLOBALS['url'])){
|
||||
echo_icon(DIR . '/templates/admin/img/ie.svg',$config);
|
||||
}elseif(preg_match("/^(ftp:\/\/|ftps:\/\/|sftp:\/\/)/",$GLOBALS['url'])){
|
||||
echo_icon(DIR . '/templates/admin/img/ftp.svg',$config);
|
||||
}elseif(preg_match("/^magnet:?/",$GLOBALS['url'])){
|
||||
echo_icon(DIR . '/templates/admin/img/magnet.svg',$config);
|
||||
}elseif(preg_match("/^(tcp:\/\/|udp:\/\/|rtsp:\/\)/",$GLOBALS['url'])){
|
||||
echo_icon(DIR . '/templates/admin/img/tcpudp.svg',$config);
|
||||
}elseif(preg_match("/^thunder:\/\//",$GLOBALS['url'])){
|
||||
echo_icon(DIR . '/templates/admin/img/xunlei.png',$config);
|
||||
}else{
|
||||
echo_icon(DIR . '/templates/admin/img/ie.svg',$config);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
@@ -536,17 +536,19 @@ function ccurl($url,$overtime = 3){
|
||||
return $Res;
|
||||
}
|
||||
|
||||
function downFile($url, $file = '', $savePath = './data/temp/'){
|
||||
function downFile($url, $file = '', $savePath = './data/temp/',$referer = '',$TIMEOUT = 60){
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //超时/秒
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, $TIMEOUT); //超时/秒
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不直接输出
|
||||
curl_setopt($ch, CURLOPT_HEADER, FALSE); //不需要response header
|
||||
curl_setopt($ch, CURLOPT_NOBODY, FALSE); //需要response body
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //允许重定向(适应网盘下载)
|
||||
|
||||
if(!empty($referer)){
|
||||
curl_setopt($ch, CURLOPT_REFERER, $referer);
|
||||
}
|
||||
try{
|
||||
$res = curl_exec($ch);
|
||||
}finally{
|
||||
|
||||
@@ -48,8 +48,10 @@ if(empty($c) || in_array($c,['index','click'])){
|
||||
}
|
||||
if ($site['link_icon'] == 'default'){
|
||||
return($GLOBALS['libs'].'/Other/default.ico');
|
||||
}elseif ($icon ==1){
|
||||
return('./favicon/index2.php?url='.$link['real_url']);
|
||||
}elseif ($icon ==20){
|
||||
return('./index.php?c=icon&url='.base64_encode($link['real_url']));
|
||||
}elseif ($icon ==21){
|
||||
return('./ico/'.base64_encode($link['real_url']));
|
||||
}elseif($icon ==2){
|
||||
return('//favicon.png.pub/v1/'.base64($link['real_url']));
|
||||
}elseif($icon ==4){
|
||||
|
||||
@@ -1 +1 @@
|
||||
v2.0.21-20230521
|
||||
v2.0.22-20230523
|
||||
Reference in New Issue
Block a user