Compare commits

..

175 Commits

Author SHA1 Message Date
david
136c9ee2ba 加版本号 2021-07-09 18:25:55 +08:00
david
9497cea867 优化URL替换规则,支持新站点 2021-07-09 18:22:19 +08:00
david
6f23c966e1 修改用户绑定接口地址 2021-07-01 23:58:53 +08:00
david
9d8eee73d9 新增站点:蒲公英、阿童木 2021-03-06 11:26:17 +08:00
david
d9698dfe7f 累加版本号 2021-01-13 14:11:13 +08:00
david
a6e2be82c9 加入.gitignore 2021-01-13 14:05:50 +08:00
david
e9214738c9 add 2021-01-13 13:59:11 +08:00
david
e61b47f3e8 移除、添加文件 2021-01-13 13:53:54 +08:00
david
87d9f81bad 修复entrypoint.sh权限给太高,某些情况下无法执行的问题。 2020-12-31 00:30:17 +08:00
david
7b2e82c506 修复entrypoint.sh在UNRAID中777权限无法执行问题 2020-12-31 00:23:41 +08:00
david
ae63bfca89 加入操作辅种docker容器的相关命令示例 2020-12-23 16:32:57 +08:00
david
6c1211708c v1.10.17 2020-12-22 12:04:59 +08:00
david
40387fdb5b + push.sh 2020-12-22 12:03:11 +08:00
david
e10c36295c 优化Dockerfile防止更新权限覆盖 2020-12-22 01:19:45 +08:00
david
801d7b016f 优化entrypoint.sh脚本 2020-12-22 01:14:40 +08:00
david
1ff415ea91 && chmod -R 777 /IYUU/docker/entrypoint.sh \ 2020-12-22 00:24:35 +08:00
david
849370e26a 优化docker 2020-12-22 00:14:52 +08:00
david
815156b252 修复重复注入拼接规则bug 2020-12-14 15:16:51 +08:00
david
d62be67927 修改docker定时 2020-12-14 11:47:59 +08:00
david
d513b1bedf 修改 Dockerfile 2020-12-14 02:36:38 +08:00
david
b566181968 优化辅种前置检查 2020-12-13 21:06:13 +08:00
david
60b4939aee fix 2020-12-12 15:47:08 +08:00
david
dad8afa8d4 fix 2020-12-12 15:16:54 +08:00
david
a60e5f859c 补充新规则的配置参数 2020-12-12 14:46:49 +08:00
david
59622691e1 重要更新:
1.hdhome、pthome、ourbits,加入新的辅种下载规则;
2.新增支持HDAI站点。
3.合作站验证参数,改为云端获取;
4.辅种检查参数,改为云端获取。
2020-12-12 14:29:12 +08:00
david
3a97c17e66 编辑示例配置注释 2020-12-06 21:49:33 +08:00
david
6d3b937097 新增3群号码 2020-12-01 13:54:22 +08:00
david
4277568346 新增站点:pttime 2020-11-30 16:27:49 +08:00
david
84f75ea443 移除失效站点信息,优化代码 2020-11-13 00:23:36 +08:00
david
715be0e7eb 修正注释描述 2020-11-04 15:00:54 +08:00
david
6eebc7d26c 修改ttg配置的顺序 2020-09-04 23:45:52 +08:00
david
30410735af 新增合作站点:chdbits
更新方法:依据最新示例配置,增加一行ID配置。
2020-08-31 23:54:02 +08:00
david
99a2894f37 新增站点:百川PT 2020-08-26 14:09:46 +08:00
iyuu.cn
13b176c4a1 更新readme.md 2020-08-11 19:18:39 +08:00
iyuu.cn
afca458acc 更改转移参数,默认暂停 2020-08-11 19:17:45 +08:00
iyuu.cn
b8b05ff3bf 新增辅种站点:龙之家dragonhd 2020-08-11 18:16:16 +08:00
iyuu.cn
d402d30aac 更改定时任务时间 2020-08-07 17:47:13 +08:00
iyuu.cn
11c976d2c0 增强检查,避免空参数使用backup.sh时,造成问题。 2020-08-06 23:04:33 +08:00
iyuu.cn
630dc3af92 优先检查passkey,排除用户没有的站点 2020-08-06 14:36:04 +08:00
iyuu.cn
463e45ee38 优化日志记录方式 2020-08-05 19:08:06 +08:00
iyuu.cn
b046ecc75f 示例配置新增教程 2020-08-03 22:54:15 +08:00
iyuu.cn
468813a057 编辑:更新历史.md 2020-08-02 23:10:07 +08:00
iyuu.cn
fdd5475e37 兼容qBittorrent v4.1.5【小钢炮等】 2020-08-02 15:39:25 +08:00
iyuu.cn
1f4da154fb 优化Windows批处理 2020-08-02 00:11:31 +08:00
iyuu.cn
419b6eb8cd fix 2020-08-01 22:43:44 +08:00
iyuu.cn
289df1e126 优化windows执行辅种批处理 2020-08-01 15:42:54 +08:00
iyuu.cn
4d86a9cb9f Readme.md新增Docker使用方法介绍 2020-07-31 17:09:24 +08:00
iyuu.cn
c79d5e4592 v1.10.2版本以后的docker,每5小时会自动拉取最新代码;从此,您只需要看公告更新配置就行啦。 2020-07-31 09:34:18 +08:00
iyuu.cn
c9fb5c6a6a 更改Dockerfile,每5小时自动拉取最新代码 2020-07-31 09:17:57 +08:00
iyuu.cn
a744f5e785 更改本地ARM平台打包标签为:iyuu:arm64v8 2020-07-31 07:59:55 +08:00
iyuu.cn
84394c3a71 精简配置,移除容易迷惑人的项目 2020-07-31 07:52:00 +08:00
iyuu.cn
fd61ee86a1 新增.dockerignore,排除编译不必要的文件 2020-07-31 07:47:11 +08:00
iyuu.cn
afe1a863ac 移除Arm64v8.Dockerfile 2020-07-30 21:00:10 +08:00
iyuu.cn
2a7947b9fa bash+ 2020-07-30 15:19:18 +08:00
iyuu.cn
fa6a38b7b3 移除swoft/alphp:base 2020-07-30 14:44:35 +08:00
iyuu.cn
02eb245ae0 更新Arm64v8.Dockerfile,测试自动编译。 2020-07-30 14:34:14 +08:00
iyuu.cn
3fc4e14b93 优化docker的Readme.md注释 2020-07-29 19:12:16 +08:00
iyuu.cn
6a5d375044 修复编码错误。 2020-07-29 16:00:43 +08:00
iyuu.cn
da0cb81ab2 修复笔误。 2020-07-29 15:28:48 +08:00
iyuu.cn
41ebed71c7 本地编译更改基础镜像为arm64v8/alpine:3.12,并使用国内镜像源 2020-07-29 15:26:12 +08:00
iyuu.cn
05426489f0 新增Docker自动Builds文件Arm64v8.Dockerfile; 2020-07-29 15:25:07 +08:00
iyuu.cn
8489b07b35 精简和优化readme中相关项目说明 2020-07-29 15:20:22 +08:00
iyuu.cn
3e28685731 Dockerfile使用官方源 2020-07-29 03:02:53 +08:00
iyuu.cn
2d5ab5ae9b 新增Dockerfile 2020-07-29 02:14:37 +08:00
iyuu.cn
fa61ad21e0 优化hdsky下载url后的显示效果。 2020-07-29 00:37:23 +08:00
iyuu.cn
1f95e62d95 v1.10.0 2020-07-29 00:32:47 +08:00
iyuu.cn
a84b193d14 调整hdsky流控参数20/20,适配天空辅种。 2020-07-29 00:29:54 +08:00
iyuu.cn
e2dddfdead 新增AMD64平台docker构建脚本 2020-07-28 08:33:40 +08:00
iyuu.cn
f78e9c737c 新增Docker构建amd64镜像 2020-07-28 06:49:26 +08:00
iyuu.cn
8813afbd73 新增docker镜像Arm64v8 2020-07-28 03:27:59 +08:00
iyuu.cn
8b1bd9cdb5 fix 2020-07-25 20:37:57 +08:00
iyuu.cn
5418c02227 修复缺少isset($configALL['notify_on_change'])判断警告 2020-07-24 16:03:59 +08:00
iyuu.cn
a9d9fb637d 当配置不存在时,生成配置后再延时提示。 2020-07-24 14:01:03 +08:00
iyuu.cn
4247457cb6 更新readme.md相关项目 2020-07-24 13:27:34 +08:00
iyuu.cn
0047450161 更新readme.md相关项目;修改微信通知支持条件触发:有变化才发送通知(辅种成功 + 失败 > 0)。 2020-07-24 13:16:24 +08:00
iyuu.cn
15f9905004 合并hxsf提交,修改buile.sh 2020-07-24 13:07:05 +08:00
David
63b2bfc2bc Merge pull request #17 from hxsf/master
some features
2020-07-24 13:50:37 +08:00
hxsf
c5c2feb9d3 add notify_on_change feature 2020-07-24 13:39:22 +08:00
hxsf
6c06d9fb6a add new DockerFile and docker-compose example 2020-07-24 13:36:33 +08:00
iyuu.cn
6578397ee3 更新相关项目4个。 2020-07-23 19:53:01 +08:00
iyuu.cn
29c2e43405 首次运行生成config.php;提高瓷器、城市兼容性。 2020-07-23 18:47:06 +08:00
iyuu.cn
18cdd7abed 新增pthome流控参数 2020-07-22 21:21:59 +08:00
iyuu.cn
4fbf795811 增强客户端空密码检查 2020-07-22 03:28:42 +08:00
iyuu.cn
88ebc12ce5 微信报表新增失败详情提示 2020-07-21 19:42:17 +08:00
iyuu.cn
08b4b58083 新增hddolby流控参数 2020-07-21 19:24:04 +08:00
iyuu.cn
ca02231431 加入github徽章 2020-07-21 16:43:21 +08:00
iyuu.cn
7d638eba40 新增hdhome流控参数 2020-07-19 17:20:27 +08:00
iyuu.cn
c35c23583c 新增Ourbits、SSD、hdchina、hdsky、moecat、pt等站点的流控规则 2020-07-18 14:34:07 +08:00
iyuu.cn
b2b9000a86 优化代码结构 2020-07-17 23:02:21 +08:00
iyuu.cn
b80a5b89cc 更新Readme.md 2020-07-17 20:39:45 +08:00
iyuu.cn
c2e5b4d00b 新增移动做种微信报告 2020-07-17 19:55:53 +08:00
iyuu.cn
207320ede7 fix 2020-07-16 20:59:41 +08:00
iyuu.cn
6e1653fc1e fix 2020-07-14 16:44:28 +08:00
iyuu.cn
32ec80d552 提高对旧配置的兼容性 2020-07-14 02:13:20 +08:00
iyuu.cn
2b989f9e0e 新增瓷器、城市cookie过期微信通知 2020-07-13 10:19:36 +08:00
iyuu.cn
ff16781da9 fix 2020-07-13 08:47:00 +08:00
iyuu.cn
6a01b492ce 更新公告栏 2020-07-13 07:58:39 +08:00
iyuu.cn
de41bc0131 1.优化App.Api.Sites接口带版本号请求;2.新增异步间隔流控算法:各站独立、执行时间最优;3.config.sample.php各站点新增url_replace、url_join、limitRule参数。 2020-07-13 07:32:15 +08:00
iyuu.cn
6b83e9081b fix:优化代码 2020-07-12 21:29:41 +08:00
iyuu.cn
87f06ec5c4 接口域名部署SSL证书,支持双协议http/https。如:https://api.iyuu.cn 2020-07-12 19:39:19 +08:00
iyuu.cn
8a051d4d1f fix:优化转移做种时过滤器、选择器提示顺序。 2020-07-11 20:39:09 +08:00
iyuu.cn
0e32e625a4 新增功能:转移过滤器、选择器;可以只转移指定路径的种子,也可以排除指令路径的种子,按需转移。 2020-07-11 18:09:04 +08:00
iyuu.cn
a09dacbd20 优化微信通知提示 2020-07-11 02:46:59 +08:00
iyuu.cn
e3a9c32174 微信通知增加辅种缓存位置提示。 2020-07-10 19:33:51 +08:00
iyuu.cn
c8a94bfcff 优化代码结构,美化微信通知消息,删除多余的运行提示信息等 2020-07-10 19:17:12 +08:00
iyuu.cn
fd87d07539 更新md文档 2020-07-03 17:20:25 +08:00
iyuu.cn
df7100e4e9 更新QQ群信息:859882209、931954050 2020-07-03 17:19:51 +08:00
iyuu.cn
44f5b82650 新增HDfans站点 2020-07-03 13:01:03 +08:00
iyuu.cn
f5a33843e6 v1.8.3 2020-06-18 08:45:40 +08:00
iyuu.cn
7428144aa8 移除SSD站点辅种计数器。 2020-06-18 08:44:57 +08:00
iyuu.cn
cc325dc128 删除无用.cmd批处理 2020-06-10 23:09:20 +08:00
iyuu.cn
3d675ed4bd qBittorrent下载器增加root_folder配置项:是否创建子文件夹 2020-06-10 10:31:40 +08:00
iyuu.cn
eabb51c54a fix 2020-06-01 21:51:48 +08:00
iyuu.cn
1e1a7bfc59 $configALL[$siteName]['count'] 初始化。 2020-06-01 21:48:38 +08:00
iyuu.cn
005788827d SSD加入辅种计数器(限制每次辅种10个),降低初次辅种过多ban禁IP的可能性。 2020-06-01 21:45:57 +08:00
iyuu.cn
ffb600c334 新增上报错误种子403状态码,例如:兼容杜比等站已删除种子返回403状态码的情况。 2020-05-18 12:52:57 +08:00
iyuu.cn
290bfbe5c9 优化build.sh编译脚本 2020-05-12 18:41:52 +08:00
iyuu.cn
6ecf4f1d54 更新README.MD 2020-05-06 16:37:54 +08:00
iyuu.cn
c809e8d052 v1.7.9 2020-05-06 12:38:27 +08:00
iyuu.cn
8d7dffbf3d 新增站点:海胆haidan 2020-05-06 12:37:43 +08:00
iyuu.cn
cc50804b40 优化URL获取的代码结构 2020-05-01 09:43:35 +08:00
iyuu.cn
4444aec4fb v1.7.8 2020-04-26 22:15:06 +08:00
iyuu.cn
68e128e5cd 小钢炮安装脚本添加/BT_backup目录挂载至docker 2020-04-26 22:14:14 +08:00
iyuu.cn
ec7032698d 更改文件名与Readme.md 2020-04-17 11:57:06 +08:00
iyuu.cn
5308c691b6 更新Readme.md 2020-04-11 13:59:04 +08:00
iyuu.cn
c7f4859cb7 新增支持站点伊甸园hdbd。 2020-04-11 10:16:25 +08:00
iyuu.cn
dc651174b8 v1.7.6 2020-04-07 23:19:28 +08:00
iyuu.cn
a95e579cf6 v1.7.6 2020-04-07 23:00:29 +08:00
iyuu.cn
4811937f42 优化注释 2020-04-06 15:03:19 +08:00
iyuu.cn
f9674c1898 微信报表,增加脚本版本号显示 2020-04-06 15:03:04 +08:00
iyuu.cn
2fdacc6936 更新教程 2020-04-06 15:02:06 +08:00
iyuu.cn
a2034f2840 新增合作站点MoeCat 2020-04-03 22:27:08 +08:00
iyuu.cn
4894464fdd 优化部分php环境CURLOPT_SSL_VERIFYHOST参数设置为false后,卡顿问题。 2020-04-03 21:03:58 +08:00
iyuu.cn
c90acbec6c 路径转换方法:提高替换模式的兼容性。 2020-04-03 12:19:03 +08:00
iyuu.cn
c4a8cef4ce 修改build.sh脚本,新增小钢炮专用脚本 2020-03-27 14:59:26 +08:00
iyuu.cn
cc7eb9b06a 添加、修改教程。 2020-03-27 14:58:41 +08:00
iyuu.cn
ea3f3deaa8 更新小钢炮docker脚本环境构建教程,新增小钢炮专用创建脚本。 2020-03-27 14:23:38 +08:00
iyuu.cn
44c0bcdeb4 没用$path == $key判断,是为了提高兼容性 2020-03-27 11:41:10 +08:00
iyuu.cn
d015cd56a6 fix 2020-03-26 23:49:56 +08:00
iyuu.cn
4cf1222b37 注释curl证书验证,本设置会引起部分站点的https访问失败,返回Empty reply from server错误 2020-03-26 18:31:08 +08:00
iyuu.cn
b5f4537df7 新增站点HDRoute 2020-03-25 23:49:17 +08:00
iyuu.cn
1e428a04b7 优化精简路径转换返回 2020-03-25 19:20:35 +08:00
iyuu.cn
4c7fd2cf3d 更新readme.md接口说明的部分 2020-03-25 19:02:13 +08:00
iyuu.cn
43b8bc050b 精简示例配置 2020-03-25 18:49:24 +08:00
iyuu.cn
1c1ecd33b8 提示当前脚本路径。 2020-03-25 17:44:56 +08:00
iyuu.cn
e201505dca 优化git_pull.sh脚本:自动拉取最新代码,然后执行辅种脚本。 2020-03-25 13:49:58 +08:00
iyuu.cn
e02d32b129 v1.7.1 2020-03-25 12:43:09 +08:00
iyuu.cn
01a9b71e9f 为避免多php版本带来困扰,cmd批处理内php采用环境变量调用。 2020-03-25 12:31:30 +08:00
iyuu.cn
f89b5f7325 v1.7.0 2020-03-23 13:19:45 +08:00
iyuu.cn
5880f563e8 增加通用备份脚本,可以添加进计划任务。 2020-03-23 13:05:03 +08:00
iyuu.cn
61eb8f69c9 简化辅种输出。 2020-03-22 11:29:47 +08:00
iyuu.cn
b4ca455a75 优化输出提示,未填写passkey的站点自动跳过,不提示。 2020-03-22 11:24:52 +08:00
iyuu.cn
02205e6ce3 修复transmission往qBittorrent转移种子,错误的问题。 2020-03-21 19:33:50 +08:00
iyuu.cn
818794a19b 错误提示后面增加换行符。 2020-03-19 19:58:10 +08:00
iyuu.cn
88bc79ff58 版本升级至v1.6.7 2020-03-16 15:00:00 +08:00
iyuu.cn
f9164b6e53 修改php文件夹名称,让脚本更通用 2020-03-16 14:50:33 +08:00
iyuu.cn
687a83f80d 添加公告 2020-03-15 23:20:07 +08:00
iyuu.cn
253cff0e23 增加Windows从gitee安装脚本批处理。 2020-03-15 13:12:50 +08:00
iyuu.cn
ed1d4fbe11 新增合作站点pthome,可以对使用接口的用户进行认证绑定。 2020-03-15 12:42:27 +08:00
iyuu.cn
99c2655fd4 调整配置顺序 2020-03-15 00:54:58 +08:00
iyuu.cn
7adbadd700 修复一处错误。 2020-03-14 22:55:31 +08:00
iyuu.cn
6e4c530128 减少sleep等待时间为1秒。 2020-03-14 17:21:20 +08:00
iyuu.cn
9d183d742d 优化完善转移做种客户端时,出现的错误提示。 2020-03-14 17:20:46 +08:00
iyuu.cn
f5bc84e23d 优化合作站点登录逻辑,设置登录缓存,减少请求。 2020-03-14 17:20:02 +08:00
iyuu.cn
77443896dd 更新教程 2020-03-13 23:40:04 +08:00
iyuu.cn
657f092eef 新增公告 2020-03-13 23:35:06 +08:00
iyuu.cn
59b2d5b4ca 简化docker编译文件 2020-03-13 23:30:00 +08:00
iyuu.cn
b64abe55d5 新增3篇安装教程 2020-03-13 21:29:23 +08:00
iyuu.cn
df6761bbc3 composer dump-autoload 2020-03-13 21:28:58 +08:00
iyuu.cn
880775b815 新增hdhome合作站点用户id认证配置 2020-03-13 14:51:25 +08:00
iyuu.cn
0a29e7ed2f 修复瓷器辅种显示乱码不美观的问题 2020-03-12 08:08:01 +08:00
iyuu.cn
75e66e3b0b 新增合作站点hdhome,可以对使用接口的用户进行认证绑定。 2020-03-12 00:00:53 +08:00
iyuu.cn
948e68f55b 版本号升级到:v1.6.0 2020-03-11 23:46:42 +08:00
iyuu.cn
c35bbe0c91 新增合作站点hddolby,可以对使用接口的用户进行认证绑定。 2020-03-11 23:42:39 +08:00
iyuu.cn
fb68d21589 更新最简配置wiki 2020-03-10 14:38:28 +08:00
65 changed files with 4113 additions and 2236 deletions

2
.dockerignore Normal file
View File

@@ -0,0 +1,2 @@
.git
*

79
.gitignore vendored Normal file
View File

@@ -0,0 +1,79 @@
/composer
/config/config.php
/config/*.json
/php
/torrent
/runtime
/*.bat
/composer.lock
.idea
.php_cs.cache
composer.phar
.fuse_hidden*
.directory
.Trash-*
.nfs*
### OSX ###
# General
.DS_Store
.AppleDouble
.LSOverride
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# End of https://www.toptal.com/developers/gitignore/api/osx,linux,windows,visualstudiocode,composer

4
1.Windows辅种.cmd Normal file
View File

@@ -0,0 +1,4 @@
@echo off
chcp 65001
%~dp0php\php %~dp0iyuu.php
pause

View File

@@ -2,4 +2,5 @@
chcp 65001
git fetch --all
git reset --hard origin/master
git pull
php %~dp0iyuu.php
pause

View File

@@ -0,0 +1,4 @@
@echo off
chcp 65001
php %~dp0iyuu.php
pause

114
Dockerfile Normal file
View File

@@ -0,0 +1,114 @@
#FROM alpine:latest
#FROM alpine:3.12
FROM alpine:3.8
#FROM swoft/alphp:base
#FROM swoft/alphp:cli
LABEL maintainer="david <367013672@qq.com>" version="1.0"
##
# ---------- env settings ----------
##
# --build-arg timezone=Asia/Shanghai
ARG timezone
# prod pre test dev
ARG app_env=prod
# default use www-data user
# ARG add_user=www-data
ENV APP_ENV=${app_env:-"prod"} \
TIMEZONE=${timezone:-"Asia/Shanghai"} \
cron="3 */10 * * *"
##
# ---------- building ----------
##
RUN set -ex \
# change apk source repo
#&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
&& apk update \
&& apk add --no-cache \
# Install base packages ('ca-certificates' will install 'nghttp2-libs')
# ca-certificates \
# curl \
# tar \
# xz \
# libressl \
# openssh \
# openssl \
git \
tzdata \
# pcre \
# install php7 and some extensions
php7 \
# php7-common \
# php7-bcmath \
php7-curl \
# php7-ctype \
php7-dom \
# php7-fileinfo \
# php7-gettext \
# php7-gd \
# php7-iconv \
# php7-imagick \
php7-json \
php7-mbstring \
#php7-mongodb \
# php7-mysqlnd \
# php7-openssl \
# php7-opcache \
# php7-pdo \
# php7-pdo_mysql \
# php7-pdo_sqlite \
# php7-phar \
# php7-pcntl \
# php7-posix \
# php7-redis \
php7-simplexml \
# php7-sockets \
# php7-sodium \
# php7-sqlite \
# php7-session \
# php7-sysvshm \
# php7-sysvmsg \
# php7-sysvsem \
# php7-tokenizer \
php7-zip \
# php7-zlib \
php7-xml \
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /IYUU \
&& cp /IYUU/config/config.sample.php /IYUU/config/config.php \
&& ln -sf /IYUU/config/config.php /config.php \
&& cp /IYUU/docker/entrypoint.sh /entrypoint.sh \
&& chmod +x /entrypoint.sh \
&& apk del --purge *-dev \
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/share/php7 \
# ---------- some config,clear work ----------
&& cd /etc/php7 \
# - config PHP
&& { \
echo "upload_max_filesize=100M"; \
echo "post_max_size=108M"; \
echo "memory_limit=1024M"; \
echo "date.timezone=${TIMEZONE}"; \
} | tee conf.d/99-overrides.ini \
# - config timezone
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone \
&& echo '2 */5 * * * cd /IYUU && git fetch --all && git reset --hard origin/master' >> /etc/crontabs/root \
#&& echo "${cron} /usr/bin/php /IYUU/iyuu.php &> /dev/null" >> /etc/crontabs/root \
# ---------- some config work ----------
# - ensure 'www-data' user exists(82 is the standard uid/gid for "www-data" in Alpine)
# && addgroup -g 82 -S ${add_user} \
# && adduser -u 82 -D -S -G ${add_user} ${add_user} \
# # - create user dir
# && mkdir -p /data \
# && chown -R ${add_user}:${add_user} /data \
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
# EXPOSE 9000
# VOLUME ["/IYUU", "/data"]
WORKDIR /IYUU
ENTRYPOINT ["/entrypoint.sh"]

File diff suppressed because it is too large Load Diff

View File

@@ -1,66 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: David <367013672@qq.com>
* Date: 2020-2-14
* Time: 21:31:49
*/
namespace IYUU\Client;
abstract class AbstractClient
{
/**
* 公共方法:创建客户端实例
*/
public static function create($config = array())
{
$type = $config['type'];
$host = $config['host'];
$username = $config['username'];
$password = $config['password'];
$file = __DIR__ . DIRECTORY_SEPARATOR . $type . DIRECTORY_SEPARATOR . $type .'.php';
if (!is_file($file)) {
die($file.' 文件不存在');
}
$className = "\IYUU\Client\\" . $type . "\\" . $type;
if (class_exists($className)) {
echo $type." 客户端正在实例化!".PHP_EOL;
return new $className($host, $username, $password);
} else {
die($className.' 客户端不存在');
}
}
/**
* 查询Bittorrent客户端状态
*
* @return string
*/
abstract public function status();
/**
* 获取种子列表
* @return array(
'hash' => string json,
'sha1' => string,
'hashString '=> array
)
*/
abstract public function getList(&$move = array());
/**
* 添加种子连接
*/
abstract public function add($torrent_url, $save_path = '', $extra_options = array());
/**
* 添加种子原数据
*/
abstract public function add_metainfo($torrent_url, $save_path = '', $extra_options = array());
/**
* 删除种子
*/
abstract public function delete($hash, $deleteFiles = false);
}

View File

@@ -1,350 +0,0 @@
<?php
namespace IYUU\Client\qBittorrent;
use Curl\Curl;
use IYUU\Client\AbstractClient;
/**
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation
*/
class qBittorrent extends AbstractClient
{
private $debug;
private $url;
private $api_version;
private $curl;
protected $delimiter;
private $endpoints = [
'login' => [
'1' => '/login',
'2' => '/api/v2/auth/login'
],
'app_version' => [
'1' => '/version/qbittorrent',
'2' => '/api/v2/app/version'
],
'api_version' => [
'1' => '/version/api',
'2' => '/api/v2/app/webapiVersion'
],
'build_info' => [
'1' => null,
'2' => '/api/v2/app/buildInfo'
],
'preferences' => [
'1' => null,
'2' => '/api/v2/app/preferences'
],
'setPreferences' => [
'1' => null,
'2' => '/api/v2/app/setPreferences'
],
'defaultSavePath' => [
'1' => null,
'2' => '/api/v2/app/defaultSavePath'
],
'torrent_list' => [
'1' => null,
'2' => '/api/v2/torrents/info'
],
'torrent_add' => [
'1' => null,
'2' => '/api/v2/torrents/add'
],
'torrent_delete' => [
'1' => null,
'2' => '/api/v2/torrents/delete'
],
'torrent_pause' => [
'1' => null,
'2' => '/api/v2/torrents/pause'
],
'torrent_resume' => [
'1' => null,
'2' => '/api/v2/torrents/resume'
],
'set_torrent_location' => [
'1' => null,
'2' => '/api/v2/torrents/setLocation'
],
'maindata' => [
'1' => null,
'2' => '/api/v2/sync/maindata'
]
];
public function __construct($url='', $username='', $password='', $api_version = 2, $debug = false)
{
$this->debug = $debug;
$this->url = rtrim($url, '/');
$this->username = $username;
$this->password = $password;
$this->api_version = $api_version;
$this->curl = new Curl();
$this->curl->setOpt(CURLOPT_SSL_VERIFYPEER, false); // 禁止验证证书
$this->curl->setOpt(CURLOPT_SSL_VERIFYHOST, false); // 不检查证书
$this->curl->setOpt(CURLOPT_CONNECTTIMEOUT, 60); // 超时
$this->curl->setOpt(CURLOPT_TIMEOUT, 600); // 超时
// Authenticate and get cookie, else throw exception
if (!$this->authenticate()) {
throw new \Exception("qBittorrent Unable to authenticate with Web Api.");
}
}
public function appVersion()
{
return $this->getData('app_version');
}
public function apiVersion()
{
return $this->getData('api_version');
}
public function buildInfo()
{
return $this->getData('build_info');
}
public function preferences($data = null)
{
if (!empty($data)) {
return $this->postData('setPreferences', ['json' => json_encode($data)]);
}
return $this->getData('preferences');
}
public function torrentList()
{
return $this->getData('torrent_list');
}
/**
* @param array $extra_options
array(
'urls' => '',
'savepath' => '',
'cookie' => '',
'category' => '',
'skip_checking' => true,
'paused' => true,
'root_folder' => true,
)
* @return array
*/
public function add($torrent_url, $save_path = '', $extra_options = array())
{
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));
return $this->postData('torrent_add', $post_data);
}
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
{
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);
// 设置请求头
$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 torrentDeleteAll($deleteFiles = false)
{
$torrents = json_decode($this->torrentList());
$response = '';
foreach ($torrents as $torrent) {
$response .= $this->torrentDelete($torrent->hash, $deleteFiles);
}
return $response;
}
public function torrentPause($hash)
{
return $this->postData('torrent_pause', ['hashes' => $hash]);
}
public function torrentResume($hash)
{
return $this->postData('torrent_resume', ['hashes' => $hash]);
}
public function setTorrentLocation($hash, $location)
{
return $this->postData('set_torrent_location', ['hashes' => $hash, 'location' => $location]);
}
private function getData($endpoint)
{
$this->curl->get($this->url . $this->endpoints[$endpoint][$this->api_version]);
if ($this->debug) {
var_dump($this->curl->request_headers);
var_dump($this->curl->response_headers);
}
if ($this->curl->error) {
return $this->errorMessage();
}
return $this->curl->response;
}
private function postData($endpoint, $data)
{
$this->curl->post($this->url . $this->endpoints[$endpoint][$this->api_version], $data);
if ($this->debug) {
var_dump($this->curl->request_headers);
var_dump($this->curl->response_headers);
}
if ($this->curl->error) {
return $this->errorMessage();
}
return $this->curl->response;
}
private function authenticate()
{
$this->curl->post($this->url . $this->endpoints['login'][$this->api_version], [
'username' => $this->username,
'password' => $this->password
]);
if ($this->debug) {
var_dump($this->curl->request_headers);
var_dump($this->curl->response_headers);
}
// Find authentication cookie and set in curl connection
foreach ($this->curl->response_headers as $header) {
if (preg_match('/SID=(\S[^;]+)/', $header, $matches)) {
$this->curl->setHeader('Cookie', $matches[0]);
return true;
}
};
return false;
}
private function errorMessage()
{
return 'Curl Error Code: ' . $this->curl->error_code . ' (' . $this->curl->response . ')';
}
/**
* 拼接种子urls multipart/form-data
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
*/
private function buildUrls($param)
{
$this->delimiter = uniqid();
$eol = "\r\n";
$data = '';
// 拼接文件流
foreach ($param as $name => $content) {
$data .= "--" . $this->delimiter . $eol;
$data .= 'Content-Disposition: form-data; name="' .$name. '"' . $eol . $eol;
$data .= $content . $eol;
}
$data .= "--" . $this->delimiter . "--" . $eol;
return $data;
}
/**
* 拼接种子上传文件流 multipart/form-data
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
*/
private function buildData($param)
{
$this->delimiter = uniqid();
$eol = "\r\n";
$data = '';
// 拼接文件流
$data .= "--" . $this->delimiter . $eol;
$data .= 'Content-Disposition: form-data; name="' .$param['name']. '"; filename="'.$param['filename'].'"' . $eol;
$data .= 'Content-Type: application/x-bittorrent' . $eol . $eol;
$data .= $param['torrents'] . $eol;
unset($param['name']);
unset($param['filename']);
unset($param['torrents']);
if (!empty($param)) {
foreach ($param as $name => $content) {
$data .= "--" . $this->delimiter . $eol;
$data .= 'Content-Disposition: form-data; name="' . $name . '"' . $eol . $eol;
$data .= $content . $eol;
}
}
$data .= "--" . $this->delimiter . "--" . $eol;
return $data;
}
/**
* 抽象方法,子类实现
*/
public function status()
{
return $this->appVersion();
}
/**
* 抽象方法,子类实现
*/
public function getList(&$move = array())
{
$result = $this->getData('torrent_list');
$res = json_decode($result, true);
if (empty($res)) {
echo "获取种子列表失败可能qBittorrent暂时无响应请稍后重试".PHP_EOL;
return array();
}
// 过滤,只保留正常做种
$res = array_filter($res, function ($v) {
if (isset($v['state']) && in_array($v['state'], array('uploading','stalledUP','pausedUP','queuedUP','checkingUP','forcedUP'))) {
return true;
}
return false;
}, ARRAY_FILTER_USE_BOTH);
if (empty($res)) {
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
return array();
}
// 提取数组hashString
$info_hash = array_column($res, 'hash');
// 升序排序
sort($info_hash);
$json = json_encode($info_hash, JSON_UNESCAPED_UNICODE);
// 去重 应该从文件读入,防止重复提交
$sha1 = sha1($json);
// 组装返回数据
$hashArray['hash'] = $json;
$hashArray['sha1'] = $sha1;
// 变换数组hashString为键
$hashArray['hashString'] = array_column($res, "save_path", 'hash');
return $hashArray;
}
/**
* 抽象方法,子类实现
*/
public function delete($hash='', $deleteFiles = false)
{
return $this->postData('torrent_delete', ['hashes' => $hash, 'deleteFiles' => $deleteFiles ? 'true':'false']);
}
}

View File

@@ -1,48 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: Rhilip
* Date: 1/17/2020
* Time: 2020
*/
namespace IYUU\Client\transmission;
/**
* This is the type of exception the TransmissionRPC class will throw
*/
class TransmissionRPCException extends \Exception
{
/**
* Exception: Invalid arguments
*/
const E_INVALIDARG = -1;
/**
* Exception: Invalid Session-Id
*/
const E_SESSIONID = -2;
/**
* Exception: Error while connecting
*/
const E_CONNECTION = -3;
/**
* Exception: Error 401 returned, unauthorized
*/
const E_AUTHENTICATION = -4;
/**
* Exception constructor
*/
public function __construct($message = null, $code = 0, \Exception $previous = null)
{
// PHP version 5.3.0 and above support Exception linking
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
parent::__construct($message, $code, $previous);
} else {
parent::__construct($message, $code);
}
}
}

View File

@@ -1,759 +0,0 @@
<?php
/**
* Transmission bittorrent client/daemon RPC communication class
* Copyright (C) 2010 Johan Adriaans <johan.adriaans@gmail.com>,
* Bryce Chidester <bryce@cobryce.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* PHP version specific information
* version_compare() (PHP 4 >= 4.1.0, PHP 5)
* ctype_digit() (PHP 4 >= 4.0.4, PHP 5)
* stream_context_create (PHP 4 >= 4.3.0, PHP 5)
* PHP Class support (PHP 5) (PHP 4 might work, untested)
*/
namespace IYUU\Client\transmission;
use IYUU\Client\AbstractClient;
/**
* A friendly little version check...
*/
if (version_compare(PHP_VERSION, '5.2.10', '<')) {
die("The TransmissionRPC class requires PHP version 5.2.10 or above." . PHP_EOL);
}
/**
* Transmission bittorrent client/daemon RPC communication class
*
* Usage example:
* <code>
* $rpc = new TransmissionRPC($rpc_url);
* $result = $rpc->add_file( $url_or_path_to_torrent, $target_folder );
* </code>
*
*/
class transmission extends AbstractClient
{
/**
* User agent used in all http communication
*/
const HTTP_UA = 'TransmissionRPC for PHP/0.3';
/**
* The URL to the bittorent client you want to communicate with
* the port (default: 9091) can be set in you Transmission preferences
* @var string
*/
public $url = '';
/**
* If your Transmission RPC requires authentication, supply username here
* @var string
*/
public $username = '';
/**
* If your Transmission RPC requires authentication, supply password here
* @var string
*/
public $password = '';
/**
* Print debugging information, default is off
* @var bool
*/
public $debug = false;
/**
* Transmission RPC version
* @var int
*/
protected $rpc_version = 0;
/**
* Transmission uses a session id to prevent CSRF attacks
* @var string
*/
protected $session_id = '';
/**
* Default values for stream context
* @var array
*/
private $default_context_opts = array(
'http' => array(
'user_agent' => self::HTTP_UA,
'timeout' => '60', // Don't want to be too slow
'ignore_errors' => true, // Leave the error parsing/handling to the code
),
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
)
);
/**
* Constants for torrent status
*/
const TR_STATUS_STOPPED = 0;
const TR_STATUS_CHECK_WAIT = 1;
const TR_STATUS_CHECK = 2;
const TR_STATUS_DOWNLOAD_WAIT = 3;
const TR_STATUS_DOWNLOAD = 4;
const TR_STATUS_SEED_WAIT = 5;
const TR_STATUS_SEED = 6;
const RPC_LT_14_TR_STATUS_CHECK_WAIT = 1;
const RPC_LT_14_TR_STATUS_CHECK = 2;
const RPC_LT_14_TR_STATUS_DOWNLOAD = 4;
const RPC_LT_14_TR_STATUS_SEED = 8;
const RPC_LT_14_TR_STATUS_STOPPED = 16;
/**
* Takes the connection parameters
*
* @param string $url
* @param string $username
* @param string $password
*/
public function __construct($url = 'http://127.0.0.1:9091/transmission/rpc', $username = null, $password = null)
{
$this->url = rtrim($url, '/');
$this->username = $username;
$this->password = $password;
}
/**
* Start one or more torrents
*
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws TransmissionRPCException
*/
public function start($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-start", $request);
}
/**
* Stop one or more torrents
*
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws TransmissionRPCException
*/
public function stop($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-stop", $request);
}
/**
* Reannounce one or more torrents
*
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws TransmissionRPCException
*/
public function reannounce($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-reannounce", $request);
}
/**
* Verify one or more torrents
*
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws TransmissionRPCException
*/
public function verify($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-verify", $request);
}
/**
* Get information on torrents in transmission, if the ids parameter is
* empty all torrents will be returned. The fields array can be used to return certain
* fields. Default fields are: "id", "name", "status", "doneDate", "haveValid", "totalSize".
* See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for available fields
*
* @param array fields An array of return fields
* @param int|array ids A list of transmission torrent ids
*
* Request:
* {
* "arguments": {
* "fields": [ "id", "name", "totalSize" ],
* "ids": [ 7, 10 ]
* },
* "method": "torrent-get",
* "tag": 39693
* }
*
* Response:
* {
* "arguments": {
* "torrents": [
* {
* "id": 10,
* "name": "Fedora x86_64 DVD",
* "totalSize": 34983493932,
* },
* {
* "id": 7,
* "name": "Ubuntu x86_64 DVD",
* "totalSize", 9923890123,
* }
* ]
* },
* "result": "success",
* "tag": 39693
* }
* @return mixed
* @throws TransmissionRPCException
*/
public function get($ids = array(), $fields = array())
{
if (!is_array($ids)) {
$ids = array($ids);
} // Convert $ids to an array if only a single id was passed
if (count($fields) == 0) {
$fields = array("id", "name", "status", "doneDate", "haveValid", "totalSize");
} // Defaults
$request = array(
"fields" => $fields,
"ids" => $ids
);
return $this->request("torrent-get", $request);
}
/**
* Set properties on one or more torrents, available fields are:
* "bandwidthPriority" | number this torrent's bandwidth tr_priority_t
* "downloadLimit" | number maximum download speed (in K/s)
* "downloadLimited" | boolean true if "downloadLimit" is honored
* "files-wanted" | array indices of file(s) to download
* "files-unwanted" | array indices of file(s) to not download
* "honorsSessionLimits" | boolean true if session upload limits are honored
* "ids" | array torrent list, as described in 3.1
* "location" | string new location of the torrent's content
* "peer-limit" | number maximum number of peers
* "priority-high" | array indices of high-priority file(s)
* "priority-low" | array indices of low-priority file(s)
* "priority-normal" | array indices of normal-priority file(s)
* "seedRatioLimit" | double session seeding ratio
* "seedRatioMode" | number which ratio to use. See tr_ratiolimit
* "uploadLimit" | number maximum upload speed (in K/s)
* "uploadLimited" | boolean true if "uploadLimit" is honored
* See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for more information
*
* @param array arguments An associative array of arguments to set
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws TransmissionRPCException
*/
public function set($ids = array(), $arguments = array())
{
// See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for available fields
if (!is_array($ids)) {
$ids = array($ids);
} // Convert $ids to an array if only a single id was passed
if (!isset($arguments['ids'])) {
$arguments['ids'] = $ids;
} // Any $ids given in $arguments overrides the method parameter
return $this->request("torrent-set", $arguments);
}
/**
* Add a new torrent
*
* Available extra options:
* key | value type & description
* ---------------------+-------------------------------------------------
* "download-dir" | string path to download the torrent to
* "filename" | string filename or URL of the .torrent file
* "metainfo" | string base64-encoded .torrent content
* "paused" | boolean if true, don't start the torrent
* "peer-limit" | number maximum number of peers
* "bandwidthPriority" | number torrent's bandwidth tr_priority_t
* "files-wanted" | array indices of file(s) to download
* "files-unwanted" | array indices of file(s) to not download
* "priority-high" | array indices of high-priority file(s)
* "priority-low" | array indices of low-priority file(s)
* "priority-normal" | array indices of normal-priority file(s)
*
* Either "filename" OR "metainfo" MUST be included.
* All other arguments are optional.
*
* @param string $torrent_location The URL or path to the torrent file
* @param string $save_path Folder to save torrent in
* @param array $extra_options Optional extra torrent options
* @return mixed
* @throws TransmissionRPCException
*/
public function add_file($torrent_location, $save_path = '', $extra_options = array())
{
if (!empty($save_path)) {
$extra_options['download-dir'] = $save_path;
}
$extra_options['filename'] = $torrent_location;
return $this->request("torrent-add", $extra_options);
}
/* Add a new torrent using a file path or a URL (For backwards compatibility)
* @param torrent_location The URL or path to the torrent file
* @param save_path Folder to save torrent in
* @param extra options Optional extra torrent options
*/
public function add($torrent_location, $save_path = '', $extra_options = array())
{
return $this->add_file($torrent_location, $save_path, $extra_options);
}
/**
* Add a torrent using the raw torrent data
*
* @param string $torrent_metainfo The raw, unencoded contents (metainfo) of a torrent
* @param string $save_path Folder to save torrent in
* @param array $extra_options Optional extra torrent options
* @return mixed
* @throws TransmissionRPCException
*/
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
{
if (!empty($save_path)) {
$extra_options['download-dir'] = $save_path;
}
$extra_options['metainfo'] = base64_encode($torrent_metainfo);
return $this->request("torrent-add", $extra_options);
}
/**
* Remove torrent from transmission
*
* @param bool delete_local_data Also remove local data?
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws TransmissionRPCException
*/
public function delete($ids, $delete_local_data = false)
{
if (!is_array($ids)) {
$ids = array($ids);
} // Convert $ids to an array if only a single id was passed
$request = array(
"ids" => $ids,
"delete-local-data" => $delete_local_data
);
return $this->request("torrent-remove", $request);
}
/**
* Move local storage location
*
* @param int|array ids A list of transmission torrent ids
* @param string target_location The new storage location
* @param string move_existing_data Move existing data or scan new location for available data
* @return mixed
* @throws TransmissionRPCException
*/
public function move($ids, $target_location, $move_existing_data = true)
{
if (!is_array($ids)) {
$ids = array($ids);
} // Convert $ids to an array if only a single id was passed
$request = array(
"ids" => $ids,
"location" => $target_location,
"move" => $move_existing_data
);
return $this->request("torrent-set-location", $request);
}
/**
* 3.7. Renaming a Torrent's Path
*
* Method name: "torrent-rename-path"
*
* For more information on the use of this function, see the transmission.h
* documentation of tr_torrentRenamePath(). In particular, note that if this
* call succeeds you'll want to update the torrent's "files" and "name" field
* with torrent-get.
*
* Request arguments:
*
* string | value type & description
* ---------------------------------+-------------------------------------------------
* "ids" | array the torrent torrent list, as described in 3.1
* | (must only be 1 torrent)
* "path" | string the path to the file or folder that will be renamed
* "name" | string the file or folder's new name
* Response arguments: "path", "name", and "id", holding the torrent ID integer
*
* @param int|array ids A 1-element list of transmission torrent ids
* @param string path The path to the file or folder that will be renamed
* @param string name The file or folder's new name
* @return mixed
* @throws TransmissionRPCException
*/
public function rename($ids, $path, $name)
{
if (!is_array($ids)) {
$ids = array($ids);
} // Convert $id to an array if only a single id was passed
if (count($ids) !== 1) {
throw new TransmissionRPCException('A single id is accepted', TransmissionRPCException::E_INVALIDARG);
}
$request = array(
"ids" => $ids,
"path" => $path,
"name" => $name
);
return $this->request("torrent-rename-path", $request);
}
/**
* Retrieve session statistics
*
* @returns array of statistics
*/
public function sstats()
{
return $this->request("session-stats", array());
}
/**
* Retrieve all session variables
*
* @returns array of session information
*/
public function sget()
{
return $this->request("session-get", array());
}
/**
* Set session variable(s)
*
* @param array of session variables to set
* @return mixed
* @throws TransmissionRPCException
*/
public function sset($arguments)
{
return $this->request("session-set", $arguments);
}
/**
* Return the interpretation of the torrent status
*
* @param int The integer "torrent status"
* @returns string The translated meaning
* @return string
*/
public function getStatusString($intstatus)
{
if ($this->rpc_version < 14) {
if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK_WAIT) {
return "Waiting to verify local files";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK) {
return "Verifying local files";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_DOWNLOAD) {
return "Downloading";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_SEED) {
return "Seeding";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_STOPPED) {
return "Stopped";
}
} else {
if ($intstatus == self::TR_STATUS_CHECK_WAIT) {
return "Waiting to verify local files";
}
if ($intstatus == self::TR_STATUS_CHECK) {
return "Verifying local files";
}
if ($intstatus == self::TR_STATUS_DOWNLOAD) {
return "Downloading";
}
if ($intstatus == self::TR_STATUS_SEED) {
return "Seeding";
}
if ($intstatus == self::TR_STATUS_STOPPED) {
return "Stopped";
}
if ($intstatus == self::TR_STATUS_SEED_WAIT) {
return "Queued for seeding";
}
if ($intstatus == self::TR_STATUS_DOWNLOAD_WAIT) {
return "Queued for download";
}
}
return "Unknown";
}
/**
* Here be dragons (Internal methods)
*/
/**
* Clean up the request array. Removes any empty fields from the request
*
* @param array array The request associative array to clean
* @returns array The cleaned array
* @return array|null
*/
protected function cleanRequestData($array)
{
if (!is_array($array) || count($array) == 0) {
return null;
} // Nothing to clean
setlocale(LC_NUMERIC, 'en_US.utf8'); // Override the locale - if the system locale is wrong, then 12.34 will encode as 12,34 which is invalid JSON
foreach ($array as $index => $value) {
if (is_object($value)) {
$array[$index] = $value->toArray();
} // Convert objects to arrays so they can be JSON encoded
if (is_array($value)) {
$array[$index] = $this->cleanRequestData($value);
} // Recursion
if (empty($value) && $value !== 0) { // Remove empty members
unset($array[$index]);
continue; // Skip the rest of the tests - they may re-add the element.
}
if (is_numeric($value)) {
$array[$index] = $value + 0;
} // Force type-casting for proper JSON encoding (+0 is a cheap way to maintain int/float/etc)
if (is_bool($value)) {
$array[$index] = ($value ? 1 : 0);
} // Store boolean values as 0 or 1
if (is_string($value)) {
$type = mb_detect_encoding($value, "auto");
if ($type !== 'UTF-8') {
$array[$index] = mb_convert_encoding($value, "UTF-8");
//utf8_encode( $value ); // Make sure all data is UTF-8 encoded for Transmission
}
}
}
return $array;
}
/**
* 执行 rpc 请求
*
* @param string $method 请求类型/方法, 详见 $this->allowMethods
* @param array $arguments 附加参数, 可选
* @return array
* @throws TransmissionRPCException
*/
protected function request($method, $arguments = array())
{
// Check the parameters
if (!is_scalar($method)) {
throw new TransmissionRPCException('Method name has no scalar value', TransmissionRPCException::E_INVALIDARG);
}
if (!is_array($arguments)) {
throw new TransmissionRPCException('Arguments must be given as array', TransmissionRPCException::E_INVALIDARG);
}
$arguments = $this->cleanRequestData($arguments); // Sanitize input
// Grab the X-Transmission-Session-Id if we don't have it already
if (!$this->session_id) {
if (!$this->GetSessionID()) {
throw new TransmissionRPCException('Unable to acquire X-Transmission-Session-Id', TransmissionRPCException::E_SESSIONID);
}
}
$data = array(
'method' => $method,
'arguments' => $arguments
);
$header = array(
'Content-Type: application/json',
'Authorization: Basic ' . base64_encode(sprintf("%s:%s", $this->username, $this->password)),
'X-Transmission-Session-Id: ' . $this->session_id
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $this->username . ':' . $this->password);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_TIMEOUT, 600);
$content = curl_exec($ch);
curl_close($ch);
if (!$content) {
$content = array('result' => 'failed');
}
return json_decode($content, true);
}
/**
* Performs an empty GET on the Transmission RPC to get the X-Transmission-Session-Id
* and store it in $this->session_id
*
* @return string
* @throws TransmissionRPCException
*/
public function GetSessionID()
{
if (!$this->url) {
throw new TransmissionRPCException("Class must be initialized before GetSessionID() can be called.", TransmissionRPCException::E_INVALIDARG);
}
// Setup the context
$contextopts = $this->default_context_opts; // Start with the defaults
// Make sure it's blank/empty (reset)
$this->session_id = null;
// Setup authentication (if provided)
if ($this->username && $this->password) {
$contextopts['http']['header'] = sprintf("Authorization: Basic %s\r\n", base64_encode($this->username . ':' . $this->password));
}
if ($this->debug) {
echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Stream context created with options:" .
PHP_EOL . print_r($contextopts, true);
}
$context = stream_context_create($contextopts); // Create the context for this request
if (!$fp = @fopen($this->url, 'r', false, $context)) { // Open a filepointer to the data, and use fgets to get the result
throw new TransmissionRPCException('Unable to connect to ' . $this->url, TransmissionRPCException::E_CONNECTION);
}
// Check the response (headers etc)
$stream_meta = stream_get_meta_data($fp);
fclose($fp);
if ($this->debug) {
echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Stream meta info: " .
PHP_EOL . print_r($stream_meta, true);
}
if ($stream_meta['timed_out']) {
throw new TransmissionRPCException("Timed out connecting to {$this->url}", TransmissionRPCException::E_CONNECTION);
}
if (substr($stream_meta['wrapper_data'][0], 9, 3) == "401") {
throw new TransmissionRPCException("Invalid username/password.", TransmissionRPCException::E_AUTHENTICATION);
} elseif (substr($stream_meta['wrapper_data'][0], 9, 3) == "409") { // This is what we're hoping to find
// Loop through the returned headers and extract the X-Transmission-Session-Id
foreach ($stream_meta['wrapper_data'] as $header) {
if (strpos($header, 'X-Transmission-Session-Id: ') === 0) {
if ($this->debug) {
echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Session-Id header: " .
PHP_EOL . print_r($header, true);
}
$this->session_id = trim(substr($header, 27));
break;
}
}
if (!$this->session_id) { // Didn't find a session_id
throw new TransmissionRPCException("Unable to retrieve X-Transmission-Session-Id", TransmissionRPCException::E_SESSIONID);
}
} else {
throw new TransmissionRPCException("Unexpected response from Transmission RPC: " . $stream_meta['wrapper_data'][0]);
}
return $this->session_id;
}
/**
* 抽象方法,子类实现
*/
public function status()
{
$rs = $this->sstats();
return isset($rs['result']) ? $rs['result'] : 'error';
}
/**
* 抽象方法,子类实现
*/
public function getList(&$move = array())
{
$ids = array();
$fields = array( "id", "status", "name", "hashString", "downloadDir", "torrentFile" );
$res = $this->get($ids, $fields);
if (isset($res['result']) && $res['result'] == 'success') {
// 成功
} else {
// 失败
echo "获取种子列表失败可能transmission暂时无响应请稍后重试".PHP_EOL;
return array();
}
if (empty($res['arguments']['torrents'])) {
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
return array();
}
$res = $res['arguments']['torrents'];
// 过滤,只保留正常做种
$res = array_filter($res, function ($v) {
return isset($v['status']) && $v['status']===6;
}, ARRAY_FILTER_USE_BOTH);
if (empty($res)) {
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
return array();
}
// 提取数组hashString
$info_hash = array_column($res, 'hashString');
// 升序排序
sort($info_hash);
$json = json_encode($info_hash, JSON_UNESCAPED_UNICODE);
// 去重 应该从文件读入,防止重复提交
$sha1 = sha1($json);
// 组装返回数据
$hashArray['hash'] = $json;
$hashArray['sha1'] = $sha1;
// 变换数组hashString为键
$hashArray['hashString'] = array_column($res, "downloadDir", 'hashString');
$move = array_column($res, null, 'hashString');
return $hashArray;
}
}

View File

@@ -1,9 +1,4 @@
<?php
/**
* @brief 文件处理
* @version 0.6
*/
namespace IYUU\Library;
/**
@@ -13,7 +8,6 @@ namespace IYUU\Library;
class IFile
{
private $resource = null; //文件资源句柄
/**
* @brief 构造函数,打开资源流,并独占锁定
* @param String $fileName 文件路径名
@@ -106,9 +100,10 @@ class IFile
/**
* @brief 创建文件夹
* @param String $path 路径
* @param int $chmod 文件夹权限
* @param String $path 路径
* @param int $chmod 文件夹权限
* @note $chmod 参数不能是字符串(加引号)否则linux会出现权限问题
* @return bool
*/
public static function mkdir($path, $chmod=0777)
{
@@ -119,7 +114,7 @@ class IFile
* @brief 复制文件
* @param String $from 源文件路径
* @param String $to 目标文件路径
* @param String $mod 操作模式c:复制(默认); x:剪切(删除$from文件)
* @param String $mode 操作模式c:复制(默认); x:剪切(删除$from文件)
* @return bool 操作结果 true:成功; false:失败;
*/
public static function copy($from, $to, $mode = 'c')
@@ -184,7 +179,7 @@ class IFile
/**
* @brief 获取文件类型
* @param String $fileName 文件名
* @return String $filetype 文件类型
* @return String|array $filetype 文件类型
* @note 如果文件不存在返回false,如果文件后缀名不在识别列表之内返回NULL对于docx及elsx格式文档识别在会出现识别为ZIP格式的错误这是office2007的bug目前尚未修复请谨慎使用
*/
public static function getFileType($fileName)

View File

@@ -1,78 +1,101 @@
<?php
/**
* IYUU用户注册、认证
*/
namespace IYUU\Library;
use Curl\Curl;
/**
* IYUU用户注册、认证
*/
class Oauth
{
// 合作的站点
public static $sites = ['ourbits'];
// 爱语飞飞token
public static $token = '';
// 合作站点用户id
public static $user_id = 0;
// 合作站点密钥
public static $passkey = '';
// 合作站名字
public static $site = '';
/**
* 初始化配置
*/
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']) {
self::$token = self::getSign();
self::$user_id = $configALL[$name]['id'];
self::$passkey = sha1($configALL[$name]['passkey']); // 避免泄露用户passkey秘钥
self::$site = $name;
return true;
}
}
echo "-----缺少合作站点登录参数token, user_id, passkey, site \n";
echo "-----当前正在使用测试接口,功能可能会受到限制! \n\n";
return false;
}
// 登录缓存路径
const SiteLoginCache = ROOT_PATH.DS.'config'.DS.'siteLoginCache_{}.json';
/**
* 从配置文件内读取爱语飞飞token作为鉴权参数
*/
public static function getSign()
{
global $configALL;
// 爱语飞飞
$token = isset($configALL['iyuu.cn']) && $configALL['iyuu.cn'] ? $configALL['iyuu.cn'] : '';
if (empty($token) || strlen($token)<46) {
echo "缺少辅种接口请求参数爱语飞飞token \n";
echo "请访问https://iyuu.cn 用微信扫码申请并填入配置文件config.php内。\n\n";
$token = empty($configALL['iyuu.cn']) ? '' : $configALL['iyuu.cn'];
if (empty($token) || strlen($token) < 46) {
echo "缺少辅种接口请求参数爱语飞飞token ".PHP_EOL;
echo "请访问https://iyuu.cn 用微信扫码申请并填入配置文件config.php内。".PHP_EOL.PHP_EOL;
exit(1);
}
return $token;
}
/**
* 用户注册与登录
* 作用在服务器端实现微信用户与合作站点用户id的关联
* 参数爱语飞飞token + 合作站点用户id + sha1(合作站点密钥passkey) + 合作站点标识
* @param string $apiUrl
* @param array $sites
* @return bool
* @throws \ErrorException
*/
public static function login($apiUrl = '')
public static function login($apiUrl = '', $sites = array())
{
$is_oauth = self::init();
if ($is_oauth) {
$curl = new Curl();
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
$data = [
'token' => self::$token,
'id' => self::$user_id,
'passkey'=> self::$passkey,
'site' => self::$site,
];
$res = $curl->get($apiUrl, $data);
p($res->response);
return true;
global $configALL;
// 云端下发合作的站点标识
if (empty($sites)) {
die('云端下发合作站点信息失败,请稍后重试');
}
return false;
$_sites = array_column($sites, 'site');
$ret = false;
$token = self::getSign();
foreach ($_sites as $k => $site) {
if (is_file(str_replace('{}', $site, self::SiteLoginCache))) {
// 存在鉴权缓存
$ret = true;
continue;
}
if (isset($configALL[$site]['passkey']) && $configALL[$site]['passkey'] && isset($configALL[$site]['id']) && $configALL[$site]['id']) {
$user_id = $configALL[$site]['id'];
$passkey = $configALL[$site]['passkey'];
$curl = new Curl();
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
$data = [
'token' => $token,
'id' => $user_id,
'passkey'=> sha1($passkey), // 避免泄露用户passkey秘钥
'site' => $site,
];
$res = $curl->get($apiUrl, $data);
p($res->response);
$rs = json_decode($res->response, true);
if (isset($rs['ret']) && ($rs['ret'] === 200) && isset($rs['data']['success']) && $rs['data']['success']) {
self::setSiteLoginCache($site, $rs);
$ret = true;
} else {
$msg = !empty($rs['msg']) ? $rs['msg'] : '远端服务器无响应,请稍后重试!';
$msg = !empty($rs['data']['errmsg']) ? $rs['data']['errmsg'] : $msg;
echo $msg . PHP_EOL;
}
} else {
echo $site.'合作站点参数配置不完整请同时填写passkey和用户id。' . PHP_EOL;
echo '合作站点鉴权配置请查阅https://www.iyuu.cn/archives/337/'. PHP_EOL. PHP_EOL;
}
}
return $ret;
}
/**
* 写鉴权成功缓存
* @desc 作用:减少对服务器请求,跳过鉴权提示信息;
* @param string $site
* @param array $array
* @return bool|int
*/
private static function setSiteLoginCache($site = '', $array = [])
{
$json = json_encode($array, JSON_UNESCAPED_UNICODE);
$myfile = str_replace('{}', $site, self::SiteLoginCache);
$file_pointer = @fopen($myfile, "w");
$worldsnum = @fwrite($file_pointer, $json);
@fclose($file_pointer);
return $worldsnum;
}
}

View File

@@ -1,54 +1,47 @@
<?php
namespace IYUU\Library;
/**
* Created by PhpStorm.
* User: 大卫
* Date: 2020-1-19
* Time: 17:44
*/
namespace IYUU\Library;
class Table
{
const ALIGN_LEFT = 1;
const ALIGN_RIGHT = 0;
const ALIGN_CENTER = 2;
/**
* 头信息数据
* @var array
*/
protected $header = [];
/**
* 头部对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER
* @var int
*/
protected $headerAlign = 1;
/**
* 表格数据(二维数组)
* @var array
*/
protected $rows = [];
/**
* 单元格对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER
* @var int
*/
protected $cellAlign = 1;
/**
* 单元格宽度信息
* @var array
*/
protected $colWidth = [];
/**
* 表格输出样式
* @var string
*/
protected $style = 'default';
/**
* 表格样式定义
* @var array

View File

@@ -1,5 +1,4 @@
<?php
use IYUU\Library\IFile;
use IYUU\Library\Table;
@@ -198,14 +197,14 @@ function convertToMB($from)
/**
* 字节数Byte转换为KB、MB、GB、TB
*
* @param $num
* @return string
*/
function getFilesize($num)
{
$p = 0;
$format='bytes';
if ($num>0 && $num<1024) {
$p = 0;
return number_format($num).' '.$format;
}
if ($num>=1024 && $num<pow(1024, 2)) {
@@ -394,8 +393,9 @@ function sign($timestamp)
/**
* @brief 分离token中的用户uid
* token算法IYUU + uid + T + sha1(openid+time+盐)
* @param string $token 用户请求token
* @desc token算法IYUU + uid + T + sha1(openid+time+盐)
* @param string $token 用户请求token
* @return bool|string
*/
function getUid($token)
{
@@ -457,3 +457,12 @@ function isWin()
{
return (DIRECTORY_SEPARATOR == '\\') ? true : false;
}
function sleepIYUU($t, $msg)
{
echo $msg . PHP_EOL;
do {
echo microtime(true).$msg.' '.$t.'秒后继续...'.PHP_EOL;
sleep(1);
} while (--$t > 0);
}

30
backup.sh Normal file
View File

@@ -0,0 +1,30 @@
#!/bin/sh
# 传入的种子备份参数
if [ $1 ]; then
AppName=$1
else
echo 'AppName not null'
exit 1
fi
if [ $2 ]; then
torrentDir=$2
else
echo 'torrentDir not null'
exit 2
fi
# 脚本当前目录
pwddir=$(cd $(dirname $0); pwd)
# 当前日期
DATE=$(date +%Y%m%d)
# 备份在当前目录
backupdir=$pwddir"/"$AppName$DATE
echo "种子备份目录:"$backupdir
mkdir $backupdir -p
# 种子目录
torrentDir=$torrentDir"/*"
# 备份
cp -rf $torrentDir $backupdir
# 成功提示
echo "ok";

View File

@@ -1,2 +0,0 @@
@echo off
composer create-project ledccn/iyuuautoreseed:dev-master

View File

@@ -13,7 +13,8 @@
"ext-json": "*",
"ext-mbstring": "*",
"ext-curl": "*",
"curl/curl": "^2.2"
"curl/curl": "^2.3",
"ledccn/bittorrentclient": "dev-master"
},
"autoload": {
"psr-4": {

83
composer.lock generated
View File

@@ -1,83 +0,0 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "10281f19c929443b7db18d1ab159ec63",
"packages": [
{
"name": "curl/curl",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/php-mod/curl.git",
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-mod/curl/zipball/d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"ext-curl": "*",
"php": "^5.6 | ^7.0"
},
"require-dev": {
"phpunit/phpunit": "^5.7",
"squizlabs/php_codesniffer": "~2.1"
},
"type": "library",
"autoload": {
"psr-0": {
"Curl": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Hassan Amouhzi",
"email": "hassan@anezi.net",
"homepage": "http://hassan.amouhzi.com"
},
{
"name": "php-curl-class",
"homepage": "https://github.com/php-curl-class"
},
{
"name": "user52",
"homepage": "https://github.com/user52"
}
],
"description": "cURL class for PHP",
"homepage": "https://github.com/php-mod/curl",
"keywords": [
"curl",
"dot"
],
"time": "2018-12-04T19:47:03+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"ext-json": "*",
"ext-mbstring": "*",
"ext-curl": "*"
},
"platform-dev": []
}

View File

@@ -2,66 +2,74 @@
/**
* 技术讨论及后续更新请加入QQ群
群名称IYUU自动辅种交流
QQ群号859882209
QQ群号859882209、931954050
* IYUU自动辅种工具-【安装篇】如何下载最新源码? https://www.iyuu.cn/archives/338/
* IYUU自动辅种工具-【安装篇】Windows之git https://www.iyuu.cn/archives/367/
* IYUU自动辅种工具-【安装篇】群晖Linux之git https://www.iyuu.cn/archives/372/
* IYUU自动辅种工具-【安装篇】小钢炮手把手教程 https://www.iyuu.cn/archives/386/
* IYUU自动辅种工具-【安装篇】全平台Docker安装方式 https://www.iyuu.cn/archives/401/
* IYUU自动辅种工具--最简配置(所有平台通用教程) https://www.iyuu.cn/archives/324/
* IYUU自动辅种工具--如何下载最新源码? https://www.iyuu.cn/archives/338/
* IYUU自动辅种工具--合作站点鉴权配置说明 https://www.iyuu.cn/archives/337/
* IYUU自动下载种子--之RSS订阅使用教程 https://www.iyuu.cn/archives/349/
* IYUU自动转移做种客户端--使用教程 https://www.iyuu.cn/archives/351/
脚本仓库下载法:
git clone https://github.com/ledccn/IYUUAutoReseed
脚本仓库GIT下载法:
git clone https://gitee.com/ledc/IYUUAutoReseed.git
cd IYUUAutoReseed
composer install
php ./iyuu.php
*/
return array(
// 有变化才发送通知(辅种成功 + 失败 > 0
'notify_on_change' => false,
// 1.【必须配置】爱语飞飞 微信通知请访问https://iyuu.cn 用微信扫码申请
'iyuu.cn' => 'IYUU',
// 2.server酱 微信通知配置
'sc.ftqq.com' => '',
// 3.发布员鉴权
'secret' => '',
// 4.全局默认配置
// 2.全局默认配置
'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.【自动辅种必须配置】全局客户端设置(条目不够可以复制)
// 3.【必须配置】浏览器UA打开http://demo.iyuu.cn 复制过来即可
'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.1303.189 Safari/537.36',
// 4.【自动辅种必须配置】全局客户端设置(条目不够可以复制)
'clients' => array(
// 全局客户端设置 开始
# 开始
array(
'type' => 'transmission', // 支持transmission、qBittorrent
'host' => 'http://127.0.0.1:9091/transmission/rpc', // 警告注意transmission/rpc这段别动你只需要修改 127.0.0.1:9091
'username' => '',
'password' => '',
'BT_backup' => '/var/lib/transmission/torrents', // 移动做种:如果脚本与当前客户端不在一台机器,必须配置
'move' => 0, // 0不移动1移动并辅种2移动仅辅种自身3未定义
'username' => '', // 没有用户名请填写null
'password' => '', // 没有密码 请填写null
'BT_backup' => '/torrents', // 移动做种:如果脚本与当前客户端不在一台机器,必须配置
'move' => 0, // 0不移动1移动并辅种2移动且只在当前客户端辅种
),
# 结束
# 开始
array(
'type' => 'qBittorrent', // 支持transmission、qBittorrent
'host' => 'http://127.0.0.1:8083',
'username' => '',
'username' => 'admin',
'password' => '',
'BT_backup' => 'C:\Users\ASUS\AppData\Local\qBittorrent\BT_backup', // 移动做种必须配置Linux搜索方法find / -name BT_backup
'move' => 0, // 0不移动1移动并辅种2移动仅辅种自身3未定义
'root_folder'=> 1, // 创建多文件子目录0不创建1创建(下载器默认1)【此处必须与下载器真实配置相同,否则添加任务不会校验!】
'BT_backup' => '/BT_backup', // 移动做种必须配置Linux搜索方法find / -name BT_backup
'move' => 0, // 0不移动1移动并辅种2移动且只在当前客户端辅种
),
# 结束
// 全局客户端设置 结束
),
// 移动做种必须配置
// 5.移动做种必须配置
'move' =>array(
'type' => 0, // 0保持不变1减2加3替换
'path' =>array(
// 当前路径 => 目标路径
'/downloads' => '/volume1',
),
'paused' => 0, //转移成功自动开始任务0开始1暂停
'path_filter'=> array(), //转移过滤器:不转移此路径内文件
'path_selector' => array(), //转移选择器:只转移此路径内文件(为空时,全转移) 【优先级:过滤器 选择器】
'paused' => 1, //转移成功自动开始任务0开始1暂停
'skip_check' => 0, //转移成功跳校验0不跳、1跳校验
'delete_torrent' => 0, //转移成功删除当前做种0不删除、1删除
),
// 6.RSS工作模式
'workingMode' => 0,
'watch' => '/volume1/downloads',
// 7.监控目录
'watch' => '/volume1/watch',
// 8.RSS过滤参数配置
'filter' => array(
'size'=>array(
'min' => '1GB',
@@ -83,58 +91,30 @@ return array(
'CONNECTTIMEOUT'=> 60,
'TIMEOUT' => 600,
),
// 9.server酱 微信通知配置
'sc.ftqq.com' => '',
// 10.发布员鉴权
'secret' => '',
/**
* 以下为各站点的独立配置(互不影响、互不冲突)
* 自动辅种需要配置各站的passkey没有配置passkey的站点会自动跳过
*/
// m-team 序号1
'm-team' => array(
// 14.m-team的cookie 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => 'tp=',
// 15.m-team的passkey 【必须配置】
'passkey' => '',
// 种子Tracker的IP地址选择 可选ipv4ipv6
'ip_type' => 'ipv4',
'clients' => array(
array(
'type' => 'transmission', // 支持transmission、qBittorrent
'host' => 'http://127.0.0.1:9091/transmission/rpc', // 警告注意transmission/rpc这段别动你只需要修改 127.0.0.1:9091
'username' => '',
'password' => '',
'downloadDir'=> '',
),
),
'workingMode' => 1,
'watch' => '',
'filter' => array(
'size'=>array(
'min' => '1GB',
'max' => '280GB',
),
),
),
// keepfrds 序号2
'keepfrds' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'workingMode' => 1,
'watch' => '',
'filter' => array(
'size'=>array(
'min' => '1GB',
'max' => '280GB',
),
),
),
// ourbits 序号3
// 【合作站点用户鉴权】ourbits
'ourbits' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'id' => 0, // 用户ID(不是用户名)
'url_replace' => array(),
'url_join' => array(
//'ipv6=1', // 种子Tracker的IP地址选择 可选ipv4ipv6
//'https=1',
),
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 15, // 最少休眠15秒
),
'workingMode' => 0,
'watch' => '/root/downloads',
'filter' => array(
@@ -143,80 +123,164 @@ return array(
'max' => '280GB',
),
),
),
// HDSky 序号4
'hdsky' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// pter 序号5
'pter' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// tjupt 序号6
'tjupt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// hdhome 序号7
'hdhome' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// btschool 序号8
'btschool' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// PTHome 序号9
'pthome' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// hddolby 序号10
// 【合作站点用户鉴权】hddolby
'hddolby' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
// 如果需要辅种,必须配置
'rss' => '',
'id' => 0, // 用户ID(不是用户名)
'url_replace' => array(),
'url_join' => array(),
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 5, // 最少休眠5秒
),
),
// TorrentCCF 序号11
// 【合作站点用户鉴权】hdhome
'hdhome' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
// 如果需要辅种,必须配置
'rss' => '',
'id' => 0, // 用户ID(不是用户名)
'url_replace' => array(),
'url_join' => array(),
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 5, // 最少休眠5秒
),
),
// 【合作站点用户鉴权】PTHome
'pthome' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
// 如果需要辅种,必须配置
'rss' => '',
'id' => 0, // 用户ID(不是用户名)
'url_replace' => array(),
'url_join' => array(),
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 5, // 最少休眠5秒
),
),
// 【合作站点用户鉴权】chdbits
'chdbits' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'id' => 0, // 用户ID(不是用户名)
'url_replace' => array(),
'url_join' => array(),
),
// HDAI
'hdai' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'id' => 0, // 用户ID(不是用户名)
'url_replace' => array(),
'url_join' => array(),
),
// m-team
'm-team' => array(
// 14.m-team的cookie 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => 'tp=',
// 15.m-team的passkey 【必须配置】
'passkey' => '',
'url_replace' => array(),
'url_join' => array(
//'ipv6=1', // 种子Tracker的IP地址选择 可选ipv4ipv6
'https=1',
),
),
// keepfrds
'keepfrds' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
'workingMode' => 1,
'watch' => '',
'filter' => array(
'size'=>array(
'min' => '1GB',
'max' => '280GB',
),
),
),
// pter
'pter' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// tjupt
'tjupt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// btschool
'btschool' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// HDSky
'hdsky' => array(
// 如果需要自动辅种,必须配置此项
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 20, // 最少休眠20秒
),
'url_replace' => array(),
'url_join' => array(),
),
// TorrentCCF
'torrentccf' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// PTMSG 序号12
// PTMSG
'ptmsg' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// MoeCat 序号13
'moecat' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
// 种子Tracker的IP地址选择 可选ipv4ipv6
'ip_type' => 'ipv4',
),
// totheglory 序号14
// totheglory
'ttg' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
@@ -224,252 +288,403 @@ return array(
'passkey' => '',
// 如果需要rss订阅必须配置
'rss' => '',
'url_replace' => array(),
'url_join' => array(),
),
// nanyangpt 序号15
// nanyangpt
'nanyangpt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// springsunday.net 序号16
// springsunday.net
'ssd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 15, // 最少休眠15秒
),
),
// yingk 序号17
// yingk
'yingk' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdcity 序号18
// hdcity
'hdcity' => array(
// 必须配置
'cookie' => '',
// 如果需要自动辅种必须配置cuhash
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// 52pt.site 序号19
// 52pt.site
'52pt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// brobits.cc 序号20
// brobits
'brobits' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// www.beitai.pt 序号21
// beitai
'beitai' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// pt.eastgame.org 序号22
// eastgame
'eastgame' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// pt.soulvoice.club 序号23
// soulvoice
'soulvoice' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// chdbits 序号24
'chdbits' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// leaguehd 序号25
// leaguehd
'leaguehd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// ptsbao.club 序号26
// ptsbao
'ptsbao' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdchina 序号27
// hdchina
'hdchina' => array(
// 必须配置
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
'limitRule' => array(
'count' => 10, // 每次辅种10个
'sleep' => 5, // 最少休眠15秒
),
),
// hdarea 序号28
// hdarea
'hdarea' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdtime 序号29
// hdtime
'hdtime' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// 1ptba 序号30
// 1ptba
'1ptba' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hd4fans 序号31
// hd4fans
'hd4fans' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hddisk.life 序号32
// hddisk.life
'hdbug' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// opencd 序号33 皇后
// opencd皇后
'opencd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdstreet 序号34
// hdstreet
'hdstreet' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// joyhd 序号35
// joyhd
'joyhd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// dmhy 序号36 幼儿园
// dmhy幼儿园
'dmhy' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdu 序号37
// hdu
'upxin' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// oshen 序号38
// oshen
'oshen' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// discfan 序号39 港知堂
// discfan港知堂
'discfan' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdzone 序号40
// hdzone
'hdzone' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// nicept 序号42 老师
// nicept老师
'nicept' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdbd 序号43 伊甸园
// hdbd伊甸园
'hdbd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(
//'ipv6=1', // 种子Tracker的IP地址选择 可选ipv4ipv6
//'https=1',
),
),
// byr 序号44 北邮
// byr北邮
'byr' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// CCFBits 序号45
// CCFBits
'ccfbits' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdbits 序号46
// hdbits
'hdbits' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// PTPBD 序号47
// PTPBD
'ptpbd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// HD-T 序号48
// HD-T
'hd-torrents' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// skyeysnow 序号50 天雪
// skyeysnow天雪
'skyeysnow' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// pt.sjtu 序号51 葡萄
// pt.sjtu葡萄
'pt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
'limitRule' => array(
'count' => 20, // 每次辅种20个
'sleep' => 20, // 最少休眠20秒
),
),
// 配置文件结束
// hdroute
'hdroute' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// haidan
'haidan' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// hdfans
'hdfans' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// dragonhd
'dragonhd' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// hitpt 百川
'hitpt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// pttime PT时间
'pttime' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
'url_replace' => array(),
'url_join' => array(),
),
// npupt 蒲公英
'npupt' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
// hdatmos 阿童木
'hdatmos' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '',
),
'greatposterwall' => array(
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
'cookie' => '',
// 如果需要自动辅种,必须配置
'passkey' => '', // torrent_pass
'torrent_pass' => '', // torrent_pass
'authkey' => '', // authkey
),
// 配置结束,后面的一行不能删除,必须保留!!!
);

114
docker/AMD64/Dockerfile Normal file
View File

@@ -0,0 +1,114 @@
#FROM alpine:latest
#FROM alpine:3.12
FROM alpine:3.8
#FROM swoft/alphp:base
#FROM swoft/alphp:cli
LABEL maintainer="david <367013672@qq.com>" version="1.0"
##
# ---------- env settings ----------
##
# --build-arg timezone=Asia/Shanghai
ARG timezone
# prod pre test dev
ARG app_env=prod
# default use www-data user
# ARG add_user=www-data
ENV APP_ENV=${app_env:-"prod"} \
TIMEZONE=${timezone:-"Asia/Shanghai"} \
cron="3 */10 * * *"
##
# ---------- building ----------
##
RUN set -ex \
# change apk source repo
#&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
&& apk update \
&& apk add --no-cache \
# Install base packages ('ca-certificates' will install 'nghttp2-libs')
# ca-certificates \
# curl \
# tar \
# xz \
# libressl \
# openssh \
# openssl \
git \
tzdata \
# pcre \
# install php7 and some extensions
php7 \
# php7-common \
# php7-bcmath \
php7-curl \
# php7-ctype \
php7-dom \
# php7-fileinfo \
# php7-gettext \
# php7-gd \
# php7-iconv \
# php7-imagick \
php7-json \
php7-mbstring \
#php7-mongodb \
# php7-mysqlnd \
# php7-openssl \
# php7-opcache \
# php7-pdo \
# php7-pdo_mysql \
# php7-pdo_sqlite \
# php7-phar \
# php7-pcntl \
# php7-posix \
# php7-redis \
php7-simplexml \
# php7-sockets \
# php7-sodium \
# php7-sqlite \
# php7-session \
# php7-sysvshm \
# php7-sysvmsg \
# php7-sysvsem \
# php7-tokenizer \
php7-zip \
# php7-zlib \
php7-xml \
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /IYUU \
&& cp /IYUU/config/config.sample.php /IYUU/config/config.php \
&& ln -sf /IYUU/config/config.php /config.php \
&& cp /IYUU/docker/entrypoint.sh /entrypoint.sh \
&& chmod +x /entrypoint.sh \
&& apk del --purge *-dev \
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/share/php7 \
# ---------- some config,clear work ----------
&& cd /etc/php7 \
# - config PHP
&& { \
echo "upload_max_filesize=100M"; \
echo "post_max_size=108M"; \
echo "memory_limit=1024M"; \
echo "date.timezone=${TIMEZONE}"; \
} | tee conf.d/99-overrides.ini \
# - config timezone
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone \
&& echo '2 */5 * * * cd /IYUU && git fetch --all && git reset --hard origin/master' >> /etc/crontabs/root \
#&& echo "${cron} /usr/bin/php /IYUU/iyuu.php &> /dev/null" >> /etc/crontabs/root \
# ---------- some config work ----------
# - ensure 'www-data' user exists(82 is the standard uid/gid for "www-data" in Alpine)
# && addgroup -g 82 -S ${add_user} \
# && adduser -u 82 -D -S -G ${add_user} ${add_user} \
# # - create user dir
# && mkdir -p /data \
# && chown -R ${add_user}:${add_user} /data \
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
# EXPOSE 9000
# VOLUME ["/IYUU", "/data"]
WORKDIR /IYUU
ENTRYPOINT ["/entrypoint.sh"]

4
docker/AMD64/build.sh Normal file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
docker build -t iyuu:latest .
docker run -it -v /root/config.php:/config.php --network bridge --name IYUUAutoReseed --restart always -d iyuu:latest
docker exec -it IYUUAutoReseed php iyuu.php

32
docker/Arm64v8/Dockerfile Normal file
View File

@@ -0,0 +1,32 @@
# FROM arm64v8/alpine
# FROM arm64v8/alpine:latest
FROM arm64v8/alpine:3.12
ENV TZ Asia/Shanghai
ENV cron="3 */10 * * *"
RUN set -ex \
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
# && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.cn/' /etc/apk/repositories \
&& apk update \
&& apk add --no-cache \
tzdata \
php7 php7-curl php7-json php7-mbstring php7-dom php7-simplexml php7-xml php7-zip \
git \
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /IYUU \
&& cp /IYUU/config/config.sample.php /IYUU/config/config.php \
&& ln -sf /IYUU/config/config.php /config.php \
&& cp /IYUU/docker/entrypoint.sh /entrypoint.sh \
&& chmod +x /entrypoint.sh \
&& apk del --purge *-dev \
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man \
&& echo "${TZ}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
# && echo '* * * * * echo "iyuu.cn" >/dev/null 2>&1' >> /etc/crontabs/root \
&& echo '3 */6 * * * cd /IYUU && git fetch --all && git reset --hard origin/master' >> /etc/crontabs/root \
# && echo "${cron} /usr/bin/php /IYUU/iyuu.php >/dev/null 2>&1" >> /etc/crontabs/root \
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
WORKDIR /IYUU
ENTRYPOINT ["/entrypoint.sh"]

View File

@@ -0,0 +1,4 @@
#!/bin/sh
docker build -t iyuu:arm64v8 .
docker run -it -v /root/config.php:/config.php -v /var/lib/transmission/torrents:/torrents -v /var/lib/qbittorrent/.local/share/data/qBittorrent/BT_backup:/BT_backup --network bridge --name IYUUAutoReseed --restart always -d iyuu:arm64v8
docker exec -it IYUUAutoReseed php iyuu.php

4
docker/Arm64v8/build.sh Normal file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
docker build -f Dockerfile -t iyuu:arm64v8 .
docker run -it -v /root/config.php:/config.php --network bridge --name IYUUAutoReseed --restart always -d iyuu:arm64v8
docker exec -it IYUUAutoReseed php iyuu.php

2
docker/Arm64v8/push.sh Normal file
View File

@@ -0,0 +1,2 @@
docker image tag iyuu:arm64v8 iyuucn/iyuuautoreseed:arm64v8
docker image push iyuucn/iyuuautoreseed:arm64v8

View File

@@ -1,3 +0,0 @@
FROM php:7.4-fpm
EXPOSE 9000
WORKDIR /var/www

View File

@@ -1,51 +0,0 @@
# IYUUAutoReseed自动辅种docker安装教程
第一步复制docker目录到您的Linux的任意目录内
第二步:给予`build.sh``iyuu.sh`可执行权限;
第三步:编译镜像并运行容器,命令为:`./build.sh` 耐心等待完成;
第四步:测试是否安装完成,命令为:`./iyuu.sh`
然后看教程https://www.iyuu.cn/archives/324/,来编辑配置即可。
#### 必读:脚本会在`/root`目录,创建`IYUUAutoReseed`文件夹,您只需要按照上述教程编辑好配置,放到`/root/IYUUAutoReseed/config/config.php`
### 辅种时执行的命令:`iyuu.sh`
## 如何定时辅种?
`iyuu.sh`加入Linux计划任务内。
## 小钢炮qBittorrent连接失败
v4.1.5无法连接请安装灯大高版本的qbittorrent做种列表不丢失且不用校验。
```sh
IMAGE_NAME=80x86/qbittorrent
WEB_PORT=8083
DOWNLOAD_PATH=$(cat /var/lib/qbittorrent/.config/qBittorrent/qBittorrent.conf | grep -i 'Downloads\\SavePath' | cut -d'=' -f2)
BT_PORT=8999
QBT_AUTH_SERVER_ADDR=$(ip -4 addr show docker0 | grep inet | awk '{print $2}' | cut -d'/' -f1)
docker run -d --name qbittorrent \
-e PUID=$(id -u qbittorrent) \
-e PGID=$(cat /etc/group | grep -e '^users' | cut -d':' -f3) \
-e WEB_PORT=$WEB_PORT \
-e BT_PORT=$BT_PORT \
-e QBT_AUTH_SERVER_ADDR=$QBT_AUTH_SERVER_ADDR \
--restart unless-stopped \
-p $WEB_PORT:$WEB_PORT -p $BT_PORT:$BT_PORT/tcp -p $BT_PORT:$BT_PORT/udp \
-v /var/lib/qbittorrent/.config/qBittorrent:/config \
-v /var/lib/qbittorrent/.local/share/data/qBittorrent:/data \
-v "$DOWNLOAD_PATH":/downloads \
--mount type=tmpfs,destination=/tmp \
${IMAGE_NAME}
```

137
docker/Readme.md Normal file
View File

@@ -0,0 +1,137 @@
# 使用方法:
### 1.拉取镜像、创建容器,运行
#### ARM平台通用方法
```
docker run -d \
--name IYUUAutoReseed \
-e cron='0 9 * * 0' \
-v /root/config.php:/config.php \
--restart=always \
iyuucn/iyuuautoreseed:arm64v8
```
#### 小钢炮方法:
```
docker run -d \
--name IYUUAutoReseed \
-e cron='0 8 * * 0' \
-v /root/config.php:/config.php \
-v /var/lib/transmission/torrents:/torrents \
-v /var/lib/qbittorrent/.local/share/data/qBittorrent/BT_backup:/BT_backup \
--restart always \
iyuucn/iyuuautoreseed:arm64v8
```
#### AMD64平台MAC OS、台式、服务器、NAS等
```
docker run -d \
--name IYUUAutoReseed \
-e cron='0 9 * * 0' \
-v /root/config.php:/config.php \
--restart=always \
iyuucn/iyuuautoreseed:latest
```
**命令解释**
| 参数 | 解释 |
| ----------- | ------------------------------------------------------------ |
| `--name` | 容器名字 |
| `-e` | 环境变量,定时任务执行时间 |
| `-v` | 本地目录或文件:容器目录文件,资源挂载到容器。<br />请把你的配置文件放在/root/config.php会把你的配置映射进容器内。 |
| `--restart` | 启动模式 |
------
### 2.停止
```
docker stop IYUUAutoReseed
```
### 3.运行
```
docker start IYUUAutoReseed
```
### 4.删除容器
```
docker rm IYUUAutoReseed
```
### 5.删除镜像
```
docker rmi iyuucn/iyuuautoreseed:arm64v8
```
------
#### 功能
IYUU自动辅种工具功能分为两大块自动辅种、自动转移。
- 自动辅种目前能对国内大部分的PT站点自动辅种支持下载器集群支持多盘位支持多下载目录支持远程连接等
- 自动转移:可以实现各下载器之间自动转移做种客户端,让下载器各司其职(专职的保种、专职的下载)。
#### 原理
IYUU自动辅种工具英文名IYUUAutoReseed是一款PHP语言编写的Private Tracker辅种脚本通过计划任务或常驻内存按指定频率调用transmission、qBittorrent下载软件的API接口提取正在做种的info_hash提交到辅种服务器API接口辅种过程和PT站没有任何交互根据API接口返回的数据拼接种子连接提交给下载器自动辅种各个站点。
#### 优势
- 全程自动化,无需人工干预;
- 支持多盘位,多做种目录,多下载器,支持远程下载器;
- 辅种精确度高,精度可配置;
- 支持微信通知,消息即时达;
- 自动对合集包,进行拆包辅种(暂未开发)
- 安全:所有隐私信息只在本地存储,绝不发送给第三方。
- 拥有专业的问答社区和交流群
#### 支持的下载器
1. transmission
2. qBittorrent
#### 运行环境
具备PHP运行环境的所有平台例如Linux、Windows、MacOS
官方下载的记得开启curl、json、mbstring这3个扩展。
1. Windows安装php环境https://www.php.net/downloads
#### 源码仓库
- github仓库https://github.com/ledccn/IYUUAutoReseed
- 码云仓库https://gitee.com/ledc/IYUUAutoReseed
#### 使用方法
- 博客https://www.iyuu.cn/
#### 接口开发文档
如果您懂得其他语言的开发可以基于接口做成任何您喜欢的样子比如手机APP二进制包Windows的GUI程序浏览器插件等。欢迎分享您的作品
实时更新的接口文档http://api.iyuu.cn/docs.php
#### 需求提交/错误反馈
- QQ群859882209[2000人.入门群]931954050[1000人.进阶群]
- 问答社区http://wenda.iyuu.cn
- 博客https://www.iyuu.cn/
- issues https://gitee.com/ledc/IYUUAutoReseed/issues

View File

@@ -1,9 +0,0 @@
#!/bin/sh
wget -c https://gitee.com/ledc/IYUUAutoReseed/repository/archive/master.zip -O IYUUAutoReseed.zip
wget -c http://api.iyuu.cn/uploads/vendor.zip -O vendor.zip
unzip -o ./IYUUAutoReseed.zip -d /root
unzip -o ./vendor.zip -d /root/IYUUAutoReseed
rm ./IYUUAutoReseed.zip
rm ./vendor.zip
docker build -t iyuu:latest .
docker run -it -v /root/IYUUAutoReseed:/var/www -p 8510:9000 --network bridge --name IYUUAutoReseed --restart always -d iyuu:latest

8
docker/entrypoint.sh Normal file
View File

@@ -0,0 +1,8 @@
#!/bin/sh
DEFAULT_CRON="9 */6 * * *"
cron=${cron:-$DEFAULT_CRON}
set -e
echo "$cron /usr/bin/php /IYUU/iyuu.php" | crontab -
cd /IYUU && git fetch --all && git reset --hard origin/master
/usr/bin/php /IYUU/iyuu.php
/usr/sbin/crond -f

View File

@@ -1,3 +1,20 @@
#!/bin/sh
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
docker exec -it IYUUAutoReseed php iyuu.php
## 相关命令
# 1. 手动执行辅种
docker exec IYUUAutoReseed php iyuu.php
# 2. 手动删除辅种缓存
docker exec -it IYUUAutoReseed rm -rf ./torrent/cachehash
# 3. 手动删除转移缓存
docker exec -it IYUUAutoReseed rm -rf ./torrent/cachemove
# 4. 查看当前定时任务
docker exec -it IYUUAutoReseed crontab -l
# 5. 修改定时任务推荐修改docker容器的环境变量参数cron
docker exec -it IYUUAutoReseed crontab -e
# 6. 进入容器内交互终端
docker exec -it IYUUAutoReseed sh

View File

@@ -1,3 +0,0 @@
#!/bin/sh
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
docker exec IYUUAutoReseed php iyuu.php

View File

@@ -1,5 +1,8 @@
#!/bin/sh
cd /root/IYUUAutoReseed
#脚本功能从git拉取最新代码然后执行辅种
pwddir=$(cd $(dirname $0); pwd)
echo $pwddir
cd $(dirname $0)
git fetch --all
git reset --hard origin/master
git pull
php ./iyuu.php

View File

@@ -1,4 +1,24 @@
<?php
/**
IIIIIIIIIIYYYYYYY YYYYYYYUUUUUUUU UUUUUUUUUUUUUUUU UUUUUUUU
I::::::::IY:::::Y Y:::::YU::::::U U::::::UU::::::U U::::::U
I::::::::IY:::::Y Y:::::YU::::::U U::::::UU::::::U U::::::U
II::::::IIY::::::Y Y::::::YUU:::::U U:::::UUUU:::::U U:::::UU
I::::I YYY:::::Y Y:::::YYY U:::::U U:::::U U:::::U U:::::U
I::::I Y:::::Y Y:::::Y U:::::D D:::::U U:::::D D:::::U
I::::I Y:::::Y:::::Y U:::::D D:::::U U:::::D D:::::U
I::::I Y:::::::::Y U:::::D D:::::U U:::::D D:::::U
I::::I Y:::::::Y U:::::D D:::::U U:::::D D:::::U
I::::I Y:::::Y U:::::D D:::::U U:::::D D:::::U
I::::I Y:::::Y U:::::D D:::::U U:::::D D:::::U
I::::I Y:::::Y U::::::U U::::::U U::::::U U::::::U
II::::::II Y:::::Y U:::::::UUU:::::::U U:::::::UUU:::::::U
I::::::::I YYYY:::::YYYY UU:::::::::::::UU UU:::::::::::::UU
I::::::::I Y:::::::::::Y UU:::::::::UU UU:::::::::UU
IIIIIIIIII YYYYYYYYYYYYY UUUUUUUUU UUUUUUUUU
*/
// 定义目录
defined('ROOT_PATH') or define("ROOT_PATH", __DIR__);
define('DS', DIRECTORY_SEPARATOR);
@@ -30,15 +50,18 @@ if (file_exists(ROOT_PATH."/config/config.php")) {
// 配置(全局变量)
$configALL = require_once ROOT_PATH . "/config/config.php";
} else {
// 第一次会生成
@copy(ROOT_PATH . '/config/config.sample.php', ROOT_PATH . '/config/config.php');
// 示例配置
$configALL = require_once ROOT_PATH . '/config/config.sample.php';
echo microtime(true).' 缺少config.php已载入config.sample.php示例配置。'.PHP_EOL;
echo microtime(true).' 请配置文件改名为config.php以免后续版本升级覆盖配置'.PHP_EOL;
echo microtime(true).' 请编辑配置文件config.php以免后续版本升级覆盖配置'.PHP_EOL;
$t = 30;
do {
echo microtime(true)."配置文件改名为config.php{$t}秒后继续...".PHP_EOL;
echo microtime(true)."编辑配置文件config.php{$t}秒后退出...".PHP_EOL;
sleep(1);
} while (--$t > 0);
exit;
}
echo microtime(true).' 全局配置载入完成!'.PHP_EOL;
// 读取支持列表

View File

@@ -1,10 +1,31 @@
<?php
/**
_____ _____ _____ _____
/\ \ |\ \ /\ \ /\ \
/::\ \ |:\____\ /::\____\ /::\____\
\:::\ \ |::| | /:::/ / /:::/ /
\:::\ \ |::| | /:::/ / /:::/ /
\:::\ \ |::| | /:::/ / /:::/ /
\:::\ \ |::| | /:::/ / /:::/ /
/::::\ \ |::| | /:::/ / /:::/ /
____ /::::::\ \ |::|___|______ /:::/ / _____ /:::/ / _____
/\ \ /:::/\:::\ \ /::::::::\ \ /:::/____/ /\ \ /:::/____/ /\ \
/::\ \/:::/ \:::\____\ /::::::::::\____\|:::| / /::\____\|:::| / /::\____\
\:::\ /:::/ \::/ / /:::/~~~~/~~ |:::|____\ /:::/ /|:::|____\ /:::/ /
\:::\/:::/ / \/____/ /:::/ / \:::\ \ /:::/ / \:::\ \ /:::/ /
\::::::/ / /:::/ / \:::\ \ /:::/ / \:::\ \ /:::/ /
\::::/____/ /:::/ / \:::\ /:::/ / \:::\ /:::/ /
\:::\ \ \::/ / \:::\__/:::/ / \:::\__/:::/ /
\:::\ \ \/____/ \::::::::/ / \::::::::/ /
\:::\ \ \::::::/ / \::::::/ /
\:::\____\ \::::/ / \::::/ /
\::/ / \::/____/ \::/____/
\/____/ ~~ ~~
*/
require_once __DIR__ . '/init.php';
echo __FILE__.PHP_EOL;
sleep(3);
echo '当前脚本路径:'.__FILE__.PHP_EOL;
use IYUU\AutoReseed;
echo microtime(true).' IYUU自动辅种正在初始化...'.PHP_EOL;
AutoReseed::init();
AutoReseed::call();
exit(0);

View File

@@ -10,7 +10,9 @@
第三您使用IYUU工具造成的一切损失与IYUU无关。如不接受此条款请不要使用IYUUAutoReseed并立刻删除已经下载的源码。
## 安装脚本,三种方式皆可
![stars](https://img.shields.io/github/stars/ledccn/IYUUAutoReseed)![forks](https://img.shields.io/github/forks/ledccn/IYUUAutoReseed)![release](https://img.shields.io/github/release/ledccn/IYUUAutoReseed.svg)
## 获取脚本,四种方式皆可
1. 通过git命令安装
@@ -23,55 +25,78 @@
3. 直接下载zip源码包
`https://github.com/ledccn/IYUUAutoReseed/archive/master.zip`
4. Docker使用
[https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker](https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker)
## 功能
IYUU自动辅种工具目前能对国内大部分的PT站点自动辅种支持下载器集群支持多盘位支持多下载目录支持远程连接等
IYUU自动辅种工具功能分为两大块:自动辅种、自动转移
- 自动辅种目前能对国内大部分的PT站点自动辅种支持下载器集群支持多盘位支持多下载目录支持远程连接等
- 自动转移:可以实现各下载器之间自动转移做种客户端,让下载器各司其职(专职的保种、专职的下载)。
## 原理
IYUU自动辅种工具英文名IYUUAutoReseed是一款PHP语言编写的Private Tracker辅种脚本通过计划任务或常驻内存按指定频率调用transmission、qBittorrent下载软件的API接口提取正在做种的info_hash提交到服务器API接口根据API接口返回的数据拼接种子连接提交给下载器自动辅种各个站点。
IYUU自动辅种工具英文名IYUUAutoReseed是一款PHP语言编写的Private Tracker辅种脚本通过计划任务或常驻内存按指定频率调用transmission、qBittorrent下载软件的API接口提取正在做种的info_hash提交到辅种服务器API接口辅种过程和PT站没有任何交互根据API接口返回的数据拼接种子连接提交给下载器自动辅种各个站点。
## 优势
- 全程自动化,无需人工干预;
- 支持多盘位,多做种目录,多下载器,支持远程连接下载器;
- 支持多盘位,多做种目录,多下载器,支持远程下载器;
- 辅种精确度高,精度可配置;
- 支持微信通知,消息即时达;
- 自动对合集包,进行拆包辅种(暂未开发)
- 安全:所有隐私信息只在本地存储,绝不发送给第三方。
- 拥有专业的问答社区和交流群
## 支持的下载器
1. transmission
2. qBittorrent
## 支持自动辅种的站点
学校、杜比、家园、天空、朋友、馒头、萌猫、我堡、猫站、铂金家、烧包、北洋、TCCF、南洋、TTG、映客、城市、52pt、brobits、备胎、SSD、CHD、ptmsg、leaguehd、聆音、瓷器、hdarea、eastgame(TLF)、1ptba、hdtime、hd4fans、opencd、hdbug、hdstreet、joyhd、u2、upxin(HDU)、oshen、discfan(GZT)、cnscg圣城(已删除)、北邮、CCFBits、dicmusic、天雪、葡萄。
学校、杜比、家园、天空、朋友、馒头、萌猫、我堡、猫站、铂金家、烧包、北洋、TCCF、南洋、TTG、映客、城市、52pt、brobits、备胎、SSD、CHD、ptmsg、leaguehd、聆音、瓷器、hdarea、eastgame(TLF)、1ptba、hdtime、hd4fans、opencd、hdbug、hdstreet、joyhd、u2、upxin(HDU)、oshen、discfan(GZT)、cnscg圣城(已删除)、北邮、CCFBits、dicmusic、天雪、葡萄、HDRoute、伊甸园hdbd、海胆haidan、HDfans、龙之家、百川PT、HDAI、蒲公英、阿童木
## 运行环境
具备PHP运行环境的所有平台例如Linux、Windows、MacOS
官方下载的记得开启crul、fileinfo、mbstring这3个扩展。
官方下载的记得开启curl、json、mbstring这3个扩展。
1. Windows安装php环境https://www.php.net/downloads
1. Windows安装php环境https://www.php.net/downloads
## 下载源码
- github仓库https://github.com/ledccn/IYUUAutoReseed
- 码云仓库https://gitee.com/ledc/IYUUAutoReseed
- 仓库下载的源码缺少vendor目录可以去群内下载或者通过安装php包管理器composer进到源码目录内执行命令`composer install`会自动帮你安装vendor目录。
## 使用方法
详见Wiki
https://gitee.com/ledc/IYUUAutoReseed/tree/master/wiki
- 详见Wikihttps://gitee.com/ledc/IYUUAutoReseed/tree/master/wiki
- 博客https://www.iyuu.cn/
## 接口开发文档
http://api.iyuu.cn/docs.php
如果您懂得其他语言的开发可以基于接口做成任何您喜欢的样子比如手机APP二进制包Windows的GUI程序浏览器插件等。欢迎分享您的作品
实时更新的接口文档http://api.iyuu.cn/docs.php
## 相关项目
| 项目名| 简介|
| - | --- |
| [IYUU GUI](https://github.com/Rhilip/IYUU-GUI) | 这是一个基于IYUU提供的API产生一个可视化操作项目。目的是为了降低直接上手PHP版IYUUAutoReseed的困难。 |
| [IYUU-Fly](https://github.com/PlexPt/iyuu-fly) | 带GUI的iyuu自动辅种程序。 |
| [goreseed](https://github.com/gaoluhua99/goreseed) | golang编写调用IYUU接口的CLI辅种程序。 |
| [IYUUAutoReseed-web](https://github.com/goveeta/IYUUAutoReseed-web) | |
| [AutoPT](https://github.com/lyssssssss/AutoPT) | 此程序用于自动下载PT免费种子并自动辅种和一体化管理。开发目的为了释放双手专注观影 |
| [flexget_qbittorrent_mod](https://github.com/IvonWei/flexget_qbittorrent_mod) | Flexget qBittorrent插件实现全自动化辅种删除种免费种筛选签到等。|
## 需求提交/错误反馈
- 点击链接加入群聊【IYUU自动辅种交流】[https://jq.qq.com/?_wv=1027&k=5JOfOlM][1]
- QQ群859882209
- QQ群859882209[2000人群]931954050[1000人群],924099912[2000人群]
- 问答社区http://wenda.iyuu.cn
- 博客https://www.iyuu.cn/
- issues https://gitee.com/ledc/IYUUAutoReseed/issues
## 捐助开发者
@@ -79,7 +104,7 @@ http://api.iyuu.cn/docs.php
如果喜欢,请帮忙在[Github](https://github.com/ledccn/IYUUAutoReseed)或[码云](https://gitee.com/ledc/IYUUAutoReseed)给个Star也可以对IYUUAutoReseed进行[捐赠](https://gitee.com/ledc/IYUUAutoReseed#%E6%8D%90%E5%8A%A9%E5%BC%80%E5%8F%91%E8%80%85)哦 ^_^。
**您所有的打赏将用于服务器续期,增加服务的延续性。**
**您所有的打赏将用于服务器维护及续期,增加服务的延续性。**
@@ -142,6 +167,23 @@ http://api.iyuu.cn/docs.php
| JeSsiE杰西 | ¥66元 | 2020年2月20日19:38 |
| 黄叶梓(炮王) | ¥10元 | 2020年2月20日21:10 |
| 里奥龙 | ¥88.8元 | 2020年2月20日21:48 |
| 寒山先生 | ¥200元 | 2020年2月21日17:32 |
| 李永超 | ¥10元 | 2020年2月22日16:24 |
| Always | ¥5元 | 2020年2月22日21:31 |
| 车站 | ¥30元 | 2020年2月22日21:32 |
| 寒山先生 | ¥200元 | 2020年2月23日22:21 |
| 莫凡 | ¥10元 | 2020年2月24日19:43 |
| 未署名 | ¥200元 | 2020年2月25日14:36 |
| 锦年 | ¥6.66元 | 2020年2月25日19:00 |
| 金力 | ¥10元 | 2020年2月26日22:45 |
| 飞翔鱼 | ¥100元 | 2020年2月24日17:58 |
| 团 | ¥1元 | 2020年2月29日1:12 |
| 沙鸥 | ¥10元 | 2020年2月29日17:03 |
| lsy | ¥229.5元 | 2020年3月1日15:15 |
| 慧宇 | ¥30元 | 2020年3月3日16:39 |
| sz贺贺 | ¥100元 | 2020年3月7日14:40 |
| 一介凡人 | ¥8.88元 | 2020年3月9日22:34 |
| | | |
补充说明:
@@ -150,8 +192,3 @@ http://api.iyuu.cn/docs.php
2. 所捐赠的资源不属于任何个人,而应作为项目或者开发团队的所需开销;
3. 如果捐赠了却不希望您的名字出现在这里,可以联系我们进行相应处理;
4. 更新有延时,如未能及时更新,可联系我。
[1]: https://jq.qq.com/?_wv=1027&k=5JOfOlM
[2]: https://www.iyuu.cn/usr/uploads/2019/12/801558607.png

2
vendor/autoload.php vendored
View File

@@ -4,4 +4,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitd8553673db02b2a444a853f28e16196e::getLoader();
return ComposerAutoloaderInit7e764d8cfe0bacfc97fde5b65088dcb3::getLoader();

View File

@@ -6,5 +6,5 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'f32902f145fce7a432f59959f59e5a18' => $baseDir . '/app/helper.php',
'45702aba72a3d88d5dd1a153f5231b73' => $baseDir . '/app/helper.php',
);

View File

@@ -6,6 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'phpspider\\' => array($vendorDir . '/owner888/phpspider'),
'IYUU\\Client\\' => array($vendorDir . '/ledccn/bittorrentclient/src'),
'IYUU\\' => array($baseDir . '/app'),
);

View File

@@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitd8553673db02b2a444a853f28e16196e
class ComposerAutoloaderInit7e764d8cfe0bacfc97fde5b65088dcb3
{
private static $loader;
@@ -19,15 +19,15 @@ class ComposerAutoloaderInitd8553673db02b2a444a853f28e16196e
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitd8553673db02b2a444a853f28e16196e', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit7e764d8cfe0bacfc97fde5b65088dcb3', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInitd8553673db02b2a444a853f28e16196e', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit7e764d8cfe0bacfc97fde5b65088dcb3', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitd8553673db02b2a444a853f28e16196e::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit7e764d8cfe0bacfc97fde5b65088dcb3::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInitd8553673db02b2a444a853f28e16196e
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInitd8553673db02b2a444a853f28e16196e::$files;
$includeFiles = Composer\Autoload\ComposerStaticInit7e764d8cfe0bacfc97fde5b65088dcb3::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequired8553673db02b2a444a853f28e16196e($fileIdentifier, $file);
composerRequire7e764d8cfe0bacfc97fde5b65088dcb3($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequired8553673db02b2a444a853f28e16196e($fileIdentifier, $file)
function composerRequire7e764d8cfe0bacfc97fde5b65088dcb3($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;

View File

@@ -4,27 +4,24 @@
namespace Composer\Autoload;
class ComposerStaticInitd8553673db02b2a444a853f28e16196e
class ComposerStaticInit7e764d8cfe0bacfc97fde5b65088dcb3
{
public static $files = array (
'f32902f145fce7a432f59959f59e5a18' => __DIR__ . '/../..' . '/app/helper.php',
'45702aba72a3d88d5dd1a153f5231b73' => __DIR__ . '/../..' . '/app/helper.php',
);
public static $prefixLengthsPsr4 = array (
'p' =>
array (
'phpspider\\' => 10,
),
'I' =>
array (
'IYUU\\Client\\' => 12,
'IYUU\\' => 5,
),
);
public static $prefixDirsPsr4 = array (
'phpspider\\' =>
'IYUU\\Client\\' =>
array (
0 => __DIR__ . '/..' . '/owner888/phpspider',
0 => __DIR__ . '/..' . '/ledccn/bittorrentclient/src',
),
'IYUU\\' =>
array (
@@ -45,9 +42,9 @@ class ComposerStaticInitd8553673db02b2a444a853f28e16196e
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitd8553673db02b2a444a853f28e16196e::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitd8553673db02b2a444a853f28e16196e::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInitd8553673db02b2a444a853f28e16196e::$prefixesPsr0;
$loader->prefixLengthsPsr4 = ComposerStaticInit7e764d8cfe0bacfc97fde5b65088dcb3::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit7e764d8cfe0bacfc97fde5b65088dcb3::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit7e764d8cfe0bacfc97fde5b65088dcb3::$prefixesPsr0;
}, null, ClassLoader::class);
}

View File

@@ -1,17 +1,17 @@
[
{
"name": "curl/curl",
"version": "2.2.0",
"version_normalized": "2.2.0.0",
"version": "2.3.0",
"version_normalized": "2.3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-mod/curl.git",
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff"
"reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-mod/curl/zipball/d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
"url": "https://api.github.com/repos/php-mod/curl/zipball/3ad560b1fc1bbdf5c7681356ab953fb961f255e5",
"reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5",
"shasum": "",
"mirrors": [
{
@@ -28,7 +28,7 @@
"phpunit/phpunit": "^5.7",
"squizlabs/php_codesniffer": "~2.1"
},
"time": "2018-12-04T19:47:03+00:00",
"time": "2020-03-19T20:07:26+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -41,15 +41,15 @@
"MIT"
],
"authors": [
{
"name": "php-curl-class",
"homepage": "https://github.com/php-curl-class"
},
{
"name": "Hassan Amouhzi",
"email": "hassan@anezi.net",
"homepage": "http://hassan.amouhzi.com"
},
{
"name": "php-curl-class",
"homepage": "https://github.com/php-curl-class"
},
{
"name": "user52",
"homepage": "https://github.com/user52"
@@ -63,18 +63,18 @@
]
},
{
"name": "owner888/phpspider",
"version": "v2.1.6",
"version_normalized": "2.1.6.0",
"name": "ledccn/bittorrentclient",
"version": "dev-master",
"version_normalized": "9999999-dev",
"source": {
"type": "git",
"url": "https://github.com/owner888/phpspider.git",
"reference": "e6021148adec201418c16ba26f39bc013ba5b4d9"
"url": "https://github.com/ledccn/BittorrentClient.git",
"reference": "d8302133ee50f5bc2f4e95531562cd54dcee6b50"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/owner888/phpspider/zipball/e6021148adec201418c16ba26f39bc013ba5b4d9",
"reference": "e6021148adec201418c16ba26f39bc013ba5b4d9",
"url": "https://api.github.com/repos/ledccn/BittorrentClient/zipball/d8302133ee50f5bc2f4e95531562cd54dcee6b50",
"reference": "d8302133ee50f5bc2f4e95531562cd54dcee6b50",
"shasum": "",
"mirrors": [
{
@@ -84,36 +84,35 @@
]
},
"require": {
"php": ">=5.5.0"
"curl/curl": "^2.3",
"ext-curl": "*",
"ext-json": "*",
"ext-mbstring": "*",
"php": "^5.6 | ^7.0"
},
"suggest": {
"ext-pcntl、ext-redis": "For better performance. "
},
"time": "2018-08-15T08:04:29+00:00",
"time": "2021-01-13T05:14:10+00:00",
"type": "library",
"installation-source": "dist",
"installation-source": "source",
"autoload": {
"psr-4": {
"phpspider\\": "./"
"IYUU\\Client\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
"GPL-3.0-or-later"
],
"authors": [
{
"name": "Seatle Yang",
"email": "seatle@foxmail.com",
"homepage": "http://www.phpspider.org",
"role": "Developer"
"name": "David",
"email": "367013672@qq.com"
}
],
"description": "The PHPSpider Framework.",
"homepage": "http://www.phpspider.org",
"description": "实现对下载服务器管理的代码库",
"homepage": "https://github.com/ledccn/BittorrentClient",
"keywords": [
"framework",
"phpspider"
"qbittorrent",
"transmission"
]
}
]

View File

@@ -27,7 +27,6 @@ tests-php5.6:
- php --version
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
- php composer.phar install
@@ -36,7 +35,6 @@ tests-php5.6:
cache:
key: php5.6
paths:
- composer.phar
- vendor
tests-php7.0:
@@ -51,7 +49,6 @@ tests-php7.0:
- php --version
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
- php composer.phar install
@@ -75,7 +72,6 @@ tests-php7.1:
- php --version
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
- php composer.phar install
@@ -89,25 +85,37 @@ tests-php7.1:
- vendor
tests-php7.2:
image: alpine:3.8
image: alpine:3.9
stage: test
services:
- name: "$CI_REGISTRY_IMAGE:server-test"
alias: server_test
script:
- apk add --no-cache php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml
- apk add --no-cache composer php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml
- php --version
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
- php composer.phar install
- composer install
- vendor/bin/phpcs --warning-severity=0 --standard=PSR2 src
- nohup php -S localhost:8000 -t tests/server/php-curl-test > phpd.log 2>&1 &
- vendor/bin/phpunit
cache:
key: php7.2
paths:
- composer.phar
- vendor
tests-php7.3:
image: alpine:3.11
stage: test
services:
- name: "$CI_REGISTRY_IMAGE:server-test"
alias: server_test
script:
- apk add --no-cache composer php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml
- php --version
- composer install
- vendor/bin/phpcs --warning-severity=0 --standard=PSR2 src
- nohup php -S localhost:8000 -t tests/server/php-curl-test > phpd.log 2>&1 &
- vendor/bin/phpunit
cache:
key: php7.3
paths:
- vendor

View File

@@ -78,12 +78,12 @@ class Curl
public $curl;
/**
* @var bool Whether an error occured or not
* @var bool Whether an error occurred or not
*/
public $error = false;
/**
* @var int Contains the error code of the curren request, 0 means no error happend
* @var int Contains the error code of the current request, 0 means no error happened
*/
public $error_code = 0;
@@ -93,12 +93,12 @@ class Curl
public $error_message = null;
/**
* @var bool Whether an error occured or not
* @var bool Whether an error occurred or not
*/
public $curl_error = false;
/**
* @var int Contains the error code of the curren request, 0 means no error happend.
* @var int Contains the error code of the current request, 0 means no error happened.
* @see https://curl.haxx.se/libcurl/c/libcurl-errors.html
*/
public $curl_error_code = 0;
@@ -109,7 +109,7 @@ class Curl
public $curl_error_message = null;
/**
* @var bool Whether an error occured or not
* @var bool Whether an error occurred or not
*/
public $http_error = false;
@@ -124,17 +124,17 @@ class Curl
public $http_error_message = null;
/**
* @var string|array TBD (ensure type) Contains the request header informations
* @var string|array TBD (ensure type) Contains the request header information
*/
public $request_headers = null;
/**
* @var string|array TBD (ensure type) Contains the response header informations
* @var string|array TBD (ensure type) Contains the response header information
*/
public $response_headers = array();
/**
* @var string Contains the response from the curl request
* @var string|false|null Contains the response from the curl request
*/
public $response = null;
@@ -146,12 +146,12 @@ class Curl
/**
* Constructor ensures the available curl extension is loaded.
*
* @throws \ErrorException
* @throws \RuntimeException
*/
public function __construct()
{
if (!extension_loaded('curl')) {
throw new \ErrorException('The cURL extensions is not loaded, make sure you have installed the cURL extension: https://php.net/manual/curl.setup.php');
throw new \RuntimeException('The cURL extensions is not loaded, make sure you have installed the cURL extension: https://php.net/manual/curl.setup.php');
}
$this->init();
@@ -162,7 +162,7 @@ class Curl
/**
* Initializer for the curl resource.
*
* Is called by the __construct() of the class or when the curl request is reseted.
* Is called by the __construct() of the class or when the curl request is reset.
* @return self
*/
private function init()
@@ -202,7 +202,7 @@ class Curl
// protected methods
/**
* Execute the curl request based on the respectiv settings.
* Execute the curl request based on the respective settings.
*
* @return int Returns the error code for the current curl request
*/
@@ -212,14 +212,14 @@ class Curl
$this->response = curl_exec($this->curl);
$this->curl_error_code = curl_errno($this->curl);
$this->curl_error_message = curl_error($this->curl);
$this->curl_error = !($this->curl_error_code === 0);
$this->http_status_code = curl_getinfo($this->curl, CURLINFO_HTTP_CODE);
$this->http_error = in_array(floor($this->http_status_code / 100), array(4, 5));
$this->curl_error = !($this->getErrorCode() === 0);
$this->http_status_code = intval(curl_getinfo($this->curl, CURLINFO_HTTP_CODE));
$this->http_error = $this->isError();
$this->error = $this->curl_error || $this->http_error;
$this->error_code = $this->error ? ($this->curl_error ? $this->curl_error_code : $this->http_status_code) : 0;
$this->error_code = $this->error ? ($this->curl_error ? $this->getErrorCode() : $this->getHttpStatus()) : 0;
$this->request_headers = preg_split('/\r\n/', curl_getinfo($this->curl, CURLINFO_HEADER_OUT), null, PREG_SPLIT_NO_EMPTY);
$this->http_error_message = $this->error ? (isset($this->response_headers['0']) ? $this->response_headers['0'] : '') : '';
$this->error_message = $this->curl_error ? $this->curl_error_message : $this->http_error_message;
$this->error_message = $this->curl_error ? $this->getErrorMessage() : $this->http_error_message;
return $this->error_code;
}
@@ -250,6 +250,18 @@ class Curl
$this->setOpt(CURLOPT_POSTFIELDS, $data);
}
/**
* Set the json payload informations to the postfield curl option.
*
* @param array $data The data to be sent.
* @return void
*/
protected function prepareJsonPayload(array $data)
{
$this->setOpt(CURLOPT_POST, true);
$this->setOpt(CURLOPT_POSTFIELDS, json_encode($data));
}
/**
* Set auth options for the current request.
*
@@ -307,12 +319,17 @@ class Curl
*
* @param string $url The url to make the post request
* @param array $data Post data to pass to the url
* @param boolean $asJson Whether the data should be passed as json or not. {@insce 2.2.1}
* @return self
*/
public function post($url, $data = array())
public function post($url, $data = array(), $asJson = false)
{
$this->setOpt(CURLOPT_URL, $url);
$this->preparePayload($data);
if ($asJson) {
$this->prepareJsonPayload($data);
} else {
$this->preparePayload($data);
}
$this->exec();
return $this;
}
@@ -320,7 +337,7 @@ class Curl
/**
* Make a put request with optional data.
*
* The put request data can be either sent via payload or as get paramters of the string.
* The put request data can be either sent via payload or as get parameters of the string.
*
* @param string $url The url to make the put request
* @param array $data Optional data to pass to the $url
@@ -346,7 +363,7 @@ class Curl
/**
* Make a patch request with optional data.
*
* The patch request data can be either sent via payload or as get paramters of the string.
* The patch request data can be either sent via payload or as get parameters of the string.
*
* @param string $url The url to make the patch request
* @param array $data Optional data to pass to the $url
@@ -398,7 +415,7 @@ class Curl
/**
* Pass basic auth data.
*
* If the the rquested url is secured by an httaccess basic auth mechanism you can use this method to provided the auth data.
* If the the requested url is secured by an htaccess basic auth mechanism you can use this method to provided the auth data.
*
* ```php
* $curl = new Curl();
@@ -406,8 +423,8 @@ class Curl
* $curl->get('http://example.com/secure.php');
* ```
*
* @param string $username The username for the authentification
* @param string $password The password for the given username for the authentification
* @param string $username The username for the authentication
* @param string $password The password for the given username for the authentication
* @return self
*/
public function setBasicAuthentication($username, $password)
@@ -418,7 +435,7 @@ class Curl
}
/**
* Provide optional header informations.
* Provide optional header information.
*
* In order to pass optional headers by key value pairing:
*
@@ -442,7 +459,7 @@ class Curl
/**
* Provide a User Agent.
*
* In order to provide you cusomtized user agent name you can use this method.
* In order to provide you customized user agent name you can use this method.
*
* ```php
* $curl = new Curl();
@@ -461,6 +478,9 @@ class Curl
/**
* @deprecated Call setReferer() instead
*
* @param $referrer
* @return self
*/
public function setReferrer($referrer)
{
@@ -471,7 +491,7 @@ class Curl
/**
* Set the HTTP referer header.
*
* The $referer informations can help identify the requested client where the requested was made.
* The $referer Information can help identify the requested client where the requested was made.
*
* @param string $referer An url to pass and will be set as referer header
* @return self
@@ -503,24 +523,26 @@ class Curl
*
* @see http://php.net/curl_setopt
*
* @param int $option The curl option constante e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
* @param mixed $value The value to pass for the given $option
* @param int $option The curl option constant e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
* @param mixed $value The value to pass for the given $option
* @return bool
*/
public function setOpt($option, $value)
{
return curl_setopt($this->curl, $option, $value);
}
/**
* Get customized curl options.
*
* To see a full list of options: http://php.net/curl_getinfo
*
* @see http://php.net/curl_getinfo
*
* @param int $option The curl option constante e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
* @param mixed $value The value to check for the given $option
*/
* Get customized curl options.
*
* To see a full list of options: http://php.net/curl_getinfo
*
* @see http://php.net/curl_getinfo
*
* @param int $option The curl option constant e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
* @param mixed The value to check for the given $option
* @return mixed
*/
public function getOpt($option)
{
return curl_getinfo($this->curl, $option);
@@ -539,17 +561,26 @@ class Curl
}
/**
* Enable verbositiy.
* Enable verbosity.
*
* @todo As to keep naming convention it should be renamed to `setVerbose()`
* @param bool $on
* @return self
*/
public function setVerbose($on = true)
{
$this->setOpt(CURLOPT_VERBOSE, $on);
return $this;
}
/**
* @deprecated Call setVerbose() instead
*
* @param string $on
* @param bool $on
* @return self
*/
public function verbose($on = true)
{
$this->setOpt(CURLOPT_VERBOSE, $on);
return $this;
return $this->setVerbose($on);
}
/**
@@ -574,7 +605,7 @@ class Curl
$this->http_error_message = null;
$this->request_headers = null;
$this->response_headers = array();
$this->response = null;
$this->response = false;
$this->init();
return $this;
}
@@ -605,7 +636,7 @@ class Curl
*/
public function isInfo()
{
return $this->http_status_code >= 100 && $this->http_status_code < 200;
return $this->getHttpStatus() >= 100 && $this->getHttpStatus() < 200;
}
/**
@@ -614,7 +645,7 @@ class Curl
*/
public function isSuccess()
{
return $this->http_status_code >= 200 && $this->http_status_code < 300;
return $this->getHttpStatus() >= 200 && $this->getHttpStatus() < 300;
}
/**
@@ -623,7 +654,7 @@ class Curl
*/
public function isRedirect()
{
return $this->http_status_code >= 300 && $this->http_status_code < 400;
return $this->getHttpStatus() >= 300 && $this->getHttpStatus() < 400;
}
/**
@@ -632,7 +663,7 @@ class Curl
*/
public function isError()
{
return $this->http_status_code >= 400 && $this->http_status_code < 600;
return $this->getHttpStatus() >= 400 && $this->getHttpStatus() < 600;
}
/**
@@ -641,7 +672,7 @@ class Curl
*/
public function isClientError()
{
return $this->http_status_code >= 400 && $this->http_status_code < 500;
return $this->getHttpStatus() >= 400 && $this->getHttpStatus() < 500;
}
/**
@@ -650,7 +681,7 @@ class Curl
*/
public function isServerError()
{
return $this->http_status_code >= 500 && $this->http_status_code < 600;
return $this->getHttpStatus() >= 500 && $this->getHttpStatus() < 600;
}
/**
@@ -673,7 +704,7 @@ class Curl
* ```
*
* @param string $headerKey Optional key to get from the array.
* @return bool|string
* @return bool|string|array
* @since 1.9
*/
public function getResponseHeaders($headerKey = null)
@@ -697,21 +728,37 @@ class Curl
return $headers;
}
/**
* Get response from the curl request
* @return string|false
*/
public function getResponse()
{
return $this->response;
}
/**
* Get curl error code
* @return string
*/
public function getErrorCode()
{
return $this->curl_error_code;
}
/**
* Get curl error message
* @return string
*/
public function getErrorMessage()
{
return $this->curl_error_message;
}
/**
* Get http status code from the curl request
* @return int
*/
public function getHttpStatus()
{
return $this->http_status_code;

View File

@@ -0,0 +1,6 @@
/.git
composer.lock
vendor
vendor/
.idea
.idea/

View File

@@ -0,0 +1,26 @@
{
"name": "ledccn/bittorrentclient",
"description": "实现对下载服务器管理的代码库",
"type": "library",
"keywords": ["transmission", "qBittorrent"],
"homepage": "https://github.com/ledccn/BittorrentClient",
"license": "GPL-3.0-or-later",
"authors": [
{
"name": "David",
"email": "367013672@qq.com"
}
],
"require": {
"php": "^5.6 | ^7.0",
"curl/curl": "^2.3",
"ext-curl": "*",
"ext-json": "*",
"ext-mbstring": "*"
},
"autoload": {
"psr-4": {
"IYUU\\Client\\": "src"
}
}
}

View File

@@ -0,0 +1,23 @@
## 项目简介
下载服务器的支持库,目前支持
- transmission
- qBittorrent
## 使用方法
https://packagist.org/packages/ledccn/bittorrentclient
```php
composer require ledccn/bittorrentclient:dev-master
```
## 其他项目
| 名称 | 简介 |
| ---------------------------------------------------------- | ------------------------------------------------------------ |
| [IYUUAutoReseed](https://github.com/ledccn/IYUUAutoReseed) | IYUU自动辅种工具功能分为两大块自动辅种、自动转移。目前能对支持的PT站点自动辅种支持下载器集群支持多盘位支持多下载目录支持远程连接等可以实现各下载器之间自动转移做种客户端让下载器各司其职专职的保种、专职的下载。 |

View File

@@ -0,0 +1,145 @@
<?php
/**
* 下载服务器抽象类
* Created by PhpStorm
* User: David <367013672@qq.com>
* Date: 2020-1-11
*/
namespace IYUU\Client;
abstract class AbstractClient
{
/**
* 完整的下载服务器地址
* @var string
*/
protected $url = '';
/**
* 下载服务器用户名
* @var string
*/
protected $username = '';
/**
* 密码
* @var string
*/
protected $password = '';
/**
* 调试开关
* @var bool
*/
public $debug = false;
/**
* 公共方法:创建客户端实例
* @param array $config
* array(
* 'type' => '',
* 'host' => '',
* 'endpoint' => '',
* 'username' => '',
* 'password' => '',
* )
* @return mixed 客户端实例
* @throws \IYUU\Client\ClientException
*/
public static function create($config = [])
{
// 下载服务器类型
$type = isset($config['type']) ? $config['type'] : '';
$file = __DIR__ . DIRECTORY_SEPARATOR . $type . DIRECTORY_SEPARATOR . $type .'.php';
if (!is_file($file)) {
throw new ClientException($file.' 文件不存在');
}
$className = "IYUU\\Client\\" . $type . "\\" . $type;
if (class_exists($className)) {
echo $type." 客户端正在实例化!".PHP_EOL;
return new $className($config);
} else {
throw new ClientException($className.' 客户端class不存在');
}
}
/**
* 初始化必须的参数
* @descr 子类调用
* @param array $config
*/
protected function initialize($config = [])
{
$host = isset($config['host']) ? $config['host'] : ''; // 地址端口
$endpoint = isset($config['endpoint']) ? $config['endpoint'] : ''; // 接入点
$username = isset($config['username']) ? $config['username'] : ''; // 用户名
$password = isset($config['password']) ? $config['password'] : ''; // 密码
$debug = isset($config['debug']) ? $this->booleanParse($config['debug']) : false; // 调试开关
$this->url = rtrim($host, '/') . $endpoint;
$this->username = $username;
$this->password = $password;
$this->debug = $debug;
}
/**
* 对布尔型进行格式化
* @param mixed $value 变量值
* @return boolean/string 格式化后的变量
*/
public function booleanParse($value)
{
$rs = $value;
if (!is_bool($value)) {
if (is_numeric($value)) {
$rs = $value > 0 ? true : false;
} elseif (is_string($value)) {
$rs = in_array(strtolower($value), ['ok', 'true', 'success', 'on', 'yes', '(ok)', '(true)', '(success)', '(on)', '(yes)']) ? true : false;
} else {
$rs = $value ? true : false;
}
}
return $rs;
}
/**
* 查询Bittorrent客户端状态
* @return string
*/
abstract public function status();
/**
* 获取所有种子的列表
* @param array $move
* @return array(
* 'hash' => string json,
* 'sha1' => string,
* 'hashString '=> array
* )
*/
abstract public function all(&$move = array());
/**
* 添加种子连接
* @param string $torrent_url
* @param string $save_path
* @param array $extra_options
*/
abstract public function add($torrent_url, $save_path = '', $extra_options = array());
/**
* 添加种子原数据
* @param string $torrent_metainfo
* @param string $save_path
* @param array $extra_options
*/
abstract public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array());
/**
* 删除种子
* @param $torrent
* @param bool $deleteFiles
*/
abstract public function delete($torrent, $deleteFiles = false);
}

View File

@@ -0,0 +1,12 @@
<?php
namespace IYUU\Client;
use Exception;
/**
* Class ClientException
*/
class ClientException extends Exception
{
}

View File

@@ -0,0 +1,11 @@
{
"name": "qBittorrent",
"author": "David",
"homepage": "https://github.com/qbittorrent/qBittorrent",
"version": "1.0",
"icon": "https://www.iyuu.cn/usr/uploads/client/qBittorrent.ico",
"allowCustomPath": true,
"pathDescription": "当前目录列表配置是指定硬盘上的绝对路径,如 /volume1/music/ 或 D:\\download\\music\\",
"description": "当前支持 qBittorrent v4.1+,由于浏览器限制,需要禁用 qBittorrent 的『启用跨站请求伪造(CSRF)保护』功能才能正常使用",
"warning": "注意:由于 qBittorrent 验证机制限制,第一次测试连接成功后,后续测试无论密码正确与否都会提示成功。"
}

View File

@@ -0,0 +1,674 @@
<?php
namespace IYUU\Client\qBittorrent;
use Curl\Curl;
use IYUU\Client\AbstractClient;
use IYUU\Client\ClientException;
/**
* qBittorrent下载服务器的API操作类
* 开源项目地址https://github.com/qbittorrent/qBittorrent
* API文档https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation
*/
class qBittorrent extends AbstractClient
{
/**
* API主版本号
* @var int|mixed|string
*/
private $api_version = '';
/**
* CSRF使用的Session或者Cookie
* @var string
*/
private $session_id = '';
/**
* curl实例
* @var Curl
*/
private $curl;
/**
* 分隔符
* @var string
*/
protected $delimiter = '';
/**
* 各版的API接入点
* @var array
*/
private $endpoints = [
'login' => [
'1' => '/login',
'2' => '/api/v2/auth/login'
],
'logout'=> [
'1' => null,
'2' => '/api/v2/auth/logout'
],
'app_version' => [
'1' => '/version/qbittorrent',
'2' => '/api/v2/app/version'
],
'api_version' => [
'1' => '/version/api',
'2' => '/api/v2/app/webapiVersion'
],
'build_info' => [
'1' => null,
'2' => '/api/v2/app/buildInfo'
],
'preferences' => [
'1' => null,
'2' => '/api/v2/app/preferences'
],
'setPreferences' => [
'1' => null,
'2' => '/api/v2/app/setPreferences'
],
'defaultSavePath' => [
'1' => null,
'2' => '/api/v2/app/defaultSavePath'
],
'downloadLimit' => [
'1' => null,
'2' => '/api/v2/transfer/downloadLimit'
],
'setDownloadLimit' => [
'1' => null,
'2' => '/api/v2/transfer/setDownloadLimit'
],
'uploadLimit' => [
'1' => null,
'2' => '/api/v2/transfer/uploadLimit'
],
'setUploadLimit' => [
'1' => null,
'2' => '/api/v2/transfer/setUploadLimit'
],
'torrent_list' => [
'1' => null,
'2' => '/api/v2/torrents/info'
],
'torrent_properties' => [
'1' => null,
'2' => '/api/v2/torrents/properties'
],
'torrent_trackers' => [
'1' => null,
'2' => '/api/v2/torrents/trackers'
],
'torrent_files' => [
'1' => null,
'2' => '/api/v2/torrents/files'
],
'torrent_pieceStates' => [
'1' => null,
'2' => '/api/v2/torrents/pieceStates'
],
'torrent_pieceHashes' => [
'1' => null,
'2' => '/api/v2/torrents/pieceHashes'
],
'torrent_pause' => [
'1' => null,
'2' => '/api/v2/torrents/pause'
],
'torrent_resume' => [
'1' => null,
'2' => '/api/v2/torrents/resume'
],
'torrent_delete' => [
'1' => null,
'2' => '/api/v2/torrents/delete'
],
'torrent_recheck' => [
'1' => null,
'2' => '/api/v2/torrents/recheck' // 重新校验种子
],
'torrent_reannounce' => [
'1' => null,
'2' => '/api/v2/torrents/reannounce' // 重新宣告种子
],
'torrent_add' => [
'1' => null,
'2' => '/api/v2/torrents/add'
],
'torrent_addTrackers' => [
'1' => null,
'2' => '/api/v2/torrents/addTrackers'
],
'torrent_editTracker' => [
'1' => null,
'2' => '/api/v2/torrents/editTracker'
],
'torrent_removeTrackers' => [
'1' => null,
'2' => '/api/v2/torrents/removeTrackers'
],
'torrent_addPeers' => [
'1' => null,
'2' => '/api/v2/torrents/addPeers'
],
'torrent_increasePrio' => [
'1' => null,
'2' => '/api/v2/torrents/increasePrio'
],
'torrent_decreasePrio' => [
'1' => null,
'2' => '/api/v2/torrents/decreasePrio'
],
'torrent_downloadLimit' => [
'1' => null,
'2' => '/api/v2/torrents/downloadLimit'
],
'torrent_setDownloadLimit' => [
'1' => null,
'2' => '/api/v2/torrents/setDownloadLimit'
],
'torrent_setShareLimits' => [
'1' => null,
'2' => '/api/v2/torrents/setShareLimits'
],
'torrent_uploadLimit' => [
'1' => null,
'2' => '/api/v2/torrents/uploadLimit'
],
'torrent_setUploadLimit' => [
'1' => null,
'2' => '/api/v2/torrents/setUploadLimit'
],
'torrent_setLocation' => [
'1' => null,
'2' => '/api/v2/torrents/setLocation'
],
'torrent_rename' => [
'1' => null,
'2' => '/api/v2/torrents/rename'
],
'torrent_setCategory' => [
'1' => null,
'2' => '/api/v2/torrents/setCategory'
],
'torrent_categories' => [
'1' => null,
'2' => '/api/v2/torrents/categories'
],
'torrent_createCategory' => [
'1' => null,
'2' => '/api/v2/torrents/createCategory'
],
'torrent_editCategory' => [
'1' => null,
'2' => '/api/v2/torrents/editCategory'
],
'torrent_removeCategories' => [
'1' => null,
'2' => '/api/v2/torrents/removeCategories'
],
'torrent_addTags' => [
'1' => null,
'2' => '/api/v2/torrents/addTags'
],
'torrent_removeTags' => [
'1' => null,
'2' => '/api/v2/torrents/removeTags'
],
'torrent_tags' => [
'1' => null,
'2' => '/api/v2/torrents/tags'
],
'torrent_createTags' => [
'1' => null,
'2' => '/api/v2/torrents/createTags'
],
'torrent_deleteTags' => [
'1' => null,
'2' => '/api/v2/torrents/deleteTags'
],
'torrent_setAutoManagement' => [
'1' => null,
'2' => '/api/v2/torrents/setAutoManagement'
],
'torrent_toggleSequentialDownload' => [
'1' => null,
'2' => '/api/v2/torrents/toggleSequentialDownload'
],
'torrent_toggleFirstLastPiecePrio' => [
'1' => null,
'2' => '/api/v2/torrents/toggleFirstLastPiecePrio'
],
'torrent_setForceStart' => [
'1' => null,
'2' => '/api/v2/torrents/setForceStart'
],
'torrent_setSuperSeeding' => [
'1' => null,
'2' => '/api/v2/torrents/setSuperSeeding'
],
'torrent_renameFile' => [
'1' => null,
'2' => '/api/v2/torrents/renameFile'
],
'maindata' => [
'1' => null,
'2' => '/api/v2/sync/maindata'
],
];
/**
* 构造函数
* @param array $config
* @throws ClientException
*/
public function __construct($config = [])
{
$this->initialize($config);
$this->api_version = isset($config['api_version']) && $config['api_version'] ? $config['api_version'] : 2;
$this->curl = new Curl();
$this->curl->setOpt(CURLOPT_SSL_VERIFYPEER, false); // 禁止验证证书
$this->curl->setOpt(CURLOPT_SSL_VERIFYHOST, 2); // 不检查证书
$this->curl->setOpt(CURLOPT_CONNECTTIMEOUT, 60); // 超时
$this->curl->setOpt(CURLOPT_TIMEOUT, 600); // 超时
if (!$this->login()) {
throw new ClientException("qBittorrent Unable to authenticate with Web Api.");
}
}
/**
* app编译版本
* @return string
*/
public function appVersion()
{
return $this->getData('app_version');
}
/**
* api版本
* @return string
*/
public function apiVersion()
{
return $this->getData('api_version');
}
/**
* 编译信息
* @return array
*/
public function buildInfo()
{
return $this->getData('build_info');
}
/**
* 下载器验证
* @return bool
*/
public function login()
{
$this->curl->post($this->url . $this->endpoints['login'][$this->api_version], [
'username' => $this->username,
'password' => $this->password
]);
if ($this->debug) {
var_dump($this->curl->request_headers);
var_dump($this->curl->response_headers);
}
// Find authentication cookie and set in curl connection
foreach ($this->curl->response_headers as $header) {
if (preg_match('/SID=(\S[^;]+)/', $header, $matches)) {
$this->session_id = $matches[0];
$qb415 = '; QB_'.$matches[0]; // 兼容qBittorrent v4.1.5[小钢炮等]
$this->curl->setHeader('Cookie', $matches[0].$qb415);
return true;
}
};
return false;
}
/**
* 退出登录
* @return mixed
*/
public function logout()
{
$this->session_id = '';
$this->getData('logout');
$this->curl->reset();
return $this;
}
/**
* 获取下载器首选项
* @return mixed
*/
public function preferences()
{
return $this->getData('preferences');
}
/**
* 设置下载器首选项
* @param array $data
* @return array|mixed
*/
public function setPreferences($data = [])
{
if (!empty($data)) {
return $this->postData('setPreferences', ['json' => json_encode($data)]);
}
return [];
}
/**
* 获取种子列表
* @return mixed
*/
public function torrentList()
{
return $this->getData('torrent_list');
}
/**
* 添加种子链接
* @param $torrent_url
* @param string $save_path
* @param array $extra_options
* array(
* 'urls' => '',
* 'savepath' => '',
* 'cookie' => '',
* 'category' => '',
* 'skip_checking' => true,
* 'paused' => true,
* 'root_folder' => true,
* )
* @return array
*/
public function add($torrent_url, $save_path = '', $extra_options = array())
{
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));
return $this->postData('torrent_add', $post_data);
}
/**
* 添加种子元数据
* @param string $torrent_metainfo
* @param string $save_path
* @param array $extra_options
* @return false|string|null
*/
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
{
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);
// 设置请求头
$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);
}
/**
* 删除所有种子
* @param bool $deleteFiles
* @return string
*/
public function deleteAll($deleteFiles = false)
{
$torrents = json_decode($this->torrentList());
$response = '';
foreach ($torrents as $torrent) {
$response .= $this->delete($torrent->hash, $deleteFiles);
}
return $response;
}
/**
* 暂停种子
* @param string $hash info_hash可以|分隔删除多个种子也可以传入all删除所有种子
* @return false|string|null
*/
public function pause($hash)
{
return $this->postData('torrent_pause', ['hashes' => $hash]);
}
/**
* 恢复做种
* @param string $hash info_hash可以|分隔删除多个种子也可以传入all删除所有种子
* @return false|string|null
*/
public function resume($hash)
{
return $this->postData('torrent_resume', ['hashes' => $hash]);
}
/**
* 抽象方法,子类实现
* 删除种子
* @param string $hash info_hash可以|分隔删除多个种子也可以传入all删除所有种子
* @param bool $deleteFiles 是否同时删除数据
* @return false|string|null
*/
public function delete($hash = '', $deleteFiles = false)
{
return $this->postData('torrent_delete', ['hashes' => $hash, 'deleteFiles' => $deleteFiles ? 'true':'false']);
}
/**
* 重新校验种子
* @param string $hash info_hash可以|分隔删除多个种子也可以传入all删除所有种子
* @return false|string|null
*/
public function recheck($hash)
{
return $this->postData('torrent_recheck', ['hashes' => $hash]);
}
/**
* 重新宣告种子
* @param string $hash info_hash可以|分隔删除多个种子也可以传入all删除所有种子
* @return false|string|null
*/
public function reannounce($hash)
{
return $this->postData('torrent_reannounce', ['hashes' => $hash]);
}
/**
* @param $hash
* @param $location
* @return false|string|null
*/
public function setTorrentLocation($hash, $location)
{
return $this->postData('torrent_setLocation', ['hashes' => $hash, 'location' => $location]);
}
/**
* 获取当前Curl对象
* @return Curl
*/
public function curl()
{
return $this->curl;
}
/**
* 基本get方法
* @param $endpoint
* @return mixed
*/
private function getData($endpoint)
{
$this->curl->get($this->url . $this->endpoints[$endpoint][$this->api_version]);
if ($this->debug) {
var_dump($this->curl->request_headers);
var_dump($this->curl->response_headers);
var_dump($this->curl->response);
}
if ($this->curl->error) {
return $this->errorMessage();
}
return $this->curl->response;
}
/**
* 基本post方法
* @param $endpoint
* @param $data
* @return mixed
*/
private function postData($endpoint, $data)
{
$this->curl->post($this->url . $this->endpoints[$endpoint][$this->api_version], $data);
if ($this->debug) {
var_dump($this->curl->request_headers);
var_dump($this->curl->response_headers);
var_dump($this->curl->response);
}
if ($this->curl->error) {
return $this->errorMessage();
}
return $this->curl->response;
}
/**
* 返回错误信息
* @return string
*/
private function errorMessage()
{
return 'Curl Error Code: ' . $this->curl->error_code . ' (' . $this->curl->response . ')';
}
/**
* 拼接种子urls multipart/form-data
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
* @param array $param
* @return string
*/
public function buildUrls($param)
{
$this->delimiter = uniqid();
$eol = "\r\n";
$data = '';
// 拼接文件流
foreach ($param as $name => $content) {
$data .= "--" . $this->delimiter . $eol;
$data .= 'Content-Disposition: form-data; name="' .$name. '"' . $eol . $eol;
$data .= $content . $eol;
}
$data .= "--" . $this->delimiter . "--" . $eol;
return $data;
}
/**
* 拼接种子上传文件流 multipart/form-data
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
* @param array $param
* @return string
*/
public function buildData($param)
{
$this->delimiter = uniqid();
$eol = "\r\n";
$data = '';
// 拼接文件流
$data .= "--" . $this->delimiter . $eol;
$data .= 'Content-Disposition: form-data; name="' .$param['name']. '"; filename="'.$param['filename'].'"' . $eol;
$data .= 'Content-Type: application/x-bittorrent' . $eol . $eol;
$data .= $param['torrents'] . $eol;
unset($param['name']);
unset($param['filename']);
unset($param['torrents']);
if (!empty($param)) {
foreach ($param as $name => $content) {
$data .= "--" . $this->delimiter . $eol;
$data .= 'Content-Disposition: form-data; name="' . $name . '"' . $eol . $eol;
$data .= $content . $eol;
}
}
$data .= "--" . $this->delimiter . "--" . $eol;
return $data;
}
/**
* 抽象方法,子类实现
*/
public function status()
{
return $this->appVersion();
}
/**
* 抽象方法,子类实现
* @param array $torrentList
* @return array
*/
public function all(&$torrentList = array())
{
$result = $this->getData('torrent_list');
$res = json_decode($result, true);
if (empty($res)) {
echo "获取种子列表失败可能qBittorrent暂时无响应请稍后重试".PHP_EOL;
return array();
}
// 过滤,只保留正常做种
$res = array_filter($res, function ($v) {
if (isset($v['state']) && in_array($v['state'], array('uploading','stalledUP','pausedUP','queuedUP','checkingUP','forcedUP'))) {
return true;
}
return false;
}, ARRAY_FILTER_USE_BOTH);
if (empty($res)) {
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
return array();
}
// 提取数组hashString
$info_hash = array_column($res, 'hash');
// 升序排序
sort($info_hash);
$json = json_encode($info_hash, JSON_UNESCAPED_UNICODE);
// 去重 应该从文件读入,防止重复提交
$sha1 = sha1($json);
// 组装返回数据
$hashArray['hash'] = $json;
$hashArray['sha1'] = $sha1;
// 变换数组hashString键名、目录为键值
$hashArray['hashString'] = array_column($res, "save_path", 'hash');
$torrentList = array_column($res, null, 'hash');
return $hashArray;
}
}

View File

@@ -0,0 +1,10 @@
{
"name": "Transmission",
"author": "David",
"homepage": "https://github.com/transmission/transmission",
"version": "1.0",
"icon": "https://www.iyuu.cn/usr/uploads/client/transmission.ico",
"allowCustomPath": true,
"pathDescription": "当前目录列表配置是指定硬盘上的绝对路径,如 /volume1/music/",
"description": "默认情况下,系统会请求 http://ip:port/transmission/rpc 这个路径,如果无法连接,请确认 `settings.json` 文件的 `rpc-url` 值;"
}

View File

@@ -0,0 +1,990 @@
<?php
namespace IYUU\Client\transmission;
use Curl\Curl;
use IYUU\Client\AbstractClient;
use IYUU\Client\ClientException;
/**
* Transmission下载服务器的RPC操作类
* 开源项目地址https://github.com/transmission/transmission
* API文档https://github.com/transmission/transmission/blob/master/extras/rpc-spec.txt
*/
class transmission extends AbstractClient
{
/**
* UserAgent
*/
const UA = 'TransmissionRPC for PHP/7.0.0';
/**
* Transmission RPC version
* @var int
*/
protected $rpc_version = 0;
/**
* CSRF使用的Session或者Cookie
* @var string
*/
protected $session_id = '';
/**
* 种子状态码 torrent status
*/
const TR_STATUS_STOPPED = 0; // Torrent is stopped
const TR_STATUS_CHECK_WAIT = 1; // Queued to check files
const TR_STATUS_CHECK = 2; // Checking files
const TR_STATUS_DOWNLOAD_WAIT = 3; // Queued to download
const TR_STATUS_DOWNLOAD = 4; // Downloading
const TR_STATUS_SEED_WAIT = 5; // Queued to seed
const TR_STATUS_SEED = 6; // Seeding
const RPC_LT_14_TR_STATUS_CHECK_WAIT = 1;
const RPC_LT_14_TR_STATUS_CHECK = 2;
const RPC_LT_14_TR_STATUS_DOWNLOAD = 4;
const RPC_LT_14_TR_STATUS_SEED = 8;
const RPC_LT_14_TR_STATUS_STOPPED = 16;
/**
* Exception: Invalid arguments
*/
const E_INVALIDARG = -1;
/**
* Exception: Invalid Session-Id
*/
const E_SESSIONID = -2;
/**
* Exception: Error while connecting
*/
const E_CONNECTION = -3;
/**
* Exception: Error 401 returned, unauthorized
*/
const E_AUTHENTICATION = -4;
/**
* Curl实例
* @var
*/
private $curl;
/**
* 构造函数
* @param array $config
*/
public function __construct($config = [])
{
$this->initialize($config);
$this->curl = new Curl();
$this->curl->setOpt(CURLOPT_CONNECTTIMEOUT, 60); // 超时
$this->curl->setOpt(CURLOPT_TIMEOUT, 600); // 超时
}
/**
* 开始一个或多个种子
* Start one or more torrents
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws ClientException
*/
public function start($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-start", $request);
}
/**
* 停止一个或多个种子
* Stop one or more torrents
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws ClientException
*/
public function stop($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-stop", $request);
}
/**
* 校验一个或多个种子
* Verify one or more torrents
*
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws ClientException
*/
public function verify($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-verify", $request);
}
/**
* 删除一个或多个种子
* Remove torrent from transmission
* @param int|array ids A list of transmission torrent ids
* @param bool $delete_local_data 是否删除数据
* @return mixed
* @throws ClientException
*/
public function delete($ids, $delete_local_data = false)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array(
"ids" => $ids,
"delete-local-data" => $delete_local_data
);
return $this->request("torrent-remove", $request);
}
/**
* 从announce获取一个或多个种子的更多Peer
* Reannounce one or more torrents
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws ClientException
*/
public function reannounce($ids)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array("ids" => $ids);
return $this->request("torrent-reannounce", $request);
}
/**
* 获取一个种子或所有种子的参数
* Get information on torrents in transmission, if the ids parameter is
* empty all torrents will be returned. The fields array can be used to return certain
* fields. Default fields are: "id", "name", "status", "doneDate", "haveValid", "totalSize".
* key | type | source
----------------------------+-----------------------------+---------
activityDate | number | tr_stat
addedDate | number | tr_stat
bandwidthPriority | number | tr_priority_t
comment | string | tr_info
corruptEver | number | tr_stat
creator | string | tr_info
dateCreated | number | tr_info
desiredAvailable | number | tr_stat
doneDate | number | tr_stat
downloadDir | string | tr_torrent
downloadedEver | number | tr_stat
downloadLimit | number | tr_torrent
downloadLimited | boolean | tr_torrent
error | number | tr_stat
errorString | string | tr_stat
eta | number | tr_stat
etaIdle | number | tr_stat
files | array (see below) | n/a
fileStats | array (see below) | n/a
hashString | string | tr_info
haveUnchecked | number | tr_stat
haveValid | number | tr_stat
honorsSessionLimits | boolean | tr_torrent
id | number | tr_torrent
isFinished | boolean | tr_stat
isPrivate | boolean | tr_torrent
isStalled | boolean | tr_stat
leftUntilDone | number | tr_stat
magnetLink | string | n/a
manualAnnounceTime | number | tr_stat
maxConnectedPeers | number | tr_torrent
metadataPercentComplete | double | tr_stat
name | string | tr_info
peer-limit | number | tr_torrent
peers | array (see below) | n/a
peersConnected | number | tr_stat
peersFrom | object (see below) | n/a
peersGettingFromUs | number | tr_stat
peersSendingToUs | number | tr_stat
percentDone | double | tr_stat
pieces | string (see below) | tr_torrent
pieceCount | number | tr_info
pieceSize | number | tr_info
priorities | array (see below) | n/a
queuePosition | number | tr_stat
rateDownload (B/s) | number | tr_stat
rateUpload (B/s) | number | tr_stat
recheckProgress | double | tr_stat
secondsDownloading | number | tr_stat
secondsSeeding | number | tr_stat
seedIdleLimit | number | tr_torrent
seedIdleMode | number | tr_inactvelimit
seedRatioLimit | double | tr_torrent
seedRatioMode | number | tr_ratiolimit
sizeWhenDone | number | tr_stat
startDate | number | tr_stat
status | number | tr_stat
trackers | array (see below) | n/a
trackerStats | array (see below) | n/a
totalSize | number | tr_info
torrentFile | string | tr_info
uploadedEver | number | tr_stat
uploadLimit | number | tr_torrent
uploadLimited | boolean | tr_torrent
uploadRatio | double | tr_stat
wanted | array (see below) | n/a
webseeds | array (see below) | n/a
webseedsSendingToUs | number | tr_stat
| |
-------------------+--------+-----------------------------+
files | array of objects, each containing: |
+-------------------------+------------+
| bytesCompleted | number | tr_torrent
| length | number | tr_info
| name | string | tr_info
-------------------+--------------------------------------+
fileStats | a file's non-constant properties. |
| array of tr_info.filecount objects, |
| each containing: |
+-------------------------+------------+
| bytesCompleted | number | tr_torrent
| wanted | boolean | tr_info
| priority | number | tr_info
-------------------+--------------------------------------+
peers | array of objects, each containing: |
+-------------------------+------------+
| address | string | tr_peer_stat
| clientName | string | tr_peer_stat
| clientIsChoked | boolean | tr_peer_stat
| clientIsInterested | boolean | tr_peer_stat
| flagStr | string | tr_peer_stat
| isDownloadingFrom | boolean | tr_peer_stat
| isEncrypted | boolean | tr_peer_stat
| isIncoming | boolean | tr_peer_stat
| isUploadingTo | boolean | tr_peer_stat
| isUTP | boolean | tr_peer_stat
| peerIsChoked | boolean | tr_peer_stat
| peerIsInterested | boolean | tr_peer_stat
| port | number | tr_peer_stat
| progress | double | tr_peer_stat
| rateToClient (B/s) | number | tr_peer_stat
| rateToPeer (B/s) | number | tr_peer_stat
-------------------+--------------------------------------+
peersFrom | an object containing: |
+-------------------------+------------+
| fromCache | number | tr_stat
| fromDht | number | tr_stat
| fromIncoming | number | tr_stat
| fromLpd | number | tr_stat
| fromLtep | number | tr_stat
| fromPex | number | tr_stat
| fromTracker | number | tr_stat
-------------------+--------------------------------------+
pieces | A bitfield holding pieceCount flags | tr_torrent
| which are set to 'true' if we have |
| the piece matching that position. |
| JSON doesn't allow raw binary data, |
| so this is a base64-encoded string. |
-------------------+--------------------------------------+
priorities | an array of tr_info.filecount | tr_info
| numbers. each is the tr_priority_t |
| mode for the corresponding file. |
-------------------+--------------------------------------+
trackers | array of objects, each containing: |
+-------------------------+------------+
| announce | string | tr_tracker_info
| id | number | tr_tracker_info
| scrape | string | tr_tracker_info
| tier | number | tr_tracker_info
-------------------+--------------------------------------+
trackerStats | array of objects, each containing: |
+-------------------------+------------+
| announce | string | tr_tracker_stat
| announceState | number | tr_tracker_stat
| downloadCount | number | tr_tracker_stat
| hasAnnounced | boolean | tr_tracker_stat
| hasScraped | boolean | tr_tracker_stat
| host | string | tr_tracker_stat
| id | number | tr_tracker_stat
| isBackup | boolean | tr_tracker_stat
| lastAnnouncePeerCount | number | tr_tracker_stat
| lastAnnounceResult | string | tr_tracker_stat
| lastAnnounceStartTime | number | tr_tracker_stat
| lastAnnounceSucceeded | boolean | tr_tracker_stat
| lastAnnounceTime | number | tr_tracker_stat
| lastAnnounceTimedOut | boolean | tr_tracker_stat
| lastScrapeResult | string | tr_tracker_stat
| lastScrapeStartTime | number | tr_tracker_stat
| lastScrapeSucceeded | boolean | tr_tracker_stat
| lastScrapeTime | number | tr_tracker_stat
| lastScrapeTimedOut | boolean | tr_tracker_stat
| leecherCount | number | tr_tracker_stat
| nextAnnounceTime | number | tr_tracker_stat
| nextScrapeTime | number | tr_tracker_stat
| scrape | string | tr_tracker_stat
| scrapeState | number | tr_tracker_stat
| seederCount | number | tr_tracker_stat
| tier | number | tr_tracker_stat
-------------------+-------------------------+------------+
wanted | an array of tr_info.fileCount | tr_info
| 'booleans' true if the corresponding |
| file is to be downloaded. |
-------------------+--------------------------------------+
webseeds | an array of strings: |
+-------------------------+------------+
| webseed | string | tr_info
+-------------------------+------------+
*
* @param array fields An array of return fields
* @param int|array ids A list of transmission torrent ids
* 示例 Example:
Say we want to get the name and total size of torrents #7 and #10.
请求 Request:
{
"arguments": {
"fields": [ "id", "name", "totalSize" ],
"ids": [ 7, 10 ]
},
"method": "torrent-get",
"tag": 39693
}
响应 Response:
{
"arguments": {
"torrents": [
{
"id": 10,
"name": "Fedora x86_64 DVD",
"totalSize": 34983493932,
},
{
"id": 7,
"name": "Ubuntu x86_64 DVD",
"totalSize", 9923890123,
}
]
},
"result": "success",
"tag": 39693
}
*
* @return mixed
* @throws ClientException
*/
public function get($ids = [], $fields = [])
{
$default = ["id", "name", "status", "doneDate", "haveValid", "totalSize"];
if (!is_array($ids)) {
$ids = array($ids);
}
if (empty($fields)) {
$fields = $default;
} else {
$fields = is_array($fields) ? array_merge($default, $fields) : $default;
}
$request = array(
"fields" => $fields,
"ids" => $ids
);
return $this->request("torrent-get", $request);
}
/**
* 设置一个或多个种子的参数
* Set properties on one or more torrents, available fields are:
* string | value type & description
----------------------+-------------------------------------------------
"bandwidthPriority" | number this torrent's bandwidth tr_priority_t
"downloadLimit" | number maximum download speed (KBps)
"downloadLimited" | boolean true if "downloadLimit" is honored
"files-wanted" | array indices of file(s) to download
"files-unwanted" | array indices of file(s) to not download
"honorsSessionLimits" | boolean true if session upload limits are honored
"ids" | array torrent list, as described in 3.1
"location" | string new location of the torrent's content
"peer-limit" | number maximum number of peers
"priority-high" | array indices of high-priority file(s)
"priority-low" | array indices of low-priority file(s)
"priority-normal" | array indices of normal-priority file(s)
"queuePosition" | number position of this torrent in its queue [0...n)
"seedIdleLimit" | number torrent-level number of minutes of seeding inactivity
"seedIdleMode" | number which seeding inactivity to use. See tr_idlelimit
"seedRatioLimit" | double torrent-level seeding ratio
"seedRatioMode" | number which ratio to use. See tr_ratiolimit
"trackerAdd" | array strings of announce URLs to add
"trackerRemove" | array ids of trackers to remove
"trackerReplace" | array pairs of <trackerId/new announce URLs>
"uploadLimit" | number maximum upload speed (KBps)
"uploadLimited" | boolean true if "uploadLimit" is honored
*
* @param array arguments An associative array of arguments to set
* @param int|array ids A list of transmission torrent ids
* @return mixed
* @throws ClientException
*/
public function set($ids = array(), $arguments = array())
{
if (!is_array($ids)) {
$ids = array($ids);
}
if (!isset($arguments['ids'])) {
$arguments['ids'] = $ids;
}
return $this->request("torrent-set", $arguments);
}
/**
* 添加新种子 (URL)
* Add a new torrent
*
* Request arguments:
* key | value type & description
---------------------+-------------------------------------------------
"cookies" | string pointer to a string of one or more cookies.
"download-dir" | string path to download the torrent to
"filename" | string filename or URL of the .torrent file
"metainfo" | string base64-encoded .torrent content
"paused" | boolean if true, don't start the torrent
"peer-limit" | number maximum number of peers
"bandwidthPriority" | number torrent's bandwidth tr_priority_t
"files-wanted" | array indices of file(s) to download
"files-unwanted" | array indices of file(s) to not download
"priority-high" | array indices of high-priority file(s)
"priority-low" | array indices of low-priority file(s)
"priority-normal" | array indices of normal-priority file(s)
*
* 参数内必须包含"filename"或"metainfo"字段,其他字段都可选。
* Either "filename" OR "metainfo" MUST be included.
All other arguments are optional.
*
* @param string $filename 字符串文件名或种子urlThe URL or path to the torrent file
* @param string $save_path Folder to save torrent in
* @param array $extra_options Optional extra torrent options
* @return mixed
* @throws ClientException
*/
public function add($filename, $save_path = '', $extra_options = array())
{
if (!empty($save_path)) {
$extra_options['download-dir'] = $save_path;
}
$extra_options['filename'] = $filename;
return $this->request("torrent-add", $extra_options);
}
/**
* 添加新种子 (元数据)
* Add a torrent using the raw torrent data
* @param string $torrent_metainfo The raw, unencoded contents (metainfo) of a torrent
* @param string $save_path Folder to save torrent in
* @param array $extra_options Optional extra torrent options
* @return mixed
* @throws ClientException
*/
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
{
if (!empty($save_path)) {
$extra_options['download-dir'] = $save_path;
}
$extra_options['metainfo'] = base64_encode($torrent_metainfo);
return $this->request("torrent-add", $extra_options);
}
/**
* 变更数据保存目录
* Move local storage location
*
* Request arguments:
string | value type & description
---------------------------------+-------------------------------------------------
"ids" | array torrent list, as described in 3.1
"location" | string the new torrent location
"move" | boolean if true, move from previous location.
| otherwise, search "location" for files
| (default: false)
*
* @param int|array $ids A list of transmission torrent ids
* @param string $target_location The new storage location
* @param boolean $move_existing_data Move existing data or scan new location for available data
* @return mixed
* @throws ClientException
*/
public function move($ids, $target_location, $move_existing_data = true)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$request = array(
"ids" => $ids,
"location" => $target_location,
"move" => $move_existing_data
);
return $this->request("torrent-set-location", $request);
}
/**
* 修改种子文件或目录名称
* Renaming a Torrent's Path
*
* For more information on the use of this function, see the transmission.h
documentation of tr_torrentRenamePath(). In particular, note that if this
call succeeds you'll want to update the torrent's "files" and "name" field
with torrent-get.
Request arguments:
string | value type & description
---------------------------------+-------------------------------------------------
"ids" | array the torrent torrent list, as described in 3.1
| (must only be 1 torrent)
"path" | string the path to the file or folder that will be renamed
"name" | string the file or folder's new name
Response arguments: "path", "name", and "id", holding the torrent ID integer
*
* @param int|array ids A 1-element list of transmission torrent ids
* @param string path The path to the file or folder that will be renamed
* @param string name The file or folder's new name
* @return mixed
* @throws ClientException
*/
public function rename($ids, $path, $name)
{
if (!is_array($ids)) {
$ids = array($ids);
}
if (count($ids) !== 1) {
throw new ClientException('A single id is accepted', self::E_INVALIDARG);
}
$request = array(
"ids" => $ids,
"path" => $path,
"name" => $name
);
return $this->request("torrent-rename-path", $request);
}
/**
* Session 请求
* (4.1) Session 参数
* string | value type | description
* ---------------------------------+------------+-------------------------------------
* "alt-speed-down" | number | max global download speed (KBps)
* "alt-speed-enabled" | boolean | true means use the alt speeds
* "alt-speed-time-begin" | number | when to turn on alt speeds (units: minutes after midnight)
* "alt-speed-time-enabled" | boolean | true means the scheduled on/off times are used
* "alt-speed-time-end" | number | when to turn off alt speeds (units: same)
* "alt-speed-time-day" | number | what day(s) to turn on alt speeds (look at tr_sched_day)
* "alt-speed-up" | number | max global upload speed (KBps)
* "blocklist-url" | string | location of the blocklist to use for "blocklist-update"
* "blocklist-enabled" | boolean | true means enabled
* "blocklist-size" | number | number of rules in the blocklist
* "cache-size-mb" | number | maximum size of the disk cache (MB)
* "config-dir" | string | location of transmission's configuration directory
* "download-dir" | string | default path to download torrents
* "download-queue-size" | number | max number of torrents to download at once (see download-queue-enabled)
* "download-queue-enabled" | boolean | if true, limit how many torrents can be downloaded at once
* "dht-enabled" | boolean | true means allow dht in public torrents
* "encryption" | string | "required", "preferred", "tolerated"
* "idle-seeding-limit" | number | torrents we're seeding will be stopped if they're idle for this long
* "idle-seeding-limit-enabled" | boolean | true if the seeding inactivity limit is honored by default
* "incomplete-dir" | string | path for incomplete torrents, when enabled
* "incomplete-dir-enabled" | boolean | true means keep torrents in incomplete-dir until done
* "lpd-enabled" | boolean | true means allow Local Peer Discovery in public torrents
* "peer-limit-global" | number | maximum global number of peers
* "peer-limit-per-torrent" | number | maximum global number of peers
* "pex-enabled" | boolean | true means allow pex in public torrents
* "peer-port" | number | port number
* "peer-port-random-on-start" | boolean | true means pick a random peer port on launch
* "port-forwarding-enabled" | boolean | true means enabled
* "queue-stalled-enabled" | boolean | whether or not to consider idle torrents as stalled
* "queue-stalled-minutes" | number | torrents that are idle for N minuets aren't counted toward seed-queue-size or download-queue-size
* "rename-partial-files" | boolean | true means append ".part" to incomplete files
* "rpc-version" | number | the current RPC API version 当前RPC版本号
* "rpc-version-minimum" | number | the minimum RPC API version supported 支持RPC的最小版本号
* "script-torrent-done-filename" | string | filename of the script to run
* "script-torrent-done-enabled" | boolean | whether or not to call the "done" script
* "seedRatioLimit" | double | the default seed ratio for torrents to use
* "seedRatioLimited" | boolean | true if seedRatioLimit is honored by default
* "seed-queue-size" | number | max number of torrents to uploaded at once (see seed-queue-enabled)
* "seed-queue-enabled" | boolean | if true, limit how many torrents can be uploaded at once
* "speed-limit-down" | number | max global download speed (KBps)
* "speed-limit-down-enabled" | boolean | true means enabled
* "speed-limit-up" | number | max global upload speed (KBps)
* "speed-limit-up-enabled" | boolean | true means enabled
* "start-added-torrents" | boolean | true means added torrents will be started right away
* "trash-original-torrent-files" | boolean | true means the .torrent file of added torrents will be deleted
* "units" | object | see below
* "utp-enabled" | boolean | true means allow utp
* "version" | string | long version string "$version ($revision)"
* ---------------------------------+------------+-----------------------------+
* units | object containing: |
+--------------+--------+------------------+
| speed-units | array | 4 strings: KB/s, MB/s, GB/s, TB/s
| speed-bytes | number | number of bytes in a KB (1000 for kB; 1024 for KiB)
| size-units | array | 4 strings: KB/s, MB/s, GB/s, TB/s
| size-bytes | number | number of bytes in a KB (1000 for kB; 1024 for KiB)
| memory-units | array | 4 strings: KB/s, MB/s, GB/s, TB/s
| memory-bytes | number | number of bytes in a KB (1000 for kB; 1024 for KiB)
+--------------+--------+------------------+
*
* 当前RPC版本号"rpc-version" indicates the RPC interface version supported by the RPC server.
* It is incremented when a new version of Transmission changes the RPC interface.
*
* 支持RPC的最小版本号"rpc-version-minimum" indicates the oldest API supported by the RPC server.
* It is changes when a new version of Transmission changes the RPC interface
* in a way that is not backwards compatible. There are no plans for this
* to be common behavior.
*/
/**
* 获取会话
* Retrieve all session variables
* Method name: "session-get"
Request arguments: an optional "fields" array of keys (see 4.1)
Response arguments: key/value pairs matching the request's "fields"
argument if present, or all supported fields (see 4.1) otherwise.
*
* @returns array of session information
* @throws ClientException
*/
public function sessionGet()
{
return $this->request("session-get", array());
}
/**
* 设置会话
* Set session variable(s)
* Method name: "session-set"
Request arguments: one or more of 4.1's arguments, except: "blocklist-size",
"config-dir", "rpc-version", "rpc-version-minimum",
"version", and "session-id"
Response arguments: none
*
* @param array of session variables to set
* @return mixed
* @throws ClientException
*/
public function sessionSet($arguments)
{
return $this->request("session-set", $arguments);
}
/**
* 会话状态统计
* Retrieve session statistics
*
* Method name: "session-stats"
Request arguments: none
Response arguments:
string | value type
---------------------------+-------------------------------------------------
"activeTorrentCount" | number
"downloadSpeed" | number
"pausedTorrentCount" | number
"torrentCount" | number
"uploadSpeed" | number
---------------------------+-------------------------------+
"cumulative-stats" | object, containing: |
+------------------+------------+
| uploadedBytes | number | tr_session_stats
| downloadedBytes | number | tr_session_stats
| filesAdded | number | tr_session_stats
| sessionCount | number | tr_session_stats
| secondsActive | number | tr_session_stats
---------------------------+-------------------------------+
"current-stats" | object, containing: |
+------------------+------------+
| uploadedBytes | number | tr_session_stats
| downloadedBytes | number | tr_session_stats
| filesAdded | number | tr_session_stats
| sessionCount | number | tr_session_stats
| secondsActive | number | tr_session_stats
*
* @returns array of statistics
* @throws ClientException
*/
public function sessionStats()
{
return $this->request("session-stats", array());
}
/**
* Return the interpretation of the torrent status
*
* @param int The integer "torrent status"
* @returns string The translated meaning
* @return string
*/
public function getStatusString($intstatus)
{
if ($this->rpc_version < 14) {
if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK_WAIT) {
return "Waiting to verify local files";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK) {
return "Verifying local files";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_DOWNLOAD) {
return "Downloading";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_SEED) {
return "Seeding";
}
if ($intstatus == self::RPC_LT_14_TR_STATUS_STOPPED) {
return "Stopped";
}
} else {
if ($intstatus == self::TR_STATUS_CHECK_WAIT) {
return "Waiting to verify local files";
}
if ($intstatus == self::TR_STATUS_CHECK) {
return "Verifying local files";
}
if ($intstatus == self::TR_STATUS_DOWNLOAD) {
return "Downloading";
}
if ($intstatus == self::TR_STATUS_SEED) {
return "Seeding";
}
if ($intstatus == self::TR_STATUS_STOPPED) {
return "Stopped";
}
if ($intstatus == self::TR_STATUS_SEED_WAIT) {
return "Queued for seeding";
}
if ($intstatus == self::TR_STATUS_DOWNLOAD_WAIT) {
return "Queued for download";
}
}
return "Unknown";
}
/**
* 对请求数据预处理
* Clean up the request array. Removes any empty fields from the request
*
* @param array array The request associative array to clean
* @returns array The cleaned array
* @return array|null
*/
protected function cleanRequestData($array)
{
if (!is_array($array) || count($array) == 0) {
return null;
}
setlocale(LC_NUMERIC, 'en_US.utf8'); // Override the locale - if the system locale is wrong, then 12.34 will encode as 12,34 which is invalid JSON
foreach ($array as $index => $value) {
if (is_object($value)) {
$array[$index] = $value->toArray();
} // Convert objects to arrays so they can be JSON encoded
if (is_array($value)) {
$array[$index] = $this->cleanRequestData($value);
} // Recursion
if (empty($value) && ($value !== 0 || $value !== false)) { // Remove empty members
unset($array[$index]);
continue; // Skip the rest of the tests - they may re-add the element.
}
if (is_numeric($value)) {
$array[$index] = $value + 0;
} // Force type-casting for proper JSON encoding (+0 is a cheap way to maintain int/float/etc)
if (is_bool($value)) {
$array[$index] = ($value ? 1 : 0);
} // Store boolean values as 0 or 1
if (is_string($value)) {
$type = mb_detect_encoding($value, 'auto');
if ($type !== 'UTF-8') {
$array[$index] = mb_convert_encoding($value, 'UTF-8');
}
}
}
return $array;
}
/**
* 获取当前Curl对象
* @return Curl
*/
public function curl()
{
return $this->curl;
}
/**
* 执行 rpc 请求
* @param string $method 请求类型/方法, 详见 $this->allowMethods
* @param array $arguments 附加参数, 可选
* @return array
* @throws ClientException
*/
protected function request($method, $arguments = array())
{
if (!is_scalar($method)) {
throw new ClientException('Method name has no scalar value', self::E_INVALIDARG);
}
if (!is_array($arguments)) {
throw new ClientException('Arguments must be given as array', self::E_INVALIDARG);
}
$arguments = $this->cleanRequestData($arguments); // Sanitize input
// Grab the X-Transmission-Session-Id if we don't have it already
if (!$this->session_id) {
if (!$this->GetSessionID()) {
throw new ClientException('Unable to acquire X-Transmission-Session-Id', self::E_SESSIONID);
}
}
$data = array(
'method' => $method,
'arguments' => $arguments
);
$header = array(
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . base64_encode(sprintf("%s:%s", $this->username, $this->password)),
'X-Transmission-Session-Id' => $this->session_id
);
$curl = $this->curl;
if (stripos($this->url, 'https://') === 0) {
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, false); // 禁止验证证书
$curl->setOpt(CURLOPT_SSL_VERIFYHOST, 2); // 不检查证书
}
foreach ($header as $key => $value) {
$curl->setHeader($key, $value);
}
$curl->setUserAgent(self::UA);
$curl->setBasicAuthentication($this->username, $this->password);
$curl->post($this->url, $data, true);
$content = $curl->response;
if ($this->debug) {
var_dump($curl->request_headers);
var_dump($curl->response_headers);
var_dump($curl->response);
}
if (!$content) {
$content = array('result' => 'failed');
}
return json_decode($content, true);
}
/**
* Performs an empty GET on the Transmission RPC to get the X-Transmission-Session-Id
* and store it in $this->session_id
* @return string
*/
public function GetSessionID()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $this->username.':'.$this->password);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$content = curl_exec($ch);
$error_code = curl_errno($ch);
$error_message = curl_error($ch);
$http_status_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
if ($this->debug) {
var_dump($http_status_code);
var_dump($error_message);
var_dump($error_code);
var_dump($content);
}
// 401 Invalid username/password
// 409 成功
// 其他 Unexpected response from Transmission RPC
curl_close($ch);
if($content && preg_match("/<code>X-Transmission-Session-Id: (.*?)<\/code>/", $content, $match)) {
$this->session_id = isset($match[1]) ? $match[1] : null;
}
return $this->session_id;
}
/**
* 抽象方法,子类实现
* 获取下载器链接状态
* @throws ClientException
*/
public function status()
{
$rs = $this->sessionStats();
return isset($rs['result']) ? $rs['result'] : 'error';
}
/**
* 抽象方法,子类实现
* 获取所有种子的列表
* @param array $torrentList
* @return array
* array(
* 'hash' => string json,
* 'sha1' => string,
* 'hashString '=> array
* )
* @throws ClientException
*/
public function all(&$torrentList = array())
{
$ids = array();
$fields = array( "id", "status", "name", "hashString", "downloadDir", "torrentFile" );
$res = $this->get($ids, $fields);
if (isset($res['result']) && $res['result'] === 'success') {
// 成功
} else {
// 失败
echo "从客户端获取种子列表失败可能transmission暂时无响应请稍后重试".PHP_EOL;
return array();
}
if (empty($res['arguments']['torrents'])) {
echo "从客户端未获取到数据,请稍后重试!".PHP_EOL;
return array();
}
$res = $res['arguments']['torrents'];
// 过滤,只保留正常做种
$res = array_filter($res, function ($v) {
return isset($v['status']) && $v['status'] === 6;
}, ARRAY_FILTER_USE_BOTH);
if (empty($res)) {
echo "从客户端未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
return array();
}
// 提取数组hashString
$info_hash = array_column($res, 'hashString');
// 升序排序
sort($info_hash);
$json = json_encode($info_hash, JSON_UNESCAPED_UNICODE);
// 去重 应该从文件读入,防止重复提交
$sha1 = sha1($json);
// 组装返回数据
$hashArray['hash'] = $json;
$hashArray['sha1'] = $sha1;
// 变换数组hashString为键名、目录为键值
$hashArray['hashString'] = array_column($res, "downloadDir", 'hashString');
$torrentList = array_column($res, null, 'hashString');
return $hashArray;
}
}

View File

@@ -1,51 +0,0 @@
## 下载最新源码的两种方法
### 第一种:下载完整的发行版
**github**[GITHUB仓库 发行版][1]
**gitee**[码云仓库 发行版][2]
下载**`Release.zip`**后缀的压缩包,解压缩后即可配置使用。
### 第二种git clone下载源码
**拉取源码命令,下面两个仓库都可以:**
- github`git clone https://github.com/ledccn/IYUUAutoReseed`
- gitee`git clone https://gitee.com/ledc/IYUUAutoReseed.git`
----------
**完整命令:**
```bash
git clone https://github.com/ledccn/IYUUAutoReseed
cd IYUUAutoReseed
composer install
```
Windows环境完整过程演示
![git下载源码composer安装.png][3]
```cmd
E:\>git clone https://github.com/ledccn/IYUUAutoReseed
Cloning into 'IYUUAutoReseed'...
remote: Enumerating objects: 189, done.
remote: Counting objects: 100% (189/189), done.
remote: Compressing objects: 100% (120/120), done.
Receiving objects: 97% (814/remote: Total 839 (delta 78), reused 171 (delta 64), pack-reused 650839), 380.00 KiB | 45.0R
Receiving objects: 100% (839/839), 419.04 KiB | 50.00 KiB/s, done.
Resolving deltas: 100% (468/468), done.
E:\>cd IYUUAutoReseed
E:\IYUUAutoReseed>composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Package operations: 2 installs, 0 updates, 0 removals
- Installing curl/curl (2.2.0): Loading from cache
- Installing owner888/phpspider (v2.1.6): Loading from cache
owner888/phpspider suggests installing ext-pcntl、ext-redis (For better performance. )
Generating autoload files
E:\IYUUAutoReseed>
```
[1]: https://github.com/ledccn/IYUUAutoReseed/releases
[2]: https://gitee.com/ledc/IYUUAutoReseed/releases
[3]: https://www.iyuu.cn/usr/uploads/2020/01/314358689.png

View File

@@ -1,5 +1,80 @@
# 公告栏
### 2020年7月31日09:25:55
1. IYUUAutoReseed正式建立了docke镜像自动编译2个版本ARM64【iyuucn/iyuuautoreseed:arm64v8】、AMD64【iyuucn/iyuuautoreseed:latest】使用方法[点击查看](https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker)
2. 优化默认流控参数单次最多20个间隔20秒。天空辅种请配置cookie必须更新至最新版本并配置浏览器UA获取UA请访问[http://demo.iyuu.cn](http://demo.iyuu.cn/)
3. v1.10.2版本以后的docker每5小时会自动拉取最新代码从此您只需要看公告更新配置就行啦。
### 2020年7月13日08:00:00
【更新提醒】v1.9.1
优化App.Api.Sites接口请求时携带版本号版本为空或低于v1.9.1会返回旧数据);
新增:异步间隔流控算法,适用所有站点;各站独立、执行时间最优;
【升级方法】
1.异步间隔流控使用方法参考v1.9.1版本的config.sample.php[第242-245行]把他复制到你想应用流控的站点配置项内解释count表示每次辅种的最大数量sleep表示当前站点每次下载种子最小间隔多少秒。
2.url_replace和url_join是为了最大化兼容未来各种类型站点提前准备的可以自定义URL
解释url_replace是替换下载链接时使用让下载链接支持替换任意参数。举例'url_replace'=>array('{passkey}'=>'123456789'), 下载链接https://pt.baidu.com/download.php?id={}&passkey={passkey}替换后变为https://pt.baidu.com/download.php?id={}&passkey=123456789
解释url_join是拼接下载链接是使用让下载链接支持任意自定义参数。举例
'url_join' => array('ipv6=1','https=1'), 下载链接https://pt.baidu.com/download.php?id={}&passkey=123456789拼接后变为https://pt.baidu.com/download.php?id={}&passkey=123456789&ipv6=1&https=1
### 2020年7月12日19:34:03
【新增功能】v1.9.0
转移过滤器、选择器;可以只转移指定路径的种子,也可以排除指定路径的种子,按需转移。
【升级方法】
1.主脚本可以通过git pull或覆盖更新
2.然后对照最新config.sample.php把59行60行手动加入到你的config.php对应位置。
【重要提醒】域名部署SSL证书接口域名支持双协议访问http/https如下
https://api.iyuu.cn
http://api.iyuu.cn
### 2020年4月10日17:43:50
针对多合作站点绑定的优化!
1.没有更新到v1.7.5以上版本的群友,尽快更新!
2.正在使用v1.7.5以上版本的群友请删除config目录下的siteLoginCache_*.json文件重新运行辅种即可同时绑定多个合作站点。
### 2020年4月4日00:57:36
v1.7.5版本发布新增合作站点moecat合作站点有Ourbits、 HD Dolby、HDHome、PTHome、moecat。【更新提醒】手动升级可以直接覆盖git安装的可通过git pull命令升级脚本升级后然后对比config.sample.php手动在config.php增加用户id配置项辅种时会自动进行验证。
如果有问题,可以群内@我或私聊或到问答社区http://wenda.iyuu.cn/提问,必回。
### 2020年4月1日00:56:31
IYUUAutoReseed自动辅种备忘录gitee代码仓库https://gitee.com/ledc/IYUUAutoReseed
github代码仓库https://github.com/ledccn/IYUUAutoReseed
爱语飞飞:[https://iyuu.cn](https://iyuu.cn/)
大卫博客:[https://www.iyuu.cn](https://www.iyuu.cn/)
问答社区:[http://wenda.iyuu.cn](http://wenda.iyuu.cn/)
接口文档http://api.iyuu.cn/docs.php
### 2020年3月14日22:03:02
时光如梭转眼至v1.6.3感谢一路走来陪伴的朋友们为了共同的爱好我们相聚在这里本版本上线了合作站点认证系统合作站点有Ourbits、 HD Dolby、HDHome。
【更新提醒】手动更新的可以直接覆盖升级git安装脚本的会自动升级脚本然后对比config.sample.php手动添加用户id配置项启动辅种时会自动进行验证。
如果有问题,可以群内@我或到问答社区http://wenda.iyuu.cn/提问,必回。
### 2020年3月13日14:52:32
【重要提醒】IYUUAutoReseed自动辅种工具合作站点有OurBits、HD Dolby、HDHome可以对使用辅种工具的用户进行认证与绑定。
请大家及时根据新的示例配置config.sample.php增加用户id配置项及时认证。
### 2020年3月9日22:52:11
【喜报】辅种服务器顺利迁移阿里云。辅种接口域名api.iyuu.cn
问答社区wenda.iyuu.cn
### 2020年2月22日12:28:55
转移做种常见错误:

View File

@@ -1,4 +1,12 @@
## 重点讲解Ourbits站点的鉴权配置
## 支持用户验证的合作站点:`ourbits`,`hddolby`,`hdhome`,`pthome`,`moecat`
截止2020年7月17日20:30:53【文档更新有延迟最终以gitee、github为准】
----------
## 以讲解Ourbits站点的鉴权配置为例
博客链接https://www.iyuu.cn/archives/337/
IYUU自动辅种工具、Ourbits双方达成合作可以对使用接口的用户实现认证。
### 申请爱语飞飞微信通知token新用户访问http://iyuu.cn 申请!

View File

@@ -85,9 +85,11 @@
#### 问:如何反馈问题?
1、点击链接加入群聊【IYUU自动辅种交流】[https://jq.qq.com/?_wv=1027&k=5JOfOlM][1]
1、QQ群859882209[2000人.入门群]931954050[1000人.进阶群]
2、QQ群859882209
2、问答社区http://wenda.iyuu.cn
3、issues https://gitee.com/ledc/IYUUAutoReseed/issues
3、博客https://www.iyuu.cn
4、issues https://gitee.com/ledc/IYUUAutoReseed/issues

View File

@@ -13,7 +13,7 @@
| Google身份验证器谷歌动态口令 | 开发中 | 2020年2月21日 | |
| 自动更新 | 开发中 | 2020年2月21日 | |
| WEB页面生成配置 | 开发中 | 2020年2月21日 | |
| 种子删除自动同步 | 开发中 | 2020年2月21日 | |
| 种子删除自动同步 | 已完成 | 2020年2月21日 | 2020年5月6日 |
| 脚本docker容器化测试版 | 已完成 | 2020年2月21日 | 2020年2月21日 |
| 浏览器插件 | 暂未开始 | | |
| 合集自动拆包辅种 | 暂未开始 | | |

View File

@@ -1,46 +0,0 @@
## 404数据最后清理时间
|标志 | 最后清理时间 | 状态 |
| :-: | :-: | ---- |
| 1ptba | 2020年1月19日12:00:00 | 已完成 |
|52pt | 2020年1月19日12:00:00 | 已完成 |
|beitai-备胎 | 2020年1月19日12:00:00 | 已完成 |
|brobits | 2020年1月19日12:00:00 | 已完成 |
|btschool-学校 | 2020年1月19日12:00:00 | 已完成 |
|chdbits-彩虹岛 | 2020年1月19日12:00:00 | 已完成 |
|discfan-港知堂 | 2020年1月19日12:00:00 | 已完成 |
|dmhy-幼儿园 | 2020年1月19日12:00:00 | 已完成 |
|eastgame | 2020年1月19日12:00:00 | 已完成 |
|hd4fans-兽 | | 已完成 |
|hdarea-HDA | | |
|hdbd-伊甸园 | | |
|hdbug(hddisk) | 2020年1月19日12:00:00 | 已完成 |
|hdchina-瓷器 | 2020年1月19日12:00:00 | 已完成 |
|hdcity-城市 | 2020年1月19日12:00:00 | 已完成 |
|hddolby-杜比 | 2020年1月19日12:00:00 | 已完成 |
|hdhome-家园 | 2020年1月19日12:00:00 | 已完成 |
|hdsky-天空 | 2020年1月19日12:00:00 | 已完成 |
|hdstreet | 2020年1月19日12:00:00 | 已完成 |
|hdtime-时间 | 2020年1月19日12:00:00 | 已完成 |
|hdzone-HDZ | 2020年1月19日12:00:00 | 已完成 |
|joyhd | 2020年1月19日12:00:00 | 已完成 |
| keepfrds-朋友 | 2020年1月19日12:00:00 | 已完成 |
|leaguehd | 2020年1月19日12:00:00 | 已完成 |
| m-team-馒头 | 2020年1月19日12:00:00 | 已完成 |
|moecat-萌猫 | 2020年1月19日12:00:00 | 已完成 |
|nanyangpt-南洋 | 2020年1月19日12:00:00 | 已完成 |
|nicept-老师 | | |
|opencd-皇后 | | 已完成 |
|oshen | 2020年1月19日12:00:00 | 已完成 |
|ourbits-我堡 | 2020年1月19日12:00:00 | 已完成 |
|pterclub-猫站 | 2020年1月19日12:00:00 | 已完成 |
|pthome-铂金家 | 2020年1月19日12:00:00 | 已完成 |
|ptmsg | 2020年1月19日12:00:00 | 已完成 |
|ptsbao-烧包 | 2020年1月19日12:00:00 | 已完成 |
|soulvoice-聆音 | 2020年1月19日12:00:00 | 已完成 |
|ssd-春天 | 2020年1月19日12:00:00 | 已完成 |
|tjupt-北洋 | 2020年1月19日12:00:00 | 已完成 |
|torrentccf-TCCF | 2020年1月19日12:00:00 | 已完成 |
| ttg-听听歌 | 2020年1月19日12:00:00 | 已完成 |
| upxin | 2020年1月19日12:00:00 | 已完成 |
| yingk-映客 | 2020年1月19日12:00:00 | 已完成 |

View File

@@ -1,3 +1,42 @@
### 更多日志请查看:
### https://gitee.com/ledc/IYUUAutoReseed/commits/master
------
### 2020年8月2日
- v1.10.2版本以后的docker每5小时会自动拉取最新代码从此您只需要看公告更新配置就行啦。
- IYUUAutoReseed正式建立了docke镜像自动编译2个版本ARM64【iyuucn/iyuuautoreseed:arm64v8】、AMD64【iyuucn/iyuuautoreseed:latest】使用方法[点击查看](https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker)
- 辅种天空的用户,必须更新至最新版本。
优化了默认流控参数单次最多20个间隔20秒。
天空辅种请配置cookie并配置浏览器UA获取UA请访问[http://demo.iyuu.cn](http://demo.iyuu.cn/)
- v1.10.4版本支持qBittorrent v4.1.5 (小钢炮等)
### 2020年7月3日
1. 优化windows的辅种批处理采用环境变量调用
2. 新增站点HDRoute、hdbd、haidan、HDfans
3. 优化curl的连接参数
4. 新增小钢炮专用的docker脚本
5. 新增合作站点MoeCat
6. 微信报表增加版本号提示
7. qBittorrent下载器增加root_folder配置项是否创建子文件夹
### 2020年3月22日
1. 转移种子,设置自动开始开关
2. 添加git自动更新.cmd
3. 优化做种客户端转移配置的提示
4. 人性化加入vendor目录
5. 修复因不支持站点缓存引起的错误提示
6. 新增合作站点hddolby、hdhome、pthome
7. 修复瓷器辅种乱码不美观的问题
8. 简化docker编译文件
9. 优化合作站点登录缓存,检索请求
10. 优化输出提示未填写passkey的站点只提示一次后续自动跳过
11. 增加通用备份脚本
### 2020年2月26日
1. 新增葡萄pt

View File

@@ -1,10 +1,10 @@
以下教程以windows为基础进行讲解通用威联通、群晖、铁威马等Linux系统。
# 重要提示:请先完整阅读完再动手操作!请先完整阅读完再动手操作!
# 重要提示:请先完整阅读完再动手操作!
## 第一步 下载压缩包
从[码云仓库][1],下载最新源码,源码需安装依赖才可运行必须用composer install安装依赖包解压缩到D盘的根目录下。
**特殊说明:如果不会用composer安装依赖请去群内下载zip压缩包或者[点此下载vendor.zip][2],解压到上述目录内。**
从[码云仓库][1]下载最新源码解压缩到D盘的根目录下。
**特殊说明:新手第一次使用建议去群内下载zip压缩包。**
## 第二步 复制一份配置文件
@@ -15,21 +15,29 @@
提醒千万不要用windows记事本来编辑配置文件
推荐编辑软件:`VS code``EditPlus``SublimeText``Notepad++`保存格式选UTF8 无BOM
配置文件内容较多新手往往很迷茫不知道改哪里在这里我重点强调3个步骤
`1.申请爱语飞飞token2.编辑全局客户端; 3.编辑各站的密钥即passkey`
`1.申请爱语飞飞token2.编辑全局客户端; 3.编辑各站的密钥即passkey4.配置合作站点的passkey用户id`
其他配置,如果不懂也没有关系;先保持默认,等脚本运行起来,再修改也不迟。另外,修改时一定要细心,仔细看教程。
**下面开始详细步骤!!!!**
----------
### 申请爱语飞飞微信通知token新用户访问http://iyuu.cn 申请!
1.点击`开始使用`,出现二维码,用`微信扫码`
![微信通知1.png][3]
![微信通知2.png][4]
![微信通知3.png][5]
![微信通知1.png][2]
![微信通知2.png][3]
![微信通知3.png][4]
2.复制您的token令牌到`/config/config.php`文件内的`iyuu.cn`对应的配置字段,保存。如图:
![微信通知4.png][6]
![微信通知4.png][5]
----------
### 填写全局客户端
打开`D:\IYUUAutoReseed\config\config.php`文件,如下图:
![编辑配置1.png][7]
![编辑配置1.png][6]
上图红框内的是`transmission`的示例配置,绿框是`qBittorrent`的示例配置;
IYUU自动辅种工具目前支持这两种下载器支持多盘位辅种时全自动对应资源的下载目录。
#### 1编辑`transmission`下载器
@@ -39,60 +47,81 @@ username是用户名、password是密码。没有用户名和密码的都填
#### 2编辑`qBittorrent`下载器
方法与上一步相同只需填写ip、端口、用户名、密码即可。如果您是windows下的qBittorrent请打开`WEB用户界面`,设置如下图:
![qb设置WEB用户界面.png][8]
![qb设置WEB用户界面.png][7]
因为我两个下载器都在用,编辑好后,如图:
![编辑配置2.png][9]
![编辑配置2.png][8]
----------
### 填写各站秘钥passkey
IYUU自动辅种需要您配置各站的passkey目前支持40多个站点的自动辅种没有配置passkey的站点会自动跳过
从各站点的控制面板,找到您的`密钥`复制粘贴过来即可。
IYUU自动辅种需要您配置各站的passkey目前支持40多个站点的自动辅种没有配置passkey的站点会自动跳过2019年12月28日补充辅种hdcity、hdchina需要配置cookie。
从各站点的控制面板或对应地方,找到您的`密钥`复制粘贴过来即可。
配置好后如图:
![编辑配置3.png][10]
![编辑配置3.png][9]
----------
## 第四步,重点讲解Ourbits站点的配置
IYUU自动辅种工具、Ourbits双方达成合作可以对使用接口的用户实现认证。
### 设置Ourbits
![编辑配置4.png][11]
## 第四步,合作站点的配置
此处配置也可以参考这里https://www.iyuu.cn/archives/337/
IYUU自动辅种工具与站点达成合作可以对使用接口的用户实现认证。以Ourbits为例进行讲解
![编辑配置4.png][10]
`passkey`,在你的控制面板 - 密钥
`is_vip`,根据你的实际情况填写,因站点有下载种子的流控,如果你不在限制之列,可以`设置为1`
`id`,为用户中心打开后,浏览器地址栏**http://xxxxx.xxx/userdetails.php?id=`46880`**等号=后面的几个数字,如图:
![编辑配置6.png][12]
![编辑配置6.png][11]
如果有多个合作站账号,请全部配置,如图:
![合作站点ID.png][12]
到此配置文件编辑完毕请记得保存如果提示保存格式请保存为UTF8无BOM格式。
到此,配置文件编辑完毕,请记得保存。
如果提示保存格式请保存为UTF8无BOM格式。
----------
## 群晖、铁威马、威联通等Linux的php环境
**群晖、铁威马、威联通自带php运行环境非常简单。**
经过上面步骤其实已经完成了配置只需要把脚本复制到设备内用php命令运行脚本即可。
下面是各系统运行php的命令
群晖php`php`
威联通php `/mnt/ext/opt/apache/bin/php`
铁威马php`php`
群晖php命令`php`
威联通php命令 `/mnt/ext/opt/apache/bin/php`
铁威马php命令`php`
----------
**威联通补充几个命令,找到辅种脚本:**
```sh
#查看php版本
/mnt/ext/opt/apache/bin/php -v
#切换admin
sudo -i
#搜索iyuu.php或IYUUAutoReseed
find / -name iyuu.php
#根据上一行命令搜索结果,组成辅种命令:
/mnt/ext/opt/apache/bin/php 找到的路径/iyuu.php
```
----------
## Windows安装PHP运行环境
也可以去官方下载【https://www.php.net/downloads】
**特别提醒:官方下载的记得开启`curl、fileinfo、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、fileinfo、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、fileinfo、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、json、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、json、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、json、mbstring`这3个扩展。**
![php开启扩展.png][13]
**特别提醒:官方下载的记得开启`curl、fileinfo、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、fileinfo、mbstring`这3个扩展。**
**特别提醒:官方下载的记得开启`curl、fileinfo、mbstring`这3个扩展。**
**另外我打包了一份【扩展已开启】,下载地址:**
!!!
<a href="http://dawei.hk:81/php-7.4.2-nts-Win32-vc15-x86.zip" target="_blank"><h3><code>http://dawei.hk:81/php-7.4.2-nts-Win32-vc15-x86.zip</code></h3></a>
<a href="http://dawei.hk:81/php-7.4.2-nts-Win32-vc15-x64.zip" target="_blank"><h3><code>http://dawei.hk:81/php-7.4.2-nts-Win32-vc15-x64.zip</code></h3></a>
<a href="http://www.dawei.hk:81/php-7.4.2-nts-Win32-vc15-x86.zip" target="_blank"><h3><code>http://www.dawei.hk:81/php-7.4.2-nts-Win32-vc15-x86.zip</code></h3></a>
<a href="http://www.dawei.hk:81/php-7.4.2-nts-Win32-vc15-x64.zip" target="_blank"><h3><code>http://www.dawei.hk:81/php-7.4.2-nts-Win32-vc15-x64.zip</code></h3></a>
!!!
@@ -103,23 +132,31 @@ IYUU自动辅种工具、Ourbits双方达成合作可以对使用接口的用
链接https://share.weiyun.com/57uYFrn 密码gurkdc
下载回来是一个ZIP压缩包解压到`D:\IYUUAutoReseed\`目录内,文件结构如图:
![编辑配置7.png][14]
点击红框内`执行辅种`即可。
重点根据你下载的版本不同、路径不同请把你解压的php环境的路径添加进系统的环境变量内。比如我下载的是`php-7.4.2-nts-Win32-vc15-x86.zip`解压到了D盘根目录下可以这样添加
![请输入图片描述][15]
然后,点击红框内`执行辅种`即可,也可以运行命令:`php iyuu.php`
> 提示新手第一次请去群内下载打包好的Windows版本双击运行即可。
如果你前期严格按照配置一步步操作,这里会正常显示跑动的辅种列表。正常如图:
![编辑配置8.png][15]
![编辑配置8.png][16]
[1]: https://gitee.com/ledc/IYUUAutoReseed
[2]: https://www.iyuu.cn/usr/uploads/2020/02/3155906692.zip
[3]: https://www.iyuu.cn/usr/uploads/2019/12/2331433923.png
[4]: https://www.iyuu.cn/usr/uploads/2019/12/3324442680.png
[5]: https://www.iyuu.cn/usr/uploads/2019/12/3181272964.png
[6]: https://www.iyuu.cn/usr/uploads/2019/12/3669828008.png
[7]: https://www.iyuu.cn/usr/uploads/2019/12/2720183833.png
[8]: https://www.iyuu.cn/usr/uploads/2019/12/405587689.png
[9]: https://www.iyuu.cn/usr/uploads/2019/12/441257656.png
[10]: https://www.iyuu.cn/usr/uploads/2019/12/890327305.png
[11]: https://www.iyuu.cn/usr/uploads/2019/12/3696916642.png
[12]: https://www.iyuu.cn/usr/uploads/2019/12/1230288911.png
[2]: https://www.iyuu.cn/usr/uploads/2019/12/2331433923.png
[3]: https://www.iyuu.cn/usr/uploads/2019/12/3324442680.png
[4]: https://www.iyuu.cn/usr/uploads/2019/12/3181272964.png
[5]: https://www.iyuu.cn/usr/uploads/2019/12/3669828008.png
[6]: https://www.iyuu.cn/usr/uploads/2019/12/2720183833.png
[7]: https://www.iyuu.cn/usr/uploads/2019/12/405587689.png
[8]: https://www.iyuu.cn/usr/uploads/2019/12/441257656.png
[9]: https://www.iyuu.cn/usr/uploads/2019/12/890327305.png
[10]: https://www.iyuu.cn/usr/uploads/2019/12/3696916642.png
[11]: https://www.iyuu.cn/usr/uploads/2019/12/1230288911.png
[12]: https://www.iyuu.cn/usr/uploads/2020/04/712430028.png
[13]: https://www.iyuu.cn/usr/uploads/2019/12/3007415838.png
[14]: https://www.iyuu.cn/usr/uploads/2019/12/3189986236.png
[15]: https://www.iyuu.cn/usr/uploads/2019/12/2523845772.png
[15]: https://www.iyuu.cn/usr/uploads/2020/03/686511859.png
[16]: https://www.iyuu.cn/usr/uploads/2019/12/2523845772.png

View File

@@ -1,4 +0,0 @@
@echo off
chcp 65001
%cd%\php-7.4.2-nts-Win32-vc15-x86\php %cd%\iyuu.php
pause

View File

@@ -1,7 +0,0 @@
@echo off
chcp 65001
git fetch --all
git reset --hard origin/master
git pull
%cd%\php-7.4.2-nts-Win32-vc15-x86\php %cd%\iyuu.php
pause

View File

@@ -1,4 +0,0 @@
@echo off
chcp 65001
D:\IYUUAutoReseed\php-7.4.2-nts-Win32-vc15-x86\php.exe D:\IYUUAutoReseed\iyuu.php
exit