open-115-sdk
Version:
115生活开放SDK接口封装
234 lines (233 loc) • 7.65 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Open115SDK = exports.Open115Error = void 0;
const axios_1 = __importDefault(require("axios"));
const api_urls_1 = __importDefault(require("./api-urls"));
const util_1 = require("./util");
class Open115Error extends Error {
constructor(message) {
super(message);
this.name = 'Open115Error';
}
}
exports.Open115Error = Open115Error;
class Open115SDK {
constructor(config) {
this.token = config.token;
this.clientId = config.clientId;
this.client = axios_1.default.create({
baseURL: config.baseURL || api_urls_1.default.DOMAIN,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
});
this.client.interceptors.request.use((config) => {
if (this.token) {
config.headers['Authorization'] = `Bearer ${this.token}`;
}
return config;
});
// 添加响应拦截器处理错误
this.client.interceptors.response.use(response => {
return response;
}, error => {
var _a;
if (error.response) {
throw new Open115Error(`API请求失败: ${error.response.status} ${((_a = error.response.data) === null || _a === void 0 ? void 0 : _a.message) || '未知错误'}`);
}
throw new Open115Error('网络请求失败');
});
}
/**
* 设置认证token
* @param token
*/
setToken(token) {
this.token = token;
//this.client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
}
/**
* 获取设备码和二维码内容
* 使用接口返回的 data.qrcode 作为二维码的内容,在第三方客户端展示二维码,用于给115客户端扫码授权。
*/
async authDeviceCode() {
this.codeVerifier = await (0, util_1.generateCodeVerifier)();
const codeChallenge = await (0, util_1.generateCodeChallenge)(this.codeVerifier);
const resp = await this.client.post(api_urls_1.default.AUTH_DEVICE_CODE, {
client_id: this.clientId,
code_challenge: codeChallenge,
code_challenge_method: 'sha256'
});
return resp.data;
}
/**
* 轮询二维码状态
* 此为长轮询接口。注意:当二维码状态没有更新时,此接口不会立即响应,直到接口超时或者二维码状态有更新。
* @param uid 二维码ID/设备码,从 authDeviceCode 方法 data.uid 获取
* @param time 校验参数,从 authDeviceCode 方法 data.time 获取
* @param sign 校验签名,从 authDeviceCode 方法 data.sign 获取
*/
async loginScanQrCodeStatus(uid, time, sign) {
const resp = await this.client.get(api_urls_1.default.AUTH_QRCODE_STATUS, {
params: { uid, time, sign },
});
return resp.data;
}
/**
* 用设备码换取 access_token
* @param uid 二维码ID/设备码
*/
async authDeviceCodeToToken(uid) {
const resp = await this.client.post(api_urls_1.default.AUTH_CODE_TO_TOKEN, {
uid: uid,
code_verifier: this.codeVerifier,
});
if (resp.data.access_token) {
this.setToken(resp.data.access_token);
}
return resp.data;
}
/**
* 刷新 access_token
* 请勿频繁刷新,否则列入频控。
* @param refresh_token 二维码ID/设备码
*/
async authRefreshToken(refresh_token) {
const resp = await this.client.post(api_urls_1.default.AUTH_CODE_TO_TOKEN, {
refresh_token
});
if (resp.data.access_token) {
this.setToken(resp.data.access_token);
}
return resp.data;
}
/**
* 获取用户空间和vip信息
*/
async userInfo() {
const resp = await this.client.get(api_urls_1.default.USER_INFO);
return resp.data;
}
/**
* 创建目录
* @param body
*/
async folderAdd(body) {
const resp = await this.client.post(api_urls_1.default.FOLDER_ADD, body);
return resp.data;
}
/**
* 获取目录信息
* @param fileId
*/
async folderGetInfo(fileId) {
const resp = await this.client.get(api_urls_1.default.FOLDER_GET_INFO, { params: { file_id: fileId } });
return resp.data;
}
/**
* 获取文件列表
* @param params
*/
async files(params) {
const resp = await this.client.get(api_urls_1.default.U_FILE_FILES, { params });
return resp.data;
}
/**
* 根据文件名搜索文件(夹)
* @param params
*/
async fileSearch(params) {
const resp = await this.client.get(api_urls_1.default.U_FILE_SEARCH, { params });
return resp.data;
}
/**
* 批量复制文件
* @param body
*/
async fileCopy(body) {
const resp = await this.client.post(api_urls_1.default.U_FILE_COPY, body);
return resp.data;
}
/**
* 批量移动文件
* @param body
*/
async fileMove(body) {
const resp = await this.client.post(api_urls_1.default.U_FILE_MOVE, body);
return resp.data;
}
/**
* 根据文件提取码取文件下载地址
* @param pick_code 文件提取码
*/
async fileDownUrl(pick_code) {
const resp = await this.client.post(api_urls_1.default.U_FILE_DOWN_URL, { pick_code });
return resp.data;
}
/**
* 批量更新文件名、星标文件
* @param body
*/
async fileUpdate(body) {
const resp = await this.client.post(api_urls_1.default.U_FILE_UPDATE, body);
return resp.data;
}
/**
* 删除文件
* @param body
*/
async fileDelete(body) {
const resp = await this.client.post(api_urls_1.default.U_FILE_DELETE, body);
return resp.data;
}
/**
* 回收站列表
* @param offset 数据显示偏移量
* @param limit 单页记录数,int,默认30,最大200
*/
async rbList(offset = 0, limit = 0) {
const resp = await this.client.get(api_urls_1.default.RB_LIST, {
params: { offset, limit },
});
return resp.data;
}
/**
* 还原回收站文件(夹)
* @param tld 需要还原的ID,可多个
*/
async rbRevert(tld) {
const resp = await this.client.post(api_urls_1.default.RB_REVERT, {
tld: Array.isArray(tld) ? tld.join(',') : tld,
});
return resp.data;
}
/**
* 还原回收站文件(夹)
* @param tld 需要还原的ID,可多个
*/
async rbDel(tld) {
const resp = await this.client.post(api_urls_1.default.RB_DEL, {
tld: Array.isArray(tld) ? tld.join(',') : tld,
});
return resp.data;
}
/**
* 获取开放平台产品列表扫描跳转链接地址
* @param openDevice 设备号
* @param defaultProductId 默认产品ID
*/
async vipQrUrl(openDevice, defaultProductId = '') {
const resp = await this.client.get(api_urls_1.default.VIP_QR_URL, {
params: {
open_device: openDevice,
default_product_id: defaultProductId,
}
});
return resp.data;
}
}
exports.Open115SDK = Open115SDK;
exports.default = Open115SDK;