<?php
/**
* @package ZMLTheme\Cores
*/
namespace ZMLTheme\Cores;
use ZMLTheme\Utils\Base as BaseUtil;
defined( 'ZMLTHEME_PRESENT' ) or die( 'Access Denied' );
/**
* Class ZMLTheme\Cores\Down
*
* 下载数据类
*
* @since 1.0.0
*/
class Down {
public function __construct() {}
/**
* 是否下载内容
*
* @param int $post
*
* @return bool
*/
function checkDown( $post = null ) {
$post = $post ?: \get_the_ID();
$down = BaseUtil::getMeta( 'post', $post, 'down-post' );
$down = $down ? true : false;
return $down;
}
/**
* 检查权限
*
* @param int $post
*
* @return string
*/
public function checkAuth( $post ) {
global $options;
//* 获取访问设置
$auth = BaseUtil::getMeta( 'post', $post, 'down-auth' );
$auth = $auth ?: $options['down-auth'];
//* 判断权限
switch ( $auth ) {
//* 不限
case 'guest':
$auth = 'allow';
break;
//* 登录
case 'login':
if ( \is_user_logged_in() ) {
$auth = 'allow';
} else {
$auth = 'login';
}
break;
//* 回复
case 'reply':
if ( \is_user_logged_in() ) {
if ( \current_user_can( 'publish_posts' ) ) {
$auth = 'allow';
} else {
global $wpdb, $current_user;
$email = $current_user->user_email;
$comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_author_email = '%s' and comment_post_id = '%s' and comment_approved = '1'", $email, $post ) );
if ( $comments ) {
$auth = 'allow';
} else {
$auth = 'reply';
}
}
} else {
$auth = 'reply';
}
break;
//* 其他
default:
$auth = 'other';
break;
}
return $auth;
}
/**
* 读取下载数据
*
* @param int $post
*
* @return array
*/
public function readDown( $post ) {
global $options;
//* 获取数据
$name = ['down-name', 'down-desc', 'down-demo', 'down-load', 'down-pass', 'down-count', 'down-date'];
$data = BaseUtil::getMeta( 'post', $post, $name );
//* 处理数据
$data['down-name'] = $data['down-name'] ?: 'Unknown-Name';
$data['down-pass'] = $data['down-pass'] ?: $options['down-pass'];
$data['down-pass'] = $data['down-pass'] ?: '未加密';
$data['down-show'] = $options['down-show'] ?: 0;
$data['down-count'] = $data['down-count'] ?: '0';
$data['down-date'] = $data['down-date'] ?: \get_the_time( 'Y-m-d', $post );
return $data;
}
/**
* 加载静态文件
*
* @param int $post
*
* @return string
*/
public function loadFile( $type ) {
if ( $type === 'css' ) {
echo '<link rel="stylesheet" type="text/css" href="' . esc_url( BaseUtil::getConst( 'URL_CSS' ) . 'down.css' ) . '">';
} elseif ( $type === 'js' ) {
echo '<script type="text/javascript" src="' . esc_url( BaseUtil::getConst( 'URL_JS' ) . 'jquery.js' ) . '"></script>';
echo '<script type="text/javascript" src="' . esc_url( BaseUtil::getConst( 'URL_JS' ) . 'down.js' ) . '"></script>';
echo '<script type="text/javascript" src="' . esc_url( BaseUtil::getConst( 'URL_JS' ) . 'icon.js' ) . '"></script>';
}
}
/**
* 解析演示链接
*
* @param string $demo
* @param int $post
*
* @return array
*/
public function demoLink( $demo, $post ) {
//* 分解演示地址
$demo = trim( $demo, ',' );
$demo = explode( ',', $demo );
$total = count( $demo );
for ( $i = 0; $i < $total; $i++ ) {
$link['item'] = $i;
//* 分解单条地址
$split = explode( '|', $demo[$i] );
$count = count( $split );
//* 获取下载信息
switch ( $count ) {
//* 单链接
case 1:
$link['title'] = '演示地址';
$link['url'] = $split[0];
break;
//* 标题和链接
case 2:
$link['title'] = $split[0];
$link['url'] = $split[1];
break;
default:
$link['title'] = '格式错误';
$link['url'] = '';
break;
}
//* 安全链接
if ( $link['url'] !== '' ) {
$link['safe'] = \esc_url( \home_url( '/down/demo/' ) );
$link['safe'] = \add_query_arg( 'id', $this->safeCode( $post . '-' . $link['item'] ), $link['safe'] );
} else {
$link['safe'] = '';
}
$result['link'][] = $link;
}
$result['total'] = $total;
return $result;
}
/**
* 解析下载链接
*
* @param string $down
* @param int $post
*
* @return array
*/
public function downLink( $down, $post ) {
//* 分解下载地址
$down = trim( $down, ',' );
$down = array_reverse( explode( ',', $down ) );
$total = count( $down );
for ( $i = 0; $i < $total; $i++ ) {
$link['item'] = $i;
//* 分解单条地址
$split = explode( '|', $down[$i] );
$count = count( $split );
//* 获取下载信息
switch ( $count ) {
//* 单链接
case 1:
$link['title'] = '下载地址';
$link['url'] = trim( $split[0] );
break;
//* 标题和链接
case 2:
$link['title'] = trim( $split[0] );
$link['url'] = trim( $split[1] );
break;
default:
$link['title'] = '格式错误';
$link['url'] = '';
break;
}
//* 获取链接信息
if ( $link['url'] !== '' ) {
//* 客户端
$client = [
'thunder' => ['迅雷下载', 'xunlei'],
'magnet' => ['磁力链接', 'magnet'],
'ed2k' => ['ED2K 链接', 'ed2k'],
'ctfile' => ['城通小通', 'ctfile'],
'ftp' => ['FTP 下载', 'ftp'],
];
//* 网盘云盘
$cloud = [
'pan.baidu.com' => ['百度网盘', 'baidu'],
'pan.xunlei.com' => ['迅雷云盘', 'xunlei'],
'aliyundrive.com' => ['阿里云盘', 'aliyun'],
'cloud.189.cn' => ['天翼云盘', 'tianyi'],
'caiyun.139.com' => ['和彩云', 'caiyun'],
'115.com' => ['115 网盘', 'yiyiwu'],
'share.weiyun.com' => ['腾讯微云', 'weiyun'],
'jianguoyun.com' => ['坚果云', 'jianguo'],
'drive.bytenet.cn' => ['城通网盘', 'ctfile'],
'drfs.ctcontents.com' => ['城通直连', 'ctfile'],
'www.123865.com' => ['123 云盘', 'yiersan'],
'www.123684.com' => ['123 云盘', 'yiersan'],
'www.123912.com' => ['123 云盘', 'yiersan'],
];
//* 解析链接
$parse = \wp_parse_url( $link['url'] );
$scheme = isset( $parse['scheme'] ) ? $parse['scheme'] : '';
$host = isset( $parse['host'] ) ? $parse['host'] : '';
$path = isset( $parse['path'] ) ? $parse['path'] : '';
$fast = stripos( $host, '.lanzou' );
//* 判断类型
if ( $fast ) {
$link['type'] = '高速下载';
$link['icon'] = 'speed';
} else {
if ( isset( $client[$scheme] ) ) {
$link['type'] = $client[$scheme][0];
$link['icon'] = $client[$scheme][1];
} else {
if ( isset( $cloud[$host] ) ) {
$link['type'] = $cloud[$host][0];
$link['icon'] = $cloud[$host][1];
} else if ( stripos( $path, '/downloads/' ) !== false ) {
$link['type'] = '商城产品';
$link['icon'] = 'shop';
} else if ( stripos( $host, 'lanzou' ) !== false ) {
$link['type'] = '蓝奏云';
$link['icon'] = 'cloud';
} else if ( stripos( $host, 'ctfile' ) !== false ) {
$link['type'] = '城通网盘';
$link['icon'] = 'ctfile';
} else {
$link['type'] = '普通下载';
$link['icon'] = 'http';
}
}
}
//* 安全链接
if ( $fast ) {
$link['safe'] = \esc_url( \home_url( '/down/fast/' ) );
$link['safe'] = \add_query_arg( 'id', $this->safeCode( $post . '-' . $link['item'] ), $link['safe'] );
} else {
$link['safe'] = \esc_url( \home_url( '/down/load/' ) );
$link['safe'] = \add_query_arg( 'id', $this->safeCode( $post . '-' . $link['item'] ), $link['safe'] );
}
} else {
$link['type'] = '无效地址';
$link['icon'] = 'break';
$link['safe'] = '';
}
$result['link'][] = $link;
}
$result['total'] = $total;
return $result;
}
/**
* 高速下载链接
*
* @param string $code
*
* @return string
*/
public function fastLink( $url ) {
// Agent 列表
$agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
'Mozilla/5.0 (Linux; Android 14; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36',
'Mozilla/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
];
$args = [
'timeout' => 30,
'redirection' => 5,
'httpversion' => '1.1',
'user-agent' => $agents[ array_rand( $agents ) ],
'headers' => [
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8',
'Accept-Encoding' => 'gzip, deflate, br',
'Cache-Control' => 'no-cache',
'Connection' => 'keep-alive',
'Upgrade-Insecure-Requests' => '1',
'Sec-Fetch-Dest' => 'document',
'Sec-Fetch-Mode' => 'navigate',
'Sec-Fetch-Site' => 'none',
'Sec-Fetch-User' => '?1',
],
'cookies' => [],
];
$remote = \wp_remote_get( $url, $args );
$result = [
'mark' => false,
'link' => $url,
];
if ( ! \is_wp_error( $remote ) ) {
$code = \wp_remote_retrieve_response_code( $remote );
$body = \wp_remote_retrieve_body( $remote );
if ( $code === 200 && $body ) {
preg_match( '/<iframe[^>]*src=["\']?([^"\' >]+)["\' ]?[^>]*>/i', $body, $match );
if ( ! empty( $match[1] ) ) {
$parsed = parse_url( $url );
$result = [
'mark' => true,
'link' => \esc_url( $parsed['scheme'] . '://' . $parsed['host'] . $match[1] ),
];
}
}
}
return $result;
}
/**
* 安全代码
*
* @param string $code
*
* @return string
*/
public function safeCode( $code ) {
$code = $this->codeNonce( $code ) . base64_encode( $code );
$code = str_replace( ['+', '/'], ['-', '_'], $code );
return $code;
}
/**
* 读取代码
*
* @param string $code
*
* @return string
*/
public function readCode( $code ) {
$code = str_replace( ['-', '_'], ['+', '/'], $code );
$safe = substr( $code, 0, 10 );
$code = base64_decode( substr( $code, 10 ) );
$code = $code && $this->codeNonce( $code, $safe ) ? $code : '';
return $code;
}
/**
* 代码验证
*
* @param string $code
* @param string $nonce
*
* @return mixed
*/
public function codeNonce( $code, $nonce = null ) {
$key = defined( 'NONCE_KEY' ) ? NONCE_KEY : ( defined( 'AUTH_KEY' ) ? AUTH_KEY : \home_url() );
$md5 = substr( md5( $key . $code ), 12, 10 );
$nonce = $nonce ? ( $md5 == $nonce ) : $md5;
return $nonce;
}
/**
* 隐藏来源
*
* @param string $url
*
* @return bool
*/
public function hideFrom( $url ) {
global $options;
//* 默认值
$hide = false;
if ( $options['down-safe'] === true ) {
//* 主机
$site = \wp_parse_url( \home_url(), PHP_URL_HOST );;
$file = \wp_parse_url( $url, PHP_URL_HOST );
//* 扩展名等
$path = \wp_parse_url( $url, PHP_URL_PATH );
$edd = strpos( $path, '/downloads/' ); //* 是否 EDD 链接
$ext = pathinfo( $path, PATHINFO_EXTENSION );
$type = ['zip', 'rar', '7z', 'cab', 'iso', 'jar', 'tar', 'gz'];
//* 本地非 EDD 链接或指定类型文件
if ( ( $file === $site && $edd === false ) || in_array( $ext, $type ) ) {
$hide = true;
}
}
return $hide;
}
/**
* 加载演示
*
* @param int $post
* @param int $item
*
* @return string
*/
public function loadDemo( $post, $item ) {
//* 演示地址
$demo = BaseUtil::getMeta( 'post', $post, 'down-demo' );
$demo = trim( $demo, ',' );
$demo = array_reverse( explode( ',', $demo ) );
//* 获取单条地址
$split = explode( '|', $demo[$item] );
$count = count( $split );
//* 获取演示地址
switch ( $count ) {
//* 单链接
case 1:
$link = trim( $split[0] );
break;
//* 标题和链接
case 2:
$link = trim( $split[1] );
break;
default:
$link = '';
break;
}
return $link;
}
/**
* 加载下载
*
* @param int $post
* @param int $item
*
* @return string
*/
public function loadDown( $post, $item ) {
//* 获取下载地址
$name = ['down-load', 'down-count'];
$data = BaseUtil::getMeta( 'post', $post, $name );
//* 资源下载计数
$data['down-count'] = $data['down-count'] ?: 0;
BaseUtil::updateMeta( 'post', $post, 'down-count', $data['down-count'] + 1 );
//* 用户下载计数
if ( \is_user_logged_in() ) {
$user = \wp_get_current_user();
$count = $user->user_download ?: 0;
//* Util 中 updateMeta 方法会自动添加“_”前缀,此处不能使用。
\update_user_meta( $user->ID, 'user_download', $count + 1 );
}
//* 分解下载地址
$load = trim( $data['down-load'], ',' );
$load = array_reverse( explode( ',', $load ) );
//* 获取单条地址
$split = explode( '|', $load[$item] );
$count = count( $split );
//* 获取文件地址
switch ( $count ) {
//* 单链接
case 1:
$link = trim( $split[0] );
break;
//* 标题和链接
case 2:
$link = trim( $split[1] );
break;
default:
$link = '';
break;
}
return $link;
}
/**
* 加载高速下载
*
* @param string $code
*
* @return string
*/
public function loadFast( $post, $item ) {
//* 获取下载地址
$name = ['down-name', 'down-load', 'down-count'];
$data = BaseUtil::getMeta( 'post', $post, $name );
$data['down-name'] = $data['down-name'] ?: 'Unknown-Name';
$data['down-count'] = $data['down-count'] ?: 0;
//* 资源下载计数
BaseUtil::updateMeta( 'post', $post, 'down-count', $data['down-count'] + 1 );
//* 用户下载计数
if ( \is_user_logged_in() ) {
$user = \wp_get_current_user();
$count = $user->user_download ?: 0;
//* Util 中 updateMeta 方法会自动添加“_”前缀,此处不能使用。
\update_user_meta( $user->ID, 'user_download', $count + 1 );
}
//* 分解下载地址
$load = trim( $data['down-load'], ',' );
$load = array_reverse( explode( ',', $load ) );
//* 获取单条地址
$split = explode( '|', $load[$item] );
$count = count( $split );
//* 获取文件地址
switch ( $count ) {
//* 单链接
case 1:
$fast['name'] = $data['down-name'];
$fast['link'] = trim( $split[0] );
break;
//* 标题和链接
case 2:
$fast['name'] = $data['down-name'] . ' - ' . trim( $split[0] );
$fast['link'] = trim( $split[1] );
break;
default:
$fast['name'] = $data['down-name'];
$fast['link'] = '';
break;
}
return $fast;
}
/**
* 安全下载
*
* @param string $link
*/
public function safeDown( $link ) {
//* 输出文件内容
if ( $link !== '' ) {
//* 获取数据
$file = \esc_url( $link );
$name = basename( $file ) ?? '';
$size = get_headers( $file, true )['Content-Length'] ?? '';
//* 输出 HTTP 头
header( 'Content-Description: File Transfer' );
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename=' . $name );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-length: ' . $size );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Pragma: public' );
//* 清空缓冲区
ob_clean();
//* 清除缓存
flush();
//* 输出文件
readfile( $file );
exit;
} else {
echo ( '下载地址错误!' );
}
}
}
初始发布:2025年11月11日
TAGS:无标签
下个内容
还没有任何评论!