parent
27104bd9a2
commit
b0607dbcf0
@ -1,367 +0,0 @@ |
||||
<?php |
||||
/** |
||||
* Rpc操作类 |
||||
*/ |
||||
class Rpc |
||||
{ |
||||
/** |
||||
* 版本号 |
||||
* @var string |
||||
*/ |
||||
const VER = '0.0.1'; |
||||
|
||||
// 下载种子的请求类型 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 $RPC_Key = 0; |
||||
/** |
||||
* 退出状态码 |
||||
*/ |
||||
public static $ExitCode = 0; |
||||
/** |
||||
* 初始化 |
||||
*/ |
||||
public static function init($site = '', $method = 'GET') |
||||
{ |
||||
global $configALL; |
||||
|
||||
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(); |
||||
} |
||||
|
||||
/** |
||||
* 连接远端RPC服务器 |
||||
* |
||||
* @param string |
||||
* @return array |
||||
*/ |
||||
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; |
||||
} |
||||
|
||||
/** |
||||
* @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; |
||||
} |
||||
|
||||
/** |
||||
* 负载均衡 选择算法 |
||||
* |
||||
* @param |
||||
* @return |
||||
*/ |
||||
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; |
||||
} |
||||
} |
Loading…
Reference in new issue