起因:我有一个项目需要大量的直链空间存储文件,而服务器本身的空间肯定是不够的
就在这时,我想到了城通网盘,存储的问题解决了,但是如何解决直链的问题呢?城通网盘本身的直链有十分严苛的流量限制,而现存的城通解析API普遍失效。我便写出了这篇文章。
1.城通密码API解析
现在的城通网盘都带上了密码,用户使用链接的时候会先被跳转到一个页面输入密码。而这个页面的“确认按钮”绑定了verify_passcode事件。
verify_passcode事件的内部代码很简单:
//文件名:Undertale v1.001 (Edited by Sxxfgh).7z
//文件链接:https://url21.ctfile.com/f/35031121-532806680-924b31
//访问密码:6290
//以下为当前网页的变量对应
api_server = 'https://webapi.ctfile.com';
file_id = 532806680;
folder_id = 0;
userid = 35031121;
$("#passcode").val() = 6290;
//Math.random()会生成一个随机小数
//让我们在看以下代码
function verify_passcode() {
$.ajax({
type: 'GET',
url: api_server + "/passcode.php?file_id=" + file_id + "&folder_id=" + folder_id + "&userid=" + userid + "&passcode=" + $("#passcode").val() + "&r=" + Math.random(),
dataType: 'json',
success: function (res) {
if (res.code == 200) {
passcode = res.passcode;
init_load();
} else {
error_code_handler(res);
}
loadtextad();
},
});
}
而上面的代码综合一下就是用"GET"方式访问:
--------------------------------------------
也别慢慢研究了,直接给答案
2-1.获取文件信息
fileID = "35031121-532806680-924b31"; //文件ID,网址后的东西
pass = "6290"; //文件密码
r = Math.random(); //随机一个小于1的小数
fileInfoUrl = "https://webapi.ctfile.com/getfile.php?path=f&f=" + fileID + "&passcode=" + pass + "&token=false&r=" + r;
fileInfoUrl 为一个可以获取到Json的网址,获取到Json之后各位可以自己看着做——所有的信息全在Json文件里。
2-2.获取文件直链
直链API需要很多东西——而这些东西在信息API中竟然全有!
fileID = "35031121-532806680-924b31"; //文件ID,网址后的东西
pass = "6290"; //文件密码
r = Math.random(); //随机一个小于1的小数
fileInfoUrl = "https://webapi.ctfile.com/getfile.php?path=f&f=" + fileID + "&passcode=" + pass + "&token=false&r=" + r;
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
jsonText = JSON.parse(xhr.responseText);
}
};
xhr.open('get', fileInfoUrl);
xhr.send(null);
fileUrl = "https://webapi.ctfile.com/get_file_url.php?uid=" + jsonText.userid + "&fid=" + jsonText.file_id + "&file_chk=" + jsonText.file_chk + "&app=0&acheck=2&rd=" + Math.random()
// fileUrl 也是一个 json 文件的链接,直链就直接在里面了
有事,先溜了,具体发现过程以后讲吧
2022-03-19更新-----------
3-1.获取VIP直链
在上面的一堆接口中我们看到了有一个名为https://webapi.ctfile.com/getfile.php的接口,城通网盘官方是这么描述这个接口的——
查询文件信息及获取VIP下载地址。
通过本接口可以通过用户ID和文件编号的组合查询文件信息,并获取VIP高速下载地址。请注意,文件查询接口必须提供真实的访问来源 (ref参数),若不提供将被拦截和停止使用接口。
这说明此接口有个【要求】,即为必须提供ref参数,也就是真实的访问来源。
此接口有如下的参数表
参数名 | 是否必须 | 类型 | 说明 |
f | 是 | string | 文件ID |
passcode | 否 | string | 如文件需要访问密码,可在此提供 |
token | 否 | string | 用户登录时获取的登陆密钥 |
r | 否 | string | 随机数,防止浏览器强制缓存 |
ref | 是 | string | 访问来源地址,可通过document.referrer获取 |
这意味着如果我们想要使用此接口就必须要拥有“token”,至于其他的数据我们已经能够知道了——毕竟你肯定知道文件的ID和密码吧!
token涉及到另一个城通API:
怎么使用呢?很简单明了
https://rest.ctfile.com/v1/user/auth/login?email=xxx&password=xxx
email是邮箱,password是密码,至于验证码?抱歉,不存在!
使用GET方式后返回:
{"code":200,"token":"dd4b4fcb445cb1c60e5f682fd39fk3a7"}
token就是我们需要的【令牌】,通过登录接口获取的token有效期为三天。
r为一个随机数,这个随机数是什么都没关系,毕竟它被设置的初衷就是“防止浏览器缓存”
ref为来源网址,即为你使用该API的网站的网址,建议填入,否则可能会出现接口禁用的情况。