mirror of
https://gitee.com/ledc/IYUUAutoReseed
synced 2025-05-31 05:55:22 +00:00
使用php-cs-fixer更新代码格式
This commit is contained in:
parent
7a41449855
commit
7315524056
2
.gitignore
vendored
2
.gitignore
vendored
@ -3,4 +3,4 @@
|
||||
/php-7.2.12-nts
|
||||
/*.bat
|
||||
/*.sh
|
||||
/vendor
|
||||
/vendor
|
||||
|
@ -2,23 +2,24 @@
|
||||
/**
|
||||
* 调试函数
|
||||
*/
|
||||
function p($data, $echo=true){
|
||||
$str='******************************'."\n";
|
||||
// 如果是boolean或者null直接显示文字;否则print
|
||||
if (is_bool($data)) {
|
||||
$show_data=$data ? 'true' : 'false';
|
||||
}elseif (is_null($data)) {
|
||||
$show_data='null';
|
||||
}else{
|
||||
$show_data=print_r($data,true);
|
||||
}
|
||||
$str.=$show_data;
|
||||
$str.="\n".'******************************'."\n";
|
||||
if($echo){
|
||||
echo $str;
|
||||
return null;
|
||||
}
|
||||
return $str;
|
||||
function p($data, $echo=true)
|
||||
{
|
||||
$str='******************************'."\n";
|
||||
// 如果是boolean或者null直接显示文字;否则print
|
||||
if (is_bool($data)) {
|
||||
$show_data=$data ? 'true' : 'false';
|
||||
} elseif (is_null($data)) {
|
||||
$show_data='null';
|
||||
} else {
|
||||
$show_data=print_r($data, true);
|
||||
}
|
||||
$str.=$show_data;
|
||||
$str.="\n".'******************************'."\n";
|
||||
if ($echo) {
|
||||
echo $str;
|
||||
return null;
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -26,21 +27,21 @@ function p($data, $echo=true){
|
||||
*/
|
||||
function sc($text='', $desp='')
|
||||
{
|
||||
global $configALL;
|
||||
$token = $configALL['sc.ftqq.com'];
|
||||
$desp = ($desp=='')?date("Y-m-d H:i:s") :$desp;
|
||||
$postdata = http_build_query(array(
|
||||
'text' => $text,
|
||||
'desp' => $desp
|
||||
));
|
||||
$opts = array('http' => array(
|
||||
'method' => 'POST',
|
||||
'header' => 'Content-type: application/x-www-form-urlencoded',
|
||||
'content' => $postdata
|
||||
));
|
||||
$context = stream_context_create($opts);
|
||||
$result = file_get_contents('http://sc.ftqq.com/'.$token.'.send', false, $context);
|
||||
return $result;
|
||||
global $configALL;
|
||||
$token = $configALL['sc.ftqq.com'];
|
||||
$desp = ($desp=='')?date("Y-m-d H:i:s") :$desp;
|
||||
$postdata = http_build_query(array(
|
||||
'text' => $text,
|
||||
'desp' => $desp
|
||||
));
|
||||
$opts = array('http' => array(
|
||||
'method' => 'POST',
|
||||
'header' => 'Content-type: application/x-www-form-urlencoded',
|
||||
'content' => $postdata
|
||||
));
|
||||
$context = stream_context_create($opts);
|
||||
$result = file_get_contents('http://sc.ftqq.com/'.$token.'.send', false, $context);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -48,72 +49,72 @@ function sc($text='', $desp='')
|
||||
*/
|
||||
function ff($text='', $desp='')
|
||||
{
|
||||
global $configALL;
|
||||
$token = $configALL['iyuu.cn'];
|
||||
$desp = ($desp=='')?date("Y-m-d H:i:s") :$desp;
|
||||
$postdata = http_build_query(array(
|
||||
'text' => $text,
|
||||
'desp' => $desp
|
||||
));
|
||||
$opts = array('http' => array(
|
||||
'method' => 'POST',
|
||||
'header' => 'Content-type: application/x-www-form-urlencoded',
|
||||
'content' => $postdata
|
||||
));
|
||||
$context = stream_context_create($opts);
|
||||
$result = file_get_contents('http://iyuu.cn/'.$token.'.send', false, $context);
|
||||
return $result;
|
||||
global $configALL;
|
||||
$token = $configALL['iyuu.cn'];
|
||||
$desp = ($desp=='')?date("Y-m-d H:i:s") :$desp;
|
||||
$postdata = http_build_query(array(
|
||||
'text' => $text,
|
||||
'desp' => $desp
|
||||
));
|
||||
$opts = array('http' => array(
|
||||
'method' => 'POST',
|
||||
'header' => 'Content-type: application/x-www-form-urlencoded',
|
||||
'content' => $postdata
|
||||
));
|
||||
$context = stream_context_create($opts);
|
||||
$result = file_get_contents('http://iyuu.cn/'.$token.'.send', false, $context);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信推送 爱语飞飞
|
||||
* @param array $torrent 种子数组
|
||||
Array
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDSTV
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://xxx.me/details.php?id=118632
|
||||
[download] => https://xxx.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
Array
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDSTV
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://xxx.me/details.php?id=118632
|
||||
[download] => https://xxx.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
*/
|
||||
function send($site = '', $torrent = array())
|
||||
{
|
||||
$br = "\r\n";
|
||||
$text = $site. ' 免费:' .$torrent['filename']. ',添加成功';
|
||||
$desp = '主标题:'.$torrent['h1'] . $br;
|
||||
$br = "\r\n";
|
||||
$text = $site. ' 免费:' .$torrent['filename']. ',添加成功';
|
||||
$desp = '主标题:'.$torrent['h1'] . $br;
|
||||
|
||||
if ( isset($torrent['title']) ) {
|
||||
$desp .= '副标题:'.$torrent['title']. $br;
|
||||
}
|
||||
if ( isset($torrent['size']) ) {
|
||||
$desp .= '大小:'.$torrent['size']. $br;
|
||||
}
|
||||
if ( isset($torrent['seeders']) ) {
|
||||
$desp .= '做种数:'.$torrent['seeders']. $br;
|
||||
}
|
||||
if ( isset($torrent['leechers']) ) {
|
||||
$desp .= '下载数:'.$torrent['leechers']. $br;
|
||||
}
|
||||
if ( isset($torrent['owner']) ) {
|
||||
$desp .= '发布者:'.$torrent['owner']. $br;
|
||||
}
|
||||
return ff($text, $desp);
|
||||
if (isset($torrent['title'])) {
|
||||
$desp .= '副标题:'.$torrent['title']. $br;
|
||||
}
|
||||
if (isset($torrent['size'])) {
|
||||
$desp .= '大小:'.$torrent['size']. $br;
|
||||
}
|
||||
if (isset($torrent['seeders'])) {
|
||||
$desp .= '做种数:'.$torrent['seeders']. $br;
|
||||
}
|
||||
if (isset($torrent['leechers'])) {
|
||||
$desp .= '下载数:'.$torrent['leechers']. $br;
|
||||
}
|
||||
if (isset($torrent['owner'])) {
|
||||
$desp .= '发布者:'.$torrent['owner']. $br;
|
||||
}
|
||||
return ff($text, $desp);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -124,34 +125,34 @@ function send($site = '', $torrent = array())
|
||||
*/
|
||||
function download($url, $cookies, $useragent, $method = 'GET')
|
||||
{
|
||||
$header = array(
|
||||
"Content-Type:application/x-www-form-urlencoded",
|
||||
'User-Agent: '.$useragent);
|
||||
$ch = curl_init();
|
||||
if($method === 'POST'){
|
||||
curl_setopt($ch, CURLOPT_POST, true );
|
||||
}
|
||||
if(stripos($url, 'https://') !== FALSE) {
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
|
||||
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
|
||||
}
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
|
||||
curl_setopt($ch, CURLOPT_COOKIE,$cookies);
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,60);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT,600);
|
||||
$data = curl_exec($ch);
|
||||
$status = curl_getinfo($ch);
|
||||
curl_close($ch);
|
||||
if (isset($status['http_code']) && $status['http_code'] == 200) {
|
||||
return $data;
|
||||
}
|
||||
if (isset($status['http_code']) && $status['http_code'] == 302) {
|
||||
return download($status['redirect_url'], $cookies, $useragent);
|
||||
}
|
||||
return $data;
|
||||
$header = array(
|
||||
"Content-Type:application/x-www-form-urlencoded",
|
||||
'User-Agent: '.$useragent);
|
||||
$ch = curl_init();
|
||||
if ($method === 'POST') {
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
}
|
||||
if (stripos($url, 'https://') !== false) {
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
|
||||
}
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
|
||||
curl_setopt($ch, CURLOPT_COOKIE, $cookies);
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 600);
|
||||
$data = curl_exec($ch);
|
||||
$status = curl_getinfo($ch);
|
||||
curl_close($ch);
|
||||
if (isset($status['http_code']) && $status['http_code'] == 200) {
|
||||
return $data;
|
||||
}
|
||||
if (isset($status['http_code']) && $status['http_code'] == 302) {
|
||||
return download($status['redirect_url'], $cookies, $useragent);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -159,19 +160,20 @@ function download($url, $cookies, $useragent, $method = 'GET')
|
||||
* @param string $from 文件大小
|
||||
* @return int 单位MB
|
||||
*/
|
||||
function convertToMB($from){
|
||||
$number=substr($from,0,-2);
|
||||
switch(strtoupper(substr($from,-2))){
|
||||
function convertToMB($from)
|
||||
{
|
||||
$number=substr($from, 0, -2);
|
||||
switch (strtoupper(substr($from, -2))) {
|
||||
case "KB":
|
||||
return $number/1024;
|
||||
case "MB":
|
||||
return $number;
|
||||
case "GB":
|
||||
return $number*pow(1024,1);
|
||||
return $number*pow(1024, 1);
|
||||
case "TB":
|
||||
return $number*pow(1024,2);
|
||||
return $number*pow(1024, 2);
|
||||
case "PB":
|
||||
return $number*pow(1024,3);
|
||||
return $number*pow(1024, 3);
|
||||
default:
|
||||
return $from;
|
||||
}
|
||||
@ -182,91 +184,92 @@ function convertToMB($from){
|
||||
* @param string $site 站点标识
|
||||
* @param array $torrent 种子数组
|
||||
* Array
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDSTV
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://xxx.me/details.php?id=118632
|
||||
[download] => https://xxx.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDSTV
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://xxx.me/details.php?id=118632
|
||||
[download] => https://xxx.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
* @return bool 或 string false不过滤
|
||||
*/
|
||||
function filter($site = '', $torrent = array()){
|
||||
global $configALL;
|
||||
$config = $configALL[$site];
|
||||
$filter = array();
|
||||
// 读取配置
|
||||
if (isset($configALL['default']['filter']) || isset($config['filter'])) {
|
||||
$filter = isset($config['filter']) && $config['filter'] ? $config['filter'] : $configALL['default']['filter'];
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
$filename = $torrent['filename'];
|
||||
function filter($site = '', $torrent = array())
|
||||
{
|
||||
global $configALL;
|
||||
$config = $configALL[$site];
|
||||
$filter = array();
|
||||
// 读取配置
|
||||
if (isset($configALL['default']['filter']) || isset($config['filter'])) {
|
||||
$filter = isset($config['filter']) && $config['filter'] ? $config['filter'] : $configALL['default']['filter'];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
$filename = $torrent['filename'];
|
||||
|
||||
// 兼容性
|
||||
if ( empty($torrent['size']) ) {
|
||||
return false;
|
||||
}
|
||||
// 大小过滤
|
||||
$size = convertToMB($torrent['size']);
|
||||
$min = isset($filter['size']['min']) ? convertToMB($filter['size']['min']) : 0;
|
||||
$max = isset($filter['size']['max']) ? convertToMB($filter['size']['max']) : 2097152; //默认 2097152MB = 2TB
|
||||
if ($min > $size || $size > $max) {
|
||||
return $filename. ' ' .$size. 'MB,被大小过滤';
|
||||
}
|
||||
// 兼容性
|
||||
if (empty($torrent['size'])) {
|
||||
return false;
|
||||
}
|
||||
// 大小过滤
|
||||
$size = convertToMB($torrent['size']);
|
||||
$min = isset($filter['size']['min']) ? convertToMB($filter['size']['min']) : 0;
|
||||
$max = isset($filter['size']['max']) ? convertToMB($filter['size']['max']) : 2097152; //默认 2097152MB = 2TB
|
||||
if ($min > $size || $size > $max) {
|
||||
return $filename. ' ' .$size. 'MB,被大小过滤';
|
||||
}
|
||||
|
||||
// 兼容性
|
||||
if ( empty($torrent['seeders']) ) {
|
||||
return false;
|
||||
}
|
||||
// 种子数过滤
|
||||
$seeders = $torrent['seeders'];
|
||||
$min = isset($filter['seeders']['min']) ? $filter['seeders']['min'] : 1; //默认 1
|
||||
$max = isset($filter['seeders']['max']) ? $filter['seeders']['max'] : 3; //默认 3
|
||||
if ($min > $seeders || $seeders > $max) {
|
||||
return $filename. ' 当前做种' .$seeders. '人,被过滤';
|
||||
}
|
||||
// 兼容性
|
||||
if (empty($torrent['seeders'])) {
|
||||
return false;
|
||||
}
|
||||
// 种子数过滤
|
||||
$seeders = $torrent['seeders'];
|
||||
$min = isset($filter['seeders']['min']) ? $filter['seeders']['min'] : 1; //默认 1
|
||||
$max = isset($filter['seeders']['max']) ? $filter['seeders']['max'] : 3; //默认 3
|
||||
if ($min > $seeders || $seeders > $max) {
|
||||
return $filename. ' 当前做种' .$seeders. '人,被过滤';
|
||||
}
|
||||
|
||||
// 兼容性
|
||||
if ( empty($torrent['leechers']) ) {
|
||||
return false;
|
||||
}
|
||||
// 下载数过滤
|
||||
$leechers = $torrent['leechers'];
|
||||
$min = isset($filter['leechers']['min']) ? $filter['leechers']['min'] : 0; //默认
|
||||
$max = isset($filter['leechers']['max']) ? $filter['leechers']['max'] : 30000; //默认
|
||||
if ($min > $leechers || $leechers > $max) {
|
||||
return $filename. ' 当前下载' .$leechers. '人,被过滤';
|
||||
}
|
||||
// 兼容性
|
||||
if (empty($torrent['leechers'])) {
|
||||
return false;
|
||||
}
|
||||
// 下载数过滤
|
||||
$leechers = $torrent['leechers'];
|
||||
$min = isset($filter['leechers']['min']) ? $filter['leechers']['min'] : 0; //默认
|
||||
$max = isset($filter['leechers']['max']) ? $filter['leechers']['max'] : 30000; //默认
|
||||
if ($min > $leechers || $leechers > $max) {
|
||||
return $filename. ' 当前下载' .$leechers. '人,被过滤';
|
||||
}
|
||||
|
||||
// 兼容性
|
||||
if ( empty($torrent['completed']) ) {
|
||||
return false;
|
||||
}
|
||||
// 完成数过滤
|
||||
$completed = $torrent['completed'];
|
||||
$min = isset($filter['completed']['min']) ? $filter['completed']['min'] : 0; //默认
|
||||
$max = isset($filter['completed']['max']) ? $filter['completed']['max'] : 30000; //默认
|
||||
if ($min > $completed || $completed > $max) {
|
||||
return $filename. ' 已完成数' .$completed. '人,被过滤';
|
||||
}
|
||||
// 兼容性
|
||||
if (empty($torrent['completed'])) {
|
||||
return false;
|
||||
}
|
||||
// 完成数过滤
|
||||
$completed = $torrent['completed'];
|
||||
$min = isset($filter['completed']['min']) ? $filter['completed']['min'] : 0; //默认
|
||||
$max = isset($filter['completed']['max']) ? $filter['completed']['max'] : 30000; //默认
|
||||
if ($min > $completed || $completed > $max) {
|
||||
return $filename. ' 已完成数' .$completed. '人,被过滤';
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -284,22 +287,23 @@ function oddFilter($var)
|
||||
*/
|
||||
function evenFilter($var)
|
||||
{
|
||||
// 返回$var最后一个二进制位,
|
||||
// 返回$var最后一个二进制位,
|
||||
// 为0则保留(偶数的二进制的最后一位肯定是0)
|
||||
return(!($var & 1));
|
||||
return(!($var & 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布员签名
|
||||
* 注意:同时配置iyuu.cn与secret时,优先使用secret。
|
||||
*/
|
||||
function sign( $timestamp ){
|
||||
global $configALL;
|
||||
// 爱语飞飞
|
||||
$token = isset($configALL['iyuu.cn']) && $configALL['iyuu.cn'] ? $configALL['iyuu.cn'] : '';
|
||||
// 鉴权
|
||||
$token = isset($configALL['secret']) && $configALL['secret'] ? $configALL['secret'] : $token;
|
||||
return sha1($timestamp . $token);
|
||||
function sign($timestamp)
|
||||
{
|
||||
global $configALL;
|
||||
// 爱语飞飞
|
||||
$token = isset($configALL['iyuu.cn']) && $configALL['iyuu.cn'] ? $configALL['iyuu.cn'] : '';
|
||||
// 鉴权
|
||||
$token = isset($configALL['secret']) && $configALL['secret'] ? $configALL['secret'] : $token;
|
||||
return sha1($timestamp . $token);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -307,7 +311,8 @@ function sign( $timestamp ){
|
||||
* token算法:IYUU + uid + T + sha1(openid+time+盐)
|
||||
* @param string $token 用户请求token
|
||||
*/
|
||||
function getUid($token){
|
||||
//验证是否IYUU开头,strpos($token,'T')<15,token总长度小于60(40+10+5)
|
||||
return (strlen($token)<60)&&(strpos($token,'IYUU')===0)&&(strpos($token,'T')<15) ? substr($token,4,strpos($token,'T')-4): false;
|
||||
function getUid($token)
|
||||
{
|
||||
//验证是否IYUU开头,strpos($token,'T')<15,token总长度小于60(40+10+5)
|
||||
return (strlen($token)<60)&&(strpos($token, 'IYUU')===0)&&(strpos($token, 'T')<15) ? substr($token, 4, strpos($token, 'T')-4): false;
|
||||
}
|
||||
|
@ -10,323 +10,290 @@
|
||||
*/
|
||||
class IFile
|
||||
{
|
||||
private $resource = null; //文件资源句柄
|
||||
private $resource = null; //文件资源句柄
|
||||
|
||||
/**
|
||||
* @brief 构造函数,打开资源流,并独占锁定
|
||||
* @param String $fileName 文件路径名
|
||||
* @param String $mode 操作方式,默认为读操作,可供选择的项为:r,r+,w+,w+,a,a+
|
||||
* @note $mod,'r' 只读方式打开,将文件指针指向文件头
|
||||
* 'r+' 读写方式打开,将文件指针指向文件头
|
||||
* 'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
|
||||
* 'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
|
||||
* 'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
|
||||
* 'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
|
||||
*/
|
||||
function __construct($fileName,$mode='r')
|
||||
{
|
||||
$dirName = dirname($fileName);
|
||||
$baseName = basename($fileName);
|
||||
/**
|
||||
* @brief 构造函数,打开资源流,并独占锁定
|
||||
* @param String $fileName 文件路径名
|
||||
* @param String $mode 操作方式,默认为读操作,可供选择的项为:r,r+,w+,w+,a,a+
|
||||
* @note $mod,'r' 只读方式打开,将文件指针指向文件头
|
||||
* 'r+' 读写方式打开,将文件指针指向文件头
|
||||
* 'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
|
||||
* 'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
|
||||
* 'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
|
||||
* 'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
|
||||
*/
|
||||
public function __construct($fileName, $mode='r')
|
||||
{
|
||||
$dirName = dirname($fileName);
|
||||
$baseName = basename($fileName);
|
||||
|
||||
//检查并创建文件夹
|
||||
self::mkdir($dirName);
|
||||
//检查并创建文件夹
|
||||
self::mkdir($dirName);
|
||||
|
||||
$this->resource = fopen($fileName,$mode.'b');
|
||||
if($this->resource)
|
||||
{
|
||||
flock($this->resource,LOCK_EX);
|
||||
}
|
||||
}
|
||||
$this->resource = fopen($fileName, $mode.'b');
|
||||
if ($this->resource) {
|
||||
flock($this->resource, LOCK_EX);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取文件内容
|
||||
* @return String 文件内容
|
||||
*/
|
||||
public function read()
|
||||
{
|
||||
$content = null;
|
||||
while(!feof($this->resource))
|
||||
{
|
||||
$content.= fread($this->resource,1024);
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
/**
|
||||
* @brief 获取文件内容
|
||||
* @return String 文件内容
|
||||
*/
|
||||
public function read()
|
||||
{
|
||||
$content = null;
|
||||
while (!feof($this->resource)) {
|
||||
$content.= fread($this->resource, 1024);
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 文件写入操作
|
||||
* @param String $content 要写入的文件内容
|
||||
* @return Int or false 写入的字符数; false:写入失败;
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
$worldsnum = fwrite($this->resource,$content);
|
||||
$this->save();
|
||||
return is_bool($worldsnum) ? false : $worldsnum;
|
||||
}
|
||||
/**
|
||||
* @brief 文件写入操作
|
||||
* @param String $content 要写入的文件内容
|
||||
* @return Int or false 写入的字符数; false:写入失败;
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
$worldsnum = fwrite($this->resource, $content);
|
||||
$this->save();
|
||||
return is_bool($worldsnum) ? false : $worldsnum;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 清空目录下的所有文件
|
||||
* @return bool false:失败; true:成功;
|
||||
*/
|
||||
public static function clearDir($dir)
|
||||
{
|
||||
if($dir[0] != '.' && is_dir($dir) && is_writable($dir))
|
||||
{
|
||||
$dirRes = opendir($dir);
|
||||
while( false !== ($fileName = readdir($dirRes)) )
|
||||
{
|
||||
if($fileName[0] !== '.')
|
||||
{
|
||||
$fullpath = $dir.'/'.$fileName;
|
||||
if(is_file($fullpath))
|
||||
{
|
||||
self::unlink($fullpath);
|
||||
}
|
||||
else
|
||||
{
|
||||
self::clearDir($fullpath);
|
||||
rmdir($fullpath);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dirRes);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 清空目录下的所有文件
|
||||
* @return bool false:失败; true:成功;
|
||||
*/
|
||||
public static function clearDir($dir)
|
||||
{
|
||||
if ($dir[0] != '.' && is_dir($dir) && is_writable($dir)) {
|
||||
$dirRes = opendir($dir);
|
||||
while (false !== ($fileName = readdir($dirRes))) {
|
||||
if ($fileName[0] !== '.') {
|
||||
$fullpath = $dir.'/'.$fileName;
|
||||
if (is_file($fullpath)) {
|
||||
self::unlink($fullpath);
|
||||
} else {
|
||||
self::clearDir($fullpath);
|
||||
rmdir($fullpath);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dirRes);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取文件信息
|
||||
* @param String $fileName 文件路径
|
||||
* @return array or null array:文件信息; null:文件不存在;
|
||||
*/
|
||||
public static function getInfo($fileName)
|
||||
{
|
||||
if(is_file($fileName))
|
||||
return stat($fileName);
|
||||
/**
|
||||
* @brief 获取文件信息
|
||||
* @param String $fileName 文件路径
|
||||
* @return array or null array:文件信息; null:文件不存在;
|
||||
*/
|
||||
public static function getInfo($fileName)
|
||||
{
|
||||
if (is_file($fileName)) {
|
||||
return stat($fileName);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* @brief 创建文件夹
|
||||
* @param String $path 路径
|
||||
* @param int $chmod 文件夹权限
|
||||
* @note $chmod 参数不能是字符串(加引号),否则linux会出现权限问题
|
||||
*/
|
||||
public static function mkdir($path, $chmod=0777)
|
||||
{
|
||||
return is_dir($path) or (self::mkdir(dirname($path), $chmod) and mkdir($path, $chmod));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 创建文件夹
|
||||
* @param String $path 路径
|
||||
* @param int $chmod 文件夹权限
|
||||
* @note $chmod 参数不能是字符串(加引号),否则linux会出现权限问题
|
||||
*/
|
||||
public static function mkdir($path,$chmod=0777)
|
||||
{
|
||||
return is_dir($path) or (self::mkdir(dirname($path),$chmod) and mkdir($path,$chmod));
|
||||
}
|
||||
/**
|
||||
* @brief 复制文件
|
||||
* @param String $from 源文件路径
|
||||
* @param String $to 目标文件路径
|
||||
* @param String $mod 操作模式,c:复制(默认); x:剪切(删除$from文件)
|
||||
* @return bool 操作结果 true:成功; false:失败;
|
||||
*/
|
||||
public static function copy($from, $to, $mode = 'c')
|
||||
{
|
||||
$dir = dirname($to);
|
||||
|
||||
/**
|
||||
* @brief 复制文件
|
||||
* @param String $from 源文件路径
|
||||
* @param String $to 目标文件路径
|
||||
* @param String $mod 操作模式,c:复制(默认); x:剪切(删除$from文件)
|
||||
* @return bool 操作结果 true:成功; false:失败;
|
||||
*/
|
||||
public static function copy($from,$to,$mode = 'c')
|
||||
{
|
||||
$dir = dirname($to);
|
||||
//创建目录
|
||||
self::mkdir($dir);
|
||||
|
||||
//创建目录
|
||||
self::mkdir($dir);
|
||||
copy($from, $to);
|
||||
|
||||
copy($from,$to);
|
||||
if (is_file($to)) {
|
||||
if ($mode == 'x') {
|
||||
self::unlink($from);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(is_file($to))
|
||||
{
|
||||
if($mode == 'x')
|
||||
{
|
||||
self::unlink($from);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 删除文件
|
||||
* @param String $fileName 文件路径
|
||||
* @return bool 操作结果 false:删除失败;
|
||||
*/
|
||||
public static function unlink($fileName)
|
||||
{
|
||||
if (is_file($fileName) && is_writable($fileName)) {
|
||||
return unlink($fileName);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 删除文件
|
||||
* @param String $fileName 文件路径
|
||||
* @return bool 操作结果 false:删除失败;
|
||||
*/
|
||||
public static function unlink($fileName)
|
||||
{
|
||||
if(is_file($fileName) && is_writable($fileName))
|
||||
{
|
||||
return unlink($fileName);
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* @brief 删除$dir文件夹 或者 其下所有文件
|
||||
* @param String $dir 文件路径
|
||||
* @param bool $recursive 是否强制删除,如果强制删除则递归删除该目录下的全部文件,默认为false
|
||||
* @return bool true:删除成功; false:删除失败;
|
||||
*/
|
||||
public static function rmdir($dir, $recursive = false)
|
||||
{
|
||||
if (is_dir($dir) && is_writable($dir)) {
|
||||
//强制删除
|
||||
if ($recursive == true) {
|
||||
self::clearDir($dir);
|
||||
return self::rmdir($dir, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 删除$dir文件夹 或者 其下所有文件
|
||||
* @param String $dir 文件路径
|
||||
* @param bool $recursive 是否强制删除,如果强制删除则递归删除该目录下的全部文件,默认为false
|
||||
* @return bool true:删除成功; false:删除失败;
|
||||
*/
|
||||
public static function rmdir($dir,$recursive = false)
|
||||
{
|
||||
if(is_dir($dir) && is_writable($dir))
|
||||
{
|
||||
//强制删除
|
||||
if($recursive == true)
|
||||
{
|
||||
self::clearDir($dir);
|
||||
return self::rmdir($dir,false);
|
||||
}
|
||||
//非强制删除
|
||||
else {
|
||||
if (rmdir($dir)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//非强制删除
|
||||
else
|
||||
{
|
||||
if(rmdir($dir))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 获取文件类型
|
||||
* @param String $fileName 文件名
|
||||
* @return String $filetype 文件类型
|
||||
* @note 如果文件不存在,返回false,如果文件后缀名不在识别列表之内,返回NULL,对于docx及elsx格式文档识别在会出现识别为ZIP格式的错误,这是office2007的bug目前尚未修复,请谨慎使用
|
||||
*/
|
||||
public static function getFileType($fileName)
|
||||
{
|
||||
$filetype = null;
|
||||
if (!is_file($fileName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取文件类型
|
||||
* @param String $fileName 文件名
|
||||
* @return String $filetype 文件类型
|
||||
* @note 如果文件不存在,返回false,如果文件后缀名不在识别列表之内,返回NULL,对于docx及elsx格式文档识别在会出现识别为ZIP格式的错误,这是office2007的bug目前尚未修复,请谨慎使用
|
||||
*/
|
||||
public static function getFileType($fileName)
|
||||
{
|
||||
$filetype = null;
|
||||
if(!is_file($fileName))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$fileRes = fopen($fileName,"rb");
|
||||
if(!$fileRes)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$fileRes = fopen($fileName, "rb");
|
||||
if (!$fileRes) {
|
||||
return false;
|
||||
}
|
||||
$bin= fread($fileRes, 2);
|
||||
fclose($fileRes);
|
||||
|
||||
if($bin != null)
|
||||
{
|
||||
$strInfo = unpack("C2chars", $bin);
|
||||
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
|
||||
$typelist = self::getTypeList();
|
||||
foreach($typelist as $val)
|
||||
{
|
||||
if(strtolower($val[0]) == strtolower($typeCode))
|
||||
{
|
||||
if($val[0] == 8075)
|
||||
{
|
||||
return array('zip','docx','xlsx');
|
||||
}
|
||||
else
|
||||
{
|
||||
return $val[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($bin != null) {
|
||||
$strInfo = unpack("C2chars", $bin);
|
||||
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
|
||||
$typelist = self::getTypeList();
|
||||
foreach ($typelist as $val) {
|
||||
if (strtolower($val[0]) == strtolower($typeCode)) {
|
||||
if ($val[0] == 8075) {
|
||||
return array('zip','docx','xlsx');
|
||||
} else {
|
||||
return $val[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $filetype;
|
||||
}
|
||||
return $filetype;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取文件类型映射关系
|
||||
/**
|
||||
* @brief 获取文件类型映射关系
|
||||
* @return array 文件类型映射关系数组
|
||||
*/
|
||||
public static function getTypeList()
|
||||
{
|
||||
return array(
|
||||
array('255216','jpg'),
|
||||
array('13780','png'),
|
||||
array('7173','gif'),
|
||||
array('6677','bmp'),
|
||||
array('6063','xml'),
|
||||
array('60104','html'),
|
||||
array('208207','xls/doc'),
|
||||
array('8075','zip'),
|
||||
array('8075','docx'),
|
||||
array('8075','xlsx'),
|
||||
array("8297","rar"),
|
||||
);
|
||||
return array(
|
||||
array('255216','jpg'),
|
||||
array('13780','png'),
|
||||
array('7173','gif'),
|
||||
array('6677','bmp'),
|
||||
array('6063','xml'),
|
||||
array('60104','html'),
|
||||
array('208207','xls/doc'),
|
||||
array('8075','zip'),
|
||||
array('8075','docx'),
|
||||
array('8075','xlsx'),
|
||||
array("8297","rar"),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取文件大小
|
||||
* @param String $fileName 文件名
|
||||
* @return Int 文件大小的字节数,如果文件无效则返回 NULL
|
||||
*/
|
||||
public static function getFileSize($fileName)
|
||||
{
|
||||
return is_file($fileName) ? filesize($fileName):null;
|
||||
}
|
||||
/**
|
||||
* @brief 获取文件大小
|
||||
* @param String $fileName 文件名
|
||||
* @return Int 文件大小的字节数,如果文件无效则返回 NULL
|
||||
*/
|
||||
public static function getFileSize($fileName)
|
||||
{
|
||||
return is_file($fileName) ? filesize($fileName):null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 检测文件夹是否为空
|
||||
* @param String $dir 路径地址
|
||||
* @return bool true:$dir为空目录; false:$dir为非空目录;
|
||||
*/
|
||||
public static function isEmptyDir($dir)
|
||||
{
|
||||
if(is_dir($dir))
|
||||
{
|
||||
$isEmpty = true;
|
||||
$dirRes = opendir($dir);
|
||||
while(false !== ($fileName = readdir($dirRes)))
|
||||
{
|
||||
if($fileName!='.' && $fileName!='..')
|
||||
{
|
||||
$isEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
closedir($dirRes);
|
||||
return $isEmpty;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 检测文件夹是否为空
|
||||
* @param String $dir 路径地址
|
||||
* @return bool true:$dir为空目录; false:$dir为非空目录;
|
||||
*/
|
||||
public static function isEmptyDir($dir)
|
||||
{
|
||||
if (is_dir($dir)) {
|
||||
$isEmpty = true;
|
||||
$dirRes = opendir($dir);
|
||||
while (false !== ($fileName = readdir($dirRes))) {
|
||||
if ($fileName!='.' && $fileName!='..') {
|
||||
$isEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
closedir($dirRes);
|
||||
return $isEmpty;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 释放文件锁定
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
flock($this->resource,LOCK_UN);
|
||||
}
|
||||
/**
|
||||
* @brief 释放文件锁定
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
flock($this->resource, LOCK_UN);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取文件扩展名
|
||||
* @param String $fileName 文件名
|
||||
* @return String 文件后缀名
|
||||
*/
|
||||
public static function getFileSuffix($fileName)
|
||||
{
|
||||
$fileInfoArray = pathinfo($fileName);
|
||||
return $fileInfoArray['extension'];
|
||||
}
|
||||
/**
|
||||
* @brief 获取文件扩展名
|
||||
* @param String $fileName 文件名
|
||||
* @return String 文件后缀名
|
||||
*/
|
||||
public static function getFileSuffix($fileName)
|
||||
{
|
||||
$fileInfoArray = pathinfo($fileName);
|
||||
return $fileInfoArray['extension'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 析构函数,释放文件连接句柄
|
||||
*/
|
||||
function __destruct()
|
||||
{
|
||||
if(is_resource($this->resource))
|
||||
{
|
||||
fclose($this->resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 析构函数,释放文件连接句柄
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if (is_resource($this->resource)) {
|
||||
fclose($this->resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,9 @@
|
||||
* IYUU用户注册、认证
|
||||
*/
|
||||
use Curl\Curl;
|
||||
class Oauth{
|
||||
|
||||
class Oauth
|
||||
{
|
||||
// 合作的站点
|
||||
public static $sites = ['ourbits'];
|
||||
// 爱语飞飞token
|
||||
@ -17,13 +19,14 @@ class Oauth{
|
||||
/**
|
||||
* 初始化配置
|
||||
*/
|
||||
public static function init(){
|
||||
public static function init()
|
||||
{
|
||||
global $configALL;
|
||||
foreach (self::$sites as $name) {
|
||||
if (isset($configALL[$name]['passkey']) && $configALL[$name]['passkey'] && isset($configALL[$name]['id']) && $configALL[$name]['id'] ) {
|
||||
if (isset($configALL[$name]['passkey']) && $configALL[$name]['passkey'] && isset($configALL[$name]['id']) && $configALL[$name]['id']) {
|
||||
self::$token = self::getSign();
|
||||
self::$user_id = $configALL[$name]['id'];
|
||||
self::$passkey = sha1( $configALL[$name]['passkey'] ); // 避免泄露用户passkey秘钥
|
||||
self::$passkey = sha1($configALL[$name]['passkey']); // 避免泄露用户passkey秘钥
|
||||
self::$site = $name;
|
||||
return true;
|
||||
}
|
||||
@ -35,7 +38,8 @@ class Oauth{
|
||||
/**
|
||||
* 从配置文件内读取爱语飞飞token作为鉴权参数
|
||||
*/
|
||||
public static function getSign(){
|
||||
public static function getSign()
|
||||
{
|
||||
global $configALL;
|
||||
// 爱语飞飞
|
||||
$token = isset($configALL['iyuu.cn']) && $configALL['iyuu.cn'] ? $configALL['iyuu.cn'] : '';
|
||||
@ -51,9 +55,10 @@ class Oauth{
|
||||
* 作用:在服务器端实现微信用户与合作站点用户id的关联
|
||||
* 参数:爱语飞飞token + 合作站点用户id + sha1(合作站点密钥passkey) + 合作站点标识
|
||||
*/
|
||||
public static function login($apiUrl = ''){
|
||||
public static function login($apiUrl = '')
|
||||
{
|
||||
$is_oauth = self::init();
|
||||
if ( $is_oauth ) {
|
||||
if ($is_oauth) {
|
||||
$curl = new Curl();
|
||||
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
|
||||
$data = [
|
||||
@ -66,6 +71,6 @@ class Oauth{
|
||||
p($res->response);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4,78 +4,79 @@
|
||||
*/
|
||||
class Rpc
|
||||
{
|
||||
/**
|
||||
/**
|
||||
* 版本号
|
||||
* @var string
|
||||
*/
|
||||
const VER = '0.0.1';
|
||||
|
||||
// 下载种子的请求类型 GET POST
|
||||
public static $method = 'GET';
|
||||
// RPC连接池
|
||||
public static $links = array();
|
||||
/**
|
||||
// 下载种子的请求类型 GET POST
|
||||
public static $method = 'GET';
|
||||
// RPC连接池
|
||||
public static $links = array();
|
||||
/**
|
||||
* cookie
|
||||
*/
|
||||
public static $cookies = '';
|
||||
/**
|
||||
/**
|
||||
* 浏览器 User-Agent
|
||||
*/
|
||||
public static $userAgent = '';
|
||||
/**
|
||||
/**
|
||||
* passkey
|
||||
*/
|
||||
public static $passkey = '';
|
||||
/**
|
||||
/**
|
||||
* 客户端配置
|
||||
*/
|
||||
public static $clients = '';
|
||||
/**
|
||||
/**
|
||||
* 监控目录
|
||||
*/
|
||||
public static $watch = '';
|
||||
/**
|
||||
/**
|
||||
* 种子存放路径
|
||||
*/
|
||||
public static $torrentDir = '';
|
||||
/**
|
||||
/**
|
||||
* 工作模式
|
||||
*/
|
||||
public static $workingMode = '';
|
||||
// 站点标识
|
||||
public static $site = '';
|
||||
/**
|
||||
// 站点标识
|
||||
public static $site = '';
|
||||
/**
|
||||
* 负载均衡 控制变量
|
||||
*/
|
||||
public static $RPC_Key = 0;
|
||||
/**
|
||||
/**
|
||||
* 退出状态码
|
||||
*/
|
||||
public static $ExitCode = 0;
|
||||
/**
|
||||
public static $ExitCode = 0;
|
||||
/**
|
||||
* 初始化
|
||||
*/
|
||||
public static function init($site = '', $method = 'GET'){
|
||||
global $configALL;
|
||||
public static function init($site = '', $method = 'GET')
|
||||
{
|
||||
global $configALL;
|
||||
|
||||
self::$site = $site;
|
||||
self::$method = strtoupper($method);
|
||||
self::$site = $site;
|
||||
self::$method = strtoupper($method);
|
||||
|
||||
$config = $configALL[$site];
|
||||
self::$cookies = $config['cookie'];
|
||||
self::$userAgent = isset($config['userAgent']) && $config['userAgent'] ? $config['userAgent'] : $configALL['default']['userAgent'];
|
||||
self::$clients = isset($config['clients']) && $config['clients'] ? $config['clients'] : $configALL['default']['clients'];
|
||||
self::$workingMode = isset($config['workingMode']) && $config['workingMode'] ? $config['workingMode'] : 0;
|
||||
$watch = isset($config['watch']) && $config['watch'] ? $config['watch'] : $configALL['default']['watch'];
|
||||
self::$watch = rtrim($watch,'/') . DS;
|
||||
self::$torrentDir = TORRENT_PATH . $site . DS;
|
||||
// 建立目录
|
||||
IFile::mkdir(self::$torrentDir);
|
||||
|
||||
self::links();
|
||||
}
|
||||
$config = $configALL[$site];
|
||||
self::$cookies = $config['cookie'];
|
||||
self::$userAgent = isset($config['userAgent']) && $config['userAgent'] ? $config['userAgent'] : $configALL['default']['userAgent'];
|
||||
self::$clients = isset($config['clients']) && $config['clients'] ? $config['clients'] : $configALL['default']['clients'];
|
||||
self::$workingMode = isset($config['workingMode']) && $config['workingMode'] ? $config['workingMode'] : 0;
|
||||
$watch = isset($config['watch']) && $config['watch'] ? $config['watch'] : $configALL['default']['watch'];
|
||||
self::$watch = rtrim($watch, '/') . DS;
|
||||
self::$torrentDir = TORRENT_PATH . $site . DS;
|
||||
// 建立目录
|
||||
IFile::mkdir(self::$torrentDir);
|
||||
|
||||
self::links();
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 连接远端RPC服务器
|
||||
*
|
||||
* @param string
|
||||
@ -83,140 +84,138 @@ class Rpc
|
||||
*/
|
||||
public static function links()
|
||||
{
|
||||
if(self::$workingMode === 1 && empty(self::$links)){
|
||||
foreach ( self::$clients as $k => $v ){
|
||||
// 跳过未配置的客户端
|
||||
if (empty($v['username']) || empty( $v['password'])) {
|
||||
unset(self::$clients[$k]);
|
||||
echo "clients_".$k." 用户名或密码未配置,已跳过 \n\n";
|
||||
continue;
|
||||
}
|
||||
try
|
||||
{
|
||||
switch($v['type']){
|
||||
case 'transmission':
|
||||
self::$links[$k]['rpc'] = new TransmissionRPC($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->sstats();
|
||||
print $v['type'].':'.$v['host']." Rpc连接成功 [{$result->result}] \n";
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
self::$links[$k]['rpc'] = new qBittorrent($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->appVersion();
|
||||
print $v['type'].':'.$v['host']." Rpc连接成功 [{$result}] \n";
|
||||
break;
|
||||
case 'uTorrent':
|
||||
self::$links[$k]['rpc'] = new uTorrent($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->getBuild();
|
||||
print $v['type'].':'.$v['host']." Rpc连接 [{$result}] \n";
|
||||
break;
|
||||
default:
|
||||
echo '[ERROR] '.$v['type'];
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
self::$links[$k]['type'] = $v['type'];
|
||||
self::$links[$k]['downloadDir'] = $v['downloadDir'];
|
||||
} catch (Exception $e) {
|
||||
echo '[ERROR] ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
if (self::$workingMode === 1 && empty(self::$links)) {
|
||||
foreach (self::$clients as $k => $v) {
|
||||
// 跳过未配置的客户端
|
||||
if (empty($v['username']) || empty($v['password'])) {
|
||||
unset(self::$clients[$k]);
|
||||
echo "clients_".$k." 用户名或密码未配置,已跳过 \n\n";
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
switch ($v['type']) {
|
||||
case 'transmission':
|
||||
self::$links[$k]['rpc'] = new TransmissionRPC($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->sstats();
|
||||
print $v['type'].':'.$v['host']." Rpc连接成功 [{$result->result}] \n";
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
self::$links[$k]['rpc'] = new qBittorrent($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->appVersion();
|
||||
print $v['type'].':'.$v['host']." Rpc连接成功 [{$result}] \n";
|
||||
break;
|
||||
case 'uTorrent':
|
||||
self::$links[$k]['rpc'] = new uTorrent($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->getBuild();
|
||||
print $v['type'].':'.$v['host']." Rpc连接 [{$result}] \n";
|
||||
break;
|
||||
default:
|
||||
echo '[ERROR] '.$v['type'];
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
self::$links[$k]['type'] = $v['type'];
|
||||
self::$links[$k]['downloadDir'] = $v['downloadDir'];
|
||||
} catch (Exception $e) {
|
||||
echo '[ERROR] ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 添加下载任务
|
||||
* @param string $torrent 种子元数据
|
||||
* @param string $save_path 保存路径
|
||||
* @return bool
|
||||
*/
|
||||
/**
|
||||
* @brief 添加下载任务
|
||||
* @param string $torrent 种子元数据
|
||||
* @param string $save_path 保存路径
|
||||
* @return bool
|
||||
*/
|
||||
public static function add($torrent, $save_path = '', $extra_options = array())
|
||||
{
|
||||
switch( (int)self::$workingMode ){
|
||||
case 0: // watch默认工作模式
|
||||
// 复制到watch目录
|
||||
copy($torrent,$save_path);
|
||||
if(is_file($save_path)){
|
||||
print "********watch模式,下载任务添加成功 \n\n";
|
||||
return true;
|
||||
}else {
|
||||
print "-----watch模式,下载任务添加失败!!! \n\n";
|
||||
}
|
||||
break;
|
||||
case 1: //负载均衡模式
|
||||
try
|
||||
{
|
||||
$is_url = false;
|
||||
if( (strpos($torrent,'http://')===0) || (strpos($torrent,'https://')===0) || (strpos($torrent,'magnet:?xt=urn:btih:')===0) ){
|
||||
$is_url = true;
|
||||
}
|
||||
// 负载均衡
|
||||
$rpcKey = self::$RPC_Key;
|
||||
echo '选中:负载均衡'.$rpcKey."\n";
|
||||
self::rpcSelect();
|
||||
// 调试
|
||||
#p($result);
|
||||
// 下载服务器类型 判断
|
||||
$type = self::$links[$rpcKey]['type'];
|
||||
switch($type){
|
||||
case 'transmission':
|
||||
if( $is_url ){
|
||||
echo 'add';
|
||||
$result = self::$links[$rpcKey]['rpc']->add( $torrent, self::$links[$rpcKey]['downloadDir'], $extra_options ); // 种子URL添加下载任务
|
||||
}else{
|
||||
echo 'add_metainfo';
|
||||
$result = self::$links[$rpcKey]['rpc']->add_metainfo( $torrent, self::$links[$rpcKey]['downloadDir'], $extra_options ); // 种子文件添加下载任务
|
||||
}
|
||||
$id = $name = '';
|
||||
if( isset($result->arguments->torrent_duplicate) ){
|
||||
$id = $result->arguments->torrent_duplicate->id;
|
||||
$name = $result->arguments->torrent_duplicate->name;
|
||||
}elseif( isset($result->arguments->torrent_added) ){
|
||||
$id = $result->arguments->torrent_added->id;
|
||||
$name = $result->arguments->torrent_added->name;
|
||||
}
|
||||
if(!$id){
|
||||
print "-----RPC添加种子任务,失败 [{$result->result}] \n\n";
|
||||
}else{
|
||||
print "********RPC添加下载任务成功 [{$result->result}] (id=$id) \n\n";
|
||||
// 新添加的任务,开始
|
||||
self::$links[$rpcKey]['rpc']->start( $id );
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
if( $is_url ){
|
||||
echo 'add';
|
||||
$result = self::$links[$rpcKey]['rpc']->add( $torrent, self::$links[$rpcKey]['downloadDir'], $extra_options ); // 种子URL添加下载任务
|
||||
}else{
|
||||
echo 'add_metainfo';
|
||||
$result = self::$links[$rpcKey]['rpc']->add_metainfo( $torrent, self::$links[$rpcKey]['downloadDir'], $extra_options ); // 种子文件添加下载任务
|
||||
}
|
||||
if ($result === 'Ok.') {
|
||||
print "********RPC添加下载任务成功 [{$result}] \n\n";
|
||||
return true;
|
||||
} else {
|
||||
print "-----RPC添加种子任务,失败 [{$result}] \n\n";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
echo '[ERROR] '.$type;
|
||||
break;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
die('[ERROR] ' . $e->getMessage() . PHP_EOL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
echo "\n\n";
|
||||
# 暂未开放
|
||||
break;
|
||||
default:
|
||||
echo "\n\n";
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
switch ((int)self::$workingMode) {
|
||||
case 0: // watch默认工作模式
|
||||
// 复制到watch目录
|
||||
copy($torrent, $save_path);
|
||||
if (is_file($save_path)) {
|
||||
print "********watch模式,下载任务添加成功 \n\n";
|
||||
return true;
|
||||
} else {
|
||||
print "-----watch模式,下载任务添加失败!!! \n\n";
|
||||
}
|
||||
break;
|
||||
case 1: //负载均衡模式
|
||||
try {
|
||||
$is_url = false;
|
||||
if ((strpos($torrent, 'http://')===0) || (strpos($torrent, 'https://')===0) || (strpos($torrent, 'magnet:?xt=urn:btih:')===0)) {
|
||||
$is_url = true;
|
||||
}
|
||||
// 负载均衡
|
||||
$rpcKey = self::$RPC_Key;
|
||||
echo '选中:负载均衡'.$rpcKey."\n";
|
||||
self::rpcSelect();
|
||||
// 调试
|
||||
#p($result);
|
||||
// 下载服务器类型 判断
|
||||
$type = self::$links[$rpcKey]['type'];
|
||||
switch ($type) {
|
||||
case 'transmission':
|
||||
if ($is_url) {
|
||||
echo 'add';
|
||||
$result = self::$links[$rpcKey]['rpc']->add($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子URL添加下载任务
|
||||
} else {
|
||||
echo 'add_metainfo';
|
||||
$result = self::$links[$rpcKey]['rpc']->add_metainfo($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子文件添加下载任务
|
||||
}
|
||||
$id = $name = '';
|
||||
if (isset($result->arguments->torrent_duplicate)) {
|
||||
$id = $result->arguments->torrent_duplicate->id;
|
||||
$name = $result->arguments->torrent_duplicate->name;
|
||||
} elseif (isset($result->arguments->torrent_added)) {
|
||||
$id = $result->arguments->torrent_added->id;
|
||||
$name = $result->arguments->torrent_added->name;
|
||||
}
|
||||
if (!$id) {
|
||||
print "-----RPC添加种子任务,失败 [{$result->result}] \n\n";
|
||||
} else {
|
||||
print "********RPC添加下载任务成功 [{$result->result}] (id=$id) \n\n";
|
||||
// 新添加的任务,开始
|
||||
self::$links[$rpcKey]['rpc']->start($id);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
if ($is_url) {
|
||||
echo 'add';
|
||||
$result = self::$links[$rpcKey]['rpc']->add($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子URL添加下载任务
|
||||
} else {
|
||||
echo 'add_metainfo';
|
||||
$result = self::$links[$rpcKey]['rpc']->add_metainfo($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子文件添加下载任务
|
||||
}
|
||||
if ($result === 'Ok.') {
|
||||
print "********RPC添加下载任务成功 [{$result}] \n\n";
|
||||
return true;
|
||||
} else {
|
||||
print "-----RPC添加种子任务,失败 [{$result}] \n\n";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
echo '[ERROR] '.$type;
|
||||
break;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
die('[ERROR] ' . $e->getMessage() . PHP_EOL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
echo "\n\n";
|
||||
# 暂未开放
|
||||
break;
|
||||
default:
|
||||
echo "\n\n";
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -227,142 +226,142 @@ class Rpc
|
||||
*/
|
||||
public static function rpcSelect()
|
||||
{
|
||||
$clientsConut = count(self::$clients);
|
||||
if( $clientsConut > 1 ){
|
||||
if( $clientsConut > (self::$RPC_Key+1) ){
|
||||
self::$RPC_Key++;
|
||||
}else{
|
||||
self::$RPC_Key = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 种子处理函数
|
||||
* @param array $data 种子数组
|
||||
* Array
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDxxx
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://XXX.me/details.php?id=118632
|
||||
[download] => https://XXX.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
* @return
|
||||
*/
|
||||
public static function call($data = array())
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
// 控制台打印
|
||||
echo '主标题:'.$value['h1']."\n";
|
||||
echo '副标题:'.$value['title']."\n";
|
||||
echo '详情页:'.$value['details']."\n";
|
||||
if ( $value['type'] != 0 ) {
|
||||
echo "-----非免费,已忽略! \n\n";
|
||||
continue;
|
||||
}
|
||||
if ( isset($value['hr']) && ($value['hr'] == 1) ) {
|
||||
echo "-----HR种子,已忽略! \n\n";
|
||||
continue;
|
||||
}
|
||||
// 下载任务的可选参数
|
||||
$extra_options = array();
|
||||
// 保存的文件名
|
||||
$filename = $value['id'] . '.torrent';
|
||||
// 默认watch工作模式,复制到此目录
|
||||
$to = self::$watch . $filename;
|
||||
// 种子完整存放路径
|
||||
$torrentFile = self::$torrentDir . $filename;
|
||||
if(is_file($torrentFile)){
|
||||
$fileSize = filesize($torrentFile); //失败会返回false 或 0(0代表上次下载失败)
|
||||
if ( !empty($fileSize) ) {
|
||||
//种子已经存在
|
||||
echo '-----存在旧种子:'.$filename."\n\n";
|
||||
continue;
|
||||
}
|
||||
// 删除下载错误的文件
|
||||
IFile::unlink($torrentFile);
|
||||
}
|
||||
|
||||
// 调用过滤函数
|
||||
$isFilter = filter(self::$site, $value);
|
||||
if ( is_string( $isFilter ) ) {
|
||||
echo "-----" .$isFilter. "\n\n";
|
||||
continue;
|
||||
}
|
||||
//种子不存在
|
||||
echo '正在下载新种子... '.$value['download']." \n";
|
||||
// 创建文件、下载种子以二进制写入
|
||||
$content = '';
|
||||
$content = download($value['download'], self::$cookies, self::$userAgent, self::$method);
|
||||
#p($content);
|
||||
// 文件句柄
|
||||
$resource = fopen($torrentFile, "wb");
|
||||
// 成功:返回写入字节数,失败返回false
|
||||
$worldsnum = fwrite($resource, $content);
|
||||
// 关闭
|
||||
fclose($resource);
|
||||
// 判断
|
||||
if(is_bool($worldsnum)){
|
||||
print "种子下载失败!!! \n\n";
|
||||
IFile::unlink($torrentFile);
|
||||
continue;
|
||||
}else{
|
||||
print "成功下载种子" . $filename . ',共计:' . $worldsnum . "字节 \n";
|
||||
sleep(mt_rand(2,10));
|
||||
$ret = false;
|
||||
$rpcKey = self::$RPC_Key;
|
||||
switch( (int)self::$workingMode ){
|
||||
case 0: //默认工作模式
|
||||
$ret = self::add($torrentFile, $to);
|
||||
break;
|
||||
case 1: //负载均衡模式
|
||||
$type = self::$links[$rpcKey]['type'];
|
||||
// 下载服务器类型
|
||||
switch ($type) {
|
||||
case 'transmission':
|
||||
# code...
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
$extra_options['name'] = 'torrents';
|
||||
$extra_options['filename'] = $filename;
|
||||
$extra_options['autoTMM'] = 'false'; //关闭自动种子管理
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
}
|
||||
// 种子文件添加下载任务
|
||||
$ret = self::add($content, $to, $extra_options);
|
||||
break;
|
||||
case 2:
|
||||
echo "\n\n";
|
||||
# 暂未开放
|
||||
break;
|
||||
default:
|
||||
echo "\n\n";
|
||||
break;
|
||||
}
|
||||
global $configALL;
|
||||
if( isset($configALL['iyuu.cn']) && ($ret === true) ){
|
||||
send(self::$site, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
$clientsConut = count(self::$clients);
|
||||
if ($clientsConut > 1) {
|
||||
if ($clientsConut > (self::$RPC_Key+1)) {
|
||||
self::$RPC_Key++;
|
||||
} else {
|
||||
self::$RPC_Key = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 种子处理函数
|
||||
* @param array $data 种子数组
|
||||
* Array
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDxxx
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://XXX.me/details.php?id=118632
|
||||
[download] => https://XXX.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
* @return
|
||||
*/
|
||||
public static function call($data = array())
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
// 控制台打印
|
||||
echo '主标题:'.$value['h1']."\n";
|
||||
echo '副标题:'.$value['title']."\n";
|
||||
echo '详情页:'.$value['details']."\n";
|
||||
if ($value['type'] != 0) {
|
||||
echo "-----非免费,已忽略! \n\n";
|
||||
continue;
|
||||
}
|
||||
if (isset($value['hr']) && ($value['hr'] == 1)) {
|
||||
echo "-----HR种子,已忽略! \n\n";
|
||||
continue;
|
||||
}
|
||||
// 下载任务的可选参数
|
||||
$extra_options = array();
|
||||
// 保存的文件名
|
||||
$filename = $value['id'] . '.torrent';
|
||||
// 默认watch工作模式,复制到此目录
|
||||
$to = self::$watch . $filename;
|
||||
// 种子完整存放路径
|
||||
$torrentFile = self::$torrentDir . $filename;
|
||||
if (is_file($torrentFile)) {
|
||||
$fileSize = filesize($torrentFile); //失败会返回false 或 0(0代表上次下载失败)
|
||||
if (!empty($fileSize)) {
|
||||
//种子已经存在
|
||||
echo '-----存在旧种子:'.$filename."\n\n";
|
||||
continue;
|
||||
}
|
||||
// 删除下载错误的文件
|
||||
IFile::unlink($torrentFile);
|
||||
}
|
||||
|
||||
// 调用过滤函数
|
||||
$isFilter = filter(self::$site, $value);
|
||||
if (is_string($isFilter)) {
|
||||
echo "-----" .$isFilter. "\n\n";
|
||||
continue;
|
||||
}
|
||||
//种子不存在
|
||||
echo '正在下载新种子... '.$value['download']." \n";
|
||||
// 创建文件、下载种子以二进制写入
|
||||
$content = '';
|
||||
$content = download($value['download'], self::$cookies, self::$userAgent, self::$method);
|
||||
#p($content);
|
||||
// 文件句柄
|
||||
$resource = fopen($torrentFile, "wb");
|
||||
// 成功:返回写入字节数,失败返回false
|
||||
$worldsnum = fwrite($resource, $content);
|
||||
// 关闭
|
||||
fclose($resource);
|
||||
// 判断
|
||||
if (is_bool($worldsnum)) {
|
||||
print "种子下载失败!!! \n\n";
|
||||
IFile::unlink($torrentFile);
|
||||
continue;
|
||||
} else {
|
||||
print "成功下载种子" . $filename . ',共计:' . $worldsnum . "字节 \n";
|
||||
sleep(mt_rand(2, 10));
|
||||
$ret = false;
|
||||
$rpcKey = self::$RPC_Key;
|
||||
switch ((int)self::$workingMode) {
|
||||
case 0: //默认工作模式
|
||||
$ret = self::add($torrentFile, $to);
|
||||
break;
|
||||
case 1: //负载均衡模式
|
||||
$type = self::$links[$rpcKey]['type'];
|
||||
// 下载服务器类型
|
||||
switch ($type) {
|
||||
case 'transmission':
|
||||
# code...
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
$extra_options['name'] = 'torrents';
|
||||
$extra_options['filename'] = $filename;
|
||||
$extra_options['autoTMM'] = 'false'; //关闭自动种子管理
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
}
|
||||
// 种子文件添加下载任务
|
||||
$ret = self::add($content, $to, $extra_options);
|
||||
break;
|
||||
case 2:
|
||||
echo "\n\n";
|
||||
# 暂未开放
|
||||
break;
|
||||
default:
|
||||
echo "\n\n";
|
||||
break;
|
||||
}
|
||||
global $configALL;
|
||||
if (isset($configALL['iyuu.cn']) && ($ret === true)) {
|
||||
send(self::$site, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,6 @@
|
||||
<?php
|
||||
use Curl\Curl;
|
||||
|
||||
/**
|
||||
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation
|
||||
*/
|
||||
@ -35,7 +36,7 @@ class qBittorrent
|
||||
'1' => null,
|
||||
'2' => '/api/v2/app/setPreferences'
|
||||
],
|
||||
'defaultSavePath' => [
|
||||
'defaultSavePath' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/app/defaultSavePath'
|
||||
],
|
||||
@ -72,7 +73,7 @@ class qBittorrent
|
||||
public function __construct($url='', $username='', $password='', $api_version = 2, $debug = false)
|
||||
{
|
||||
$this->debug = $debug;
|
||||
$this->url = rtrim($url,'/');
|
||||
$this->url = rtrim($url, '/');
|
||||
$this->username = $username;
|
||||
$this->password = $password;
|
||||
$this->api_version = $api_version;
|
||||
@ -130,29 +131,33 @@ class qBittorrent
|
||||
*/
|
||||
public function add($torrent_url, $save_path = '', $extra_options = array())
|
||||
{
|
||||
if(!empty($save_path)) $extra_options['savepath'] = $save_path;
|
||||
if (!empty($save_path)) {
|
||||
$extra_options['savepath'] = $save_path;
|
||||
}
|
||||
$extra_options['urls'] = $torrent_url;
|
||||
#$extra_options['skip_checking'] = 'true'; //跳校验
|
||||
// 关键 上传文件流 multipart/form-data【严格按照api文档编写】
|
||||
$post_data = $this->buildUrls($extra_options);
|
||||
#p($post_data);
|
||||
// 设置请求头
|
||||
$this->curl->setHeader('Content-Type','multipart/form-data; boundary='.$this->delimiter);
|
||||
$this->curl->setHeader('Content-Length',strlen($post_data));
|
||||
$this->curl->setHeader('Content-Type', 'multipart/form-data; boundary='.$this->delimiter);
|
||||
$this->curl->setHeader('Content-Length', strlen($post_data));
|
||||
return $this->postData('torrent_add', $post_data);
|
||||
}
|
||||
|
||||
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
|
||||
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
|
||||
{
|
||||
if(!empty($save_path)) $extra_options['savepath'] = $save_path;
|
||||
if (!empty($save_path)) {
|
||||
$extra_options['savepath'] = $save_path;
|
||||
}
|
||||
$extra_options['torrents'] = $torrent_metainfo;
|
||||
#$extra_options['skip_checking'] = 'true'; //跳校验
|
||||
// 关键 上传文件流 multipart/form-data【严格按照api文档编写】
|
||||
$post_data = $this->buildData($extra_options);
|
||||
#p($post_data);
|
||||
// 设置请求头
|
||||
$this->curl->setHeader('Content-Type','multipart/form-data; boundary='.$this->delimiter);
|
||||
$this->curl->setHeader('Content-Length',strlen($post_data));
|
||||
$this->curl->setHeader('Content-Type', 'multipart/form-data; boundary='.$this->delimiter);
|
||||
$this->curl->setHeader('Content-Length', strlen($post_data));
|
||||
return $this->postData('torrent_add', $post_data);
|
||||
}
|
||||
|
||||
@ -250,7 +255,8 @@ class qBittorrent
|
||||
* 拼接种子urls multipart/form-data
|
||||
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
|
||||
*/
|
||||
private function buildUrls($param){
|
||||
private function buildUrls($param)
|
||||
{
|
||||
$this->delimiter = uniqid();
|
||||
$eol = "\r\n";
|
||||
$data = '';
|
||||
@ -267,7 +273,8 @@ class qBittorrent
|
||||
* 拼接种子上传文件流 multipart/form-data
|
||||
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
|
||||
*/
|
||||
private function buildData($param){
|
||||
private function buildData($param)
|
||||
{
|
||||
$this->delimiter = uniqid();
|
||||
$eol = "\r\n";
|
||||
$data = '';
|
||||
|
@ -29,7 +29,8 @@ define("UTORRENT_STATUS_STARTED", 1);
|
||||
define("UTORRENT_STATUS_CHECKED", 2);
|
||||
define("UTORRENT_STATUS_START_AFTER_CHECK", 4);
|
||||
|
||||
class uTorrent {
|
||||
class uTorrent
|
||||
{
|
||||
// class static variables
|
||||
private static $base = "%s/gui/%s";
|
||||
|
||||
@ -42,8 +43,9 @@ class uTorrent {
|
||||
protected $guid;
|
||||
|
||||
// constructor
|
||||
function __construct($host = "", $user = "", $pass = "") {
|
||||
$this->host = rtrim($host,'/');
|
||||
public function __construct($host = "", $user = "", $pass = "")
|
||||
{
|
||||
$this->host = rtrim($host, '/');
|
||||
$this->user = $user;
|
||||
$this->pass = $pass;
|
||||
|
||||
@ -54,7 +56,8 @@ class uTorrent {
|
||||
}
|
||||
|
||||
// performs request
|
||||
private function makeRequest($request, $decode = true, $options = array()) {
|
||||
private function makeRequest($request, $decode = true, $options = array())
|
||||
{
|
||||
$request = preg_replace('/^\?/', '?token='.$this->token . '&', $request);
|
||||
|
||||
$ch = curl_init();
|
||||
@ -71,12 +74,14 @@ class uTorrent {
|
||||
}
|
||||
|
||||
// implodes given parameter with glue, whether it is an array or not
|
||||
private function paramImplode($glue, $param) {
|
||||
private function paramImplode($glue, $param)
|
||||
{
|
||||
return $glue.implode($glue, is_array($param) ? $param : array($param));
|
||||
}
|
||||
|
||||
// gets token, returns true on success
|
||||
private function getToken() {
|
||||
private function getToken()
|
||||
{
|
||||
$url = sprintf(self::$base, $this->host, 'token.html');
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
@ -101,7 +106,8 @@ class uTorrent {
|
||||
}
|
||||
|
||||
// returns the uTorrent build number
|
||||
public function getBuild(){
|
||||
public function getBuild()
|
||||
{
|
||||
$json = $this->makeRequest("?");
|
||||
return $json['build'];
|
||||
}
|
||||
@ -109,13 +115,15 @@ class uTorrent {
|
||||
// returns an array of files for the specified torrent hash
|
||||
// TODO:
|
||||
// - (when implemented in API) allow multiple hashes to be specified
|
||||
public function getFiles($hash) {
|
||||
public function getFiles($hash)
|
||||
{
|
||||
$json = $this->makeRequest("?action=getfiles&hash=".$hash);
|
||||
return $json['files'];
|
||||
}
|
||||
|
||||
// returns an array of all labels
|
||||
public function getLabels(){
|
||||
public function getLabels()
|
||||
{
|
||||
$json = $this->makeRequest("?list=1");
|
||||
return $json['label'];
|
||||
}
|
||||
@ -123,19 +131,22 @@ class uTorrent {
|
||||
// returns an array of the properties for the specified torrent hash
|
||||
// TODO:
|
||||
// - (when implemented in API) allow multiple hashes to be specified
|
||||
public function getProperties($hash) {
|
||||
public function getProperties($hash)
|
||||
{
|
||||
$json = $this->makeRequest("?action=getprops&hash=".$hash);
|
||||
return $json['props'];
|
||||
}
|
||||
|
||||
// returns an array of all settings
|
||||
public function getSettings() {
|
||||
public function getSettings()
|
||||
{
|
||||
$json = $this->makeRequest("?action=getsettings");
|
||||
return $json['settings'];
|
||||
}
|
||||
|
||||
// returns an array of all torrent jobs and related information
|
||||
public function getTorrents() {
|
||||
public function getTorrents()
|
||||
{
|
||||
$json = $this->makeRequest("?list=1");
|
||||
return $json['torrents'];
|
||||
}
|
||||
@ -144,7 +155,8 @@ class uTorrent {
|
||||
* Get all the RSS favourites/filters
|
||||
* @return model\Filter[]
|
||||
*/
|
||||
public function getRSSFilters() {
|
||||
public function getRSSFilters()
|
||||
{
|
||||
$json = $this->makeRequest("?list=1");
|
||||
$filters = array();
|
||||
foreach ($json['rssfilters'] as $filter) {
|
||||
@ -157,7 +169,8 @@ class uTorrent {
|
||||
* Update an RSS filter as retrieved from getRSSFilters
|
||||
* @param \uTorrent\model\Filter $filter
|
||||
*/
|
||||
public function setRSSFilter(model\Filter $filter) {
|
||||
public function setRSSFilter(model\Filter $filter)
|
||||
{
|
||||
$request = array_merge(array('action' => 'filter-update'), $filter->toParams());
|
||||
return $this->makeRequest('?'.http_build_query($request));
|
||||
}
|
||||
@ -168,7 +181,8 @@ class uTorrent {
|
||||
* @param \uTorrent\model\Filter $filter
|
||||
* @return int ID of the new filter
|
||||
*/
|
||||
public function addRSSFilter(model\Filter $filter) {
|
||||
public function addRSSFilter(model\Filter $filter)
|
||||
{
|
||||
$filter->filterId = -1;
|
||||
$resp = $this->setRSSFilter($filter);
|
||||
if (!empty($resp['filter_ident'])) {
|
||||
@ -179,77 +193,90 @@ class uTorrent {
|
||||
}
|
||||
|
||||
// returns true if WebUI server is online and enabled, false otherwise
|
||||
public function is_online() {
|
||||
public function is_online()
|
||||
{
|
||||
return is_array($this->makeRequest("?"));
|
||||
}
|
||||
|
||||
// sets the properties for the specified torrent hash
|
||||
// TODO:
|
||||
// - allow multiple hashes, properties, and values to be set simultaneously
|
||||
public function setProperties($hash, $property, $value) {
|
||||
public function setProperties($hash, $property, $value)
|
||||
{
|
||||
$this->makeRequest("?action=setprops&hash=".$hash."&s=".$property."&v=".$value, false);
|
||||
}
|
||||
|
||||
// sets the priorities for the specified files in the specified torrent hash
|
||||
public function setPriority($hash, $files, $priority) {
|
||||
public function setPriority($hash, $files, $priority)
|
||||
{
|
||||
$this->makeRequest("?action=setprio&hash=".$hash."&p=".$priority.$this->paramImplode("&f=", $files), false);
|
||||
}
|
||||
|
||||
// sets the settings
|
||||
// TODO:
|
||||
// - allow multiple settings and values to be set simultaneously
|
||||
public function setSetting($setting, $value) {
|
||||
public function setSetting($setting, $value)
|
||||
{
|
||||
$this->makeRequest("?action=setsetting&s=".$setting."&v=".$value, false);
|
||||
}
|
||||
|
||||
// add a file to the list
|
||||
public function torrentAdd($filename, &$estring = false) {
|
||||
public function torrentAdd($filename, &$estring = false)
|
||||
{
|
||||
$split = explode(":", $filename, 2);
|
||||
if (count($split) > 1 && (stristr("|http|https|file|magnet|", "|".$split[0]."|") !== false)) {
|
||||
$this->makeRequest("?action=add-url&s=".urlencode($filename), false);
|
||||
}
|
||||
elseif (file_exists($filename)) {
|
||||
} elseif (file_exists($filename)) {
|
||||
$json = $this->makeRequest("?action=add-file", true, array(CURLOPT_POSTFIELDS => array("torrent_file" => "@".realpath($filename))));
|
||||
|
||||
if (isset($json['error'])) {
|
||||
if ($estring !== false) $estring = $json['error'];
|
||||
if ($estring !== false) {
|
||||
$estring = $json['error'];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if ($estring !== false) $estring = "File doesn't exist!";
|
||||
} else {
|
||||
if ($estring !== false) {
|
||||
$estring = "File doesn't exist!";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// force start the specified torrent hashes
|
||||
public function torrentForceStart($hash) {
|
||||
public function torrentForceStart($hash)
|
||||
{
|
||||
$this->makeRequest("?action=forcestart".$this->paramImplode("&hash=", $hash), false);
|
||||
}
|
||||
|
||||
// pause the specified torrent hashes
|
||||
public function torrentPause($hash) {
|
||||
public function torrentPause($hash)
|
||||
{
|
||||
$this->makeRequest("?action=pause".$this->paramImplode("&hash=", $hash), false);
|
||||
}
|
||||
|
||||
// recheck the specified torrent hashes
|
||||
public function torrentRecheck($hash) {
|
||||
public function torrentRecheck($hash)
|
||||
{
|
||||
$this->makeRequest("?action=recheck".$this->paramImplode("&hash=", $hash), false);
|
||||
}
|
||||
|
||||
// start the specified torrent hashes
|
||||
public function torrentStart($hash) {
|
||||
public function torrentStart($hash)
|
||||
{
|
||||
$this->makeRequest("?action=start".$this->paramImplode("&hash=", $hash), false);
|
||||
}
|
||||
|
||||
// stop the specified torrent hashes
|
||||
public function torrentStop($hash) {
|
||||
public function torrentStop($hash)
|
||||
{
|
||||
$this->makeRequest("?action=stop".$this->paramImplode("&hash=", $hash), false);
|
||||
}
|
||||
|
||||
// remove the specified torrent hashes (and data, if $data is set to true)
|
||||
public function torrentRemove($hash, $data = false) {
|
||||
public function torrentRemove($hash, $data = false)
|
||||
{
|
||||
$this->makeRequest("?action=".($data ? "removedata" : "remove").$this->paramImplode("&hash=", $hash), false);
|
||||
}
|
||||
}
|
||||
|
@ -1,352 +1,352 @@
|
||||
<?php
|
||||
/**
|
||||
* 技术讨论及后续更新,请加入QQ群!!!!!!!
|
||||
群名称:IYUU自动辅种交流
|
||||
QQ群号:859882209
|
||||
群名称:IYUU自动辅种交流
|
||||
QQ群号:859882209
|
||||
* 手动配置方法,请查看:https://www.iyuu.cn/archives/324/
|
||||
*/
|
||||
return array(
|
||||
// 1.爱语飞飞 微信通知配置
|
||||
'iyuu.cn' => 'IYUU',
|
||||
// 2.server酱 微信通知配置
|
||||
'sc.ftqq.com' => '',
|
||||
// 3.发布员鉴权
|
||||
'secret' => '',
|
||||
// 4.全局默认配置
|
||||
// 1.爱语飞飞 微信通知配置
|
||||
'iyuu.cn' => 'IYUU',
|
||||
// 2.server酱 微信通知配置
|
||||
'sc.ftqq.com' => '',
|
||||
// 3.发布员鉴权
|
||||
'secret' => '',
|
||||
// 4.全局默认配置
|
||||
'default' => array(
|
||||
// 5.【必须配置】浏览器UA,打开http://demo.iyuu.cn 复制过来即可
|
||||
'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
|
||||
// 6.【自动辅种必须配置】全局客户端设置(条目不够可以复制,用不到的请删除)
|
||||
// 5.【必须配置】浏览器UA,打开http://demo.iyuu.cn 复制过来即可
|
||||
'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
|
||||
// 6.【自动辅种必须配置】全局客户端设置(条目不够可以复制,用不到的请删除)
|
||||
'clients' => array(
|
||||
// 全局客户端设置 开始
|
||||
// 全局客户端设置 开始
|
||||
array(
|
||||
'type' => 'transmission', // 支持:transmission、qBittorrent
|
||||
'host' => 'http://127.0.0.1:9091/transmission/rpc',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
//'move' =>array(
|
||||
// 'type' => 2, // 0保持不变,1减,2加, 3直接替换
|
||||
// 'path' =>array(
|
||||
// '/sda1' => '/volume1',
|
||||
// ),
|
||||
//),
|
||||
),
|
||||
// (条目不够可以复制,用不到的请删除)
|
||||
array(
|
||||
'type' => 'qBittorrent', // 支持:transmission、qBittorrent
|
||||
'host' => 'http://www.baidu.com:8083',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
),
|
||||
// 全局客户端设置 结束
|
||||
),
|
||||
'CONNECTTIMEOUT'=> 60,
|
||||
'type' => 'transmission', // 支持:transmission、qBittorrent
|
||||
'host' => 'http://127.0.0.1:9091/transmission/rpc',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
//'move' =>array(
|
||||
// 'type' => 2, // 0保持不变,1减,2加, 3直接替换
|
||||
// 'path' =>array(
|
||||
// '/sda1' => '/volume1',
|
||||
// ),
|
||||
//),
|
||||
),
|
||||
// (条目不够可以复制,用不到的请删除)
|
||||
array(
|
||||
'type' => 'qBittorrent', // 支持:transmission、qBittorrent
|
||||
'host' => 'http://www.baidu.com:8083',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
),
|
||||
// 全局客户端设置 结束
|
||||
),
|
||||
'CONNECTTIMEOUT'=> 60,
|
||||
'TIMEOUT' => 600,
|
||||
),
|
||||
/**
|
||||
* 以下为各站点的独立配置(互不影响、互不冲突)
|
||||
* 自动辅种:需要配置各站的passkey(没有配置passkey的站点会自动跳过)
|
||||
*/
|
||||
),
|
||||
/**
|
||||
* 以下为各站点的独立配置(互不影响、互不冲突)
|
||||
* 自动辅种:需要配置各站的passkey(没有配置passkey的站点会自动跳过)
|
||||
*/
|
||||
// m-team 序号:1
|
||||
'm-team' => array(
|
||||
// 14.m-team的cookie 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => 'tp=',
|
||||
// 15.m-team的passkey 【必须配置】
|
||||
'passkey' => '',
|
||||
// 种子Tracker的IP地址选择 可选:ipv4,ipv6
|
||||
'ip_type' => 'ipv4',
|
||||
// 14.m-team的cookie 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => 'tp=',
|
||||
// 15.m-team的passkey 【必须配置】
|
||||
'passkey' => '',
|
||||
// 种子Tracker的IP地址选择 可选:ipv4,ipv6
|
||||
'ip_type' => 'ipv4',
|
||||
),
|
||||
// keepfrds 序号:2
|
||||
'keepfrds' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// ourbits 序号:3
|
||||
'ourbits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'id' => 0, // 用户ID
|
||||
'is_vip' => 0, // 是否具有VIP或特殊权限?0 普通,1 VIP
|
||||
),
|
||||
// ourbits 序号:3
|
||||
'ourbits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'id' => 0, // 用户ID
|
||||
'is_vip' => 0, // 是否具有VIP或特殊权限?0 普通,1 VIP
|
||||
),
|
||||
// HDSky 序号:4
|
||||
'hdsky' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// pter 序号:5
|
||||
'pter' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// pter 序号:5
|
||||
'pter' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// tjupt 序号:6
|
||||
'tjupt' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// tjupt 序号:6
|
||||
'tjupt' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdhome 序号:7
|
||||
'hdhome' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// hdhome 序号:7
|
||||
'hdhome' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// btschool 序号:8
|
||||
'btschool' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// btschool 序号:8
|
||||
'btschool' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// PTHome 序号:9
|
||||
),
|
||||
// PTHome 序号:9
|
||||
'pthome' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hddolby 序号:10
|
||||
'hddolby' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// hddolby 序号:10
|
||||
'hddolby' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// TorrentCCF 序号:11
|
||||
// TorrentCCF 序号:11
|
||||
'torrentccf' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// PTMSG 序号:12
|
||||
// PTMSG 序号:12
|
||||
'ptmsg' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// MoeCat 序号:13
|
||||
// MoeCat 序号:13
|
||||
'moecat' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
// 种子Tracker的IP地址选择 可选:ipv4,ipv6
|
||||
'ip_type' => 'ipv4',
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
// 种子Tracker的IP地址选择 可选:ipv4,ipv6
|
||||
'ip_type' => 'ipv4',
|
||||
),
|
||||
// totheglory 序号:14
|
||||
'ttg' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// nanyangpt 序号:15
|
||||
// nanyangpt 序号:15
|
||||
'nanyangpt' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// springsunday.net 序号:16
|
||||
),
|
||||
// springsunday.net 序号:16
|
||||
'ssd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// yingk 序号:17
|
||||
),
|
||||
// yingk 序号:17
|
||||
'yingk' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdcity 序号:18
|
||||
),
|
||||
// hdcity 序号:18
|
||||
'hdcity' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置 cuhash
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置 cuhash
|
||||
'passkey' => '',
|
||||
),
|
||||
// 52pt.site 序号:19
|
||||
),
|
||||
// 52pt.site 序号:19
|
||||
'52pt' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// brobits.cc 序号:20
|
||||
),
|
||||
// brobits.cc 序号:20
|
||||
'brobits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// www.beitai.pt 序号:21
|
||||
),
|
||||
// www.beitai.pt 序号:21
|
||||
'beitai' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// pt.eastgame.org 序号:22
|
||||
),
|
||||
// pt.eastgame.org 序号:22
|
||||
'eastgame' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// pt.soulvoice.club 序号:23
|
||||
),
|
||||
// pt.soulvoice.club 序号:23
|
||||
'soulvoice' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// chdbits 序号:24
|
||||
),
|
||||
// chdbits 序号:24
|
||||
'chdbits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// leaguehd 序号:25
|
||||
),
|
||||
// leaguehd 序号:25
|
||||
'leaguehd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// ptsbao.club 序号:26
|
||||
'ptsbao' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdchina 序号:27
|
||||
'hdchina' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdarea 序号:28
|
||||
'hdarea' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdtime 序号:29
|
||||
'hdtime' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// 1ptba 序号:30
|
||||
'1ptba' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hd4fans 序号:31
|
||||
'hd4fans' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdbug 序号:32
|
||||
'hdbug' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// opencd 序号:33
|
||||
'opencd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdstreet 序号:34
|
||||
'hdstreet' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// joyhd 序号:35
|
||||
'joyhd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// dmhy 序号:36
|
||||
'dmhy' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// upxin 序号:37
|
||||
'upxin' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// oshen 序号:38
|
||||
'oshen' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// discfan 序号:39
|
||||
'discfan' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdzone 序号:40
|
||||
'hdzone' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// cnscg 序号:41
|
||||
'cnscg' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// nicept 序号:42
|
||||
'nicept' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
),
|
||||
// ptsbao.club 序号:26
|
||||
'ptsbao' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdchina 序号:27
|
||||
'hdchina' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdarea 序号:28
|
||||
'hdarea' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdtime 序号:29
|
||||
'hdtime' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// 1ptba 序号:30
|
||||
'1ptba' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hd4fans 序号:31
|
||||
'hd4fans' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdbug 序号:32
|
||||
'hdbug' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// opencd 序号:33
|
||||
'opencd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdstreet 序号:34
|
||||
'hdstreet' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// joyhd 序号:35
|
||||
'joyhd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// dmhy 序号:36
|
||||
'dmhy' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// upxin 序号:37
|
||||
'upxin' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// oshen 序号:38
|
||||
'oshen' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// discfan 序号:39
|
||||
'discfan' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hdzone 序号:40
|
||||
'hdzone' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// cnscg 序号:41
|
||||
'cnscg' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// nicept 序号:42
|
||||
'nicept' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
|
||||
// 配置文件结束
|
||||
);
|
||||
// 配置文件结束
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user