最近项目中有这么一个需求,由于我们用的腾讯直播软件(TClass,腾讯云互动课堂)老师录制的视频存储在腾讯那边,但是腾讯保存视频只有三天有效期,因此,我们需要抓取视频到我们的七牛云上面,要求低频存储,要求存储到私有空间。
同步抓取第三方资源
const qiniu = require('qiniu');
const accessKey = 'your accessKey';
const secretKey = 'your secretKey';
let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
let config = new qiniu.conf.Config();
config.zone = qiniu.zone.Zone_z0;
let bucketManager = new qiniu.rs.BucketManager(mac, config);
let resUrl = 'https://blog.adityasui.com/_nuxt/img/user.85831cd.jpg';
let bucket = 'cris-store';
let key = 'sync.png';
bucketManager.fetch(resUrl, bucket, key, function (err, respBody, respInfo) {
if (err) {
console.log(err);
} else {
if (respInfo.statusCode === 200) {
console.log(respBody.key);
console.log(respBody.hash);
console.log(respBody.fsize);
console.log(respBody.mimeType);
} else {
console.log(respInfo.statusCode);
console.log(respBody);
}
}
});
异步抓取第三方资源
但是同步抓取第三方资源的方式不支持不能传递参数,因此不能满足我们低频存储的需求,而异步抓取第三方的资源是支持传递参数的
const qiniu = require('qiniu');
const accessKey = 'your accessKey';
const secretKey = 'your secretKey';
let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
let bucket = 'cris-store';
let resUrl = 'https://blog.adityasui.com/_nuxt/img/user.85831cd.jpg';
let key = 'async.png';
let fetchUrl = "http://api-z0.qiniu.com/sisyphus/fetch";
const reqBody = {
url: resUrl,
bucket,
file_type: 1, // 0:标准存储(默认),1:低频存储,2:归档存储
key,
};
const reqBodyStr = JSON.stringify(reqBody);
qiniu.rpc.post(fetchUrl, reqBodyStr, {
Authorization: qiniu.util.generateAccessTokenV2(mac, fetchUrl, 'POST', 'application/json', reqBodyStr),
'Content-Type': 'application/json',
},
function (error, response, body) {
try {
if (error) throw error;
console.log(body);
} catch (e) {
console.log(e);
}
}
);
其中低频存储只需要传递file_type为1就可以了。
真的很想吐槽一下七牛的文档,明明API都已经写好了,但是就是没有把API写到文档里
私有资源下载
访问私有资源URL与公开资源URL相比只是增加了两个参数e
和token
,分别表示过期时间和下载凭证,因为七牛已经提供了生成下载凭证的例子,这里直接上代码
const qiniu = require('qiniu');
const accessKey = 'your accessKey';
const secretKey = 'your secretKey';
let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
let config = new qiniu.conf.Config();
let bucketManager = new qiniu.rs.BucketManager(mac, config);
let privateBucketDomain = 'http://qagyyccko.bkt.clouddn.com';
let deadline = parseInt(Date.now() / 1000) + 3600; // 1小时过期 采用Unix时间戳,单位为秒
let privateDownloadUrl = bucketManager.privateDownloadUrl(privateBucketDomain, 'whq.mp4', deadline);
console.log('@privateDownloadUrl', privateDownloadUrl);
但是后来又遇到一个问题,就是明明设置有效期20秒后,发现过了20秒,资源还是可以访问,于是Google了很久才发现,测试域名不能用于私有空间和自定义域名必须开启回源鉴权。按照官网配置即可。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。