@666666/messagejs
Version:
A message sending util
84 lines (83 loc) • 2.99 kB
JavaScript
import got from "got";
import { assignIn, isObject } from 'lodash-es';
import { ScEncode } from '../../utils/index.js';
class ServerChan {
BASE_URL = 'https://sctapi.ftqq.com/';
baseOptions = {
sendKey: ''
};
/**
*
* @param options
* @param options.sendKey 网页中获取的sendKey
* @param options.encodeOptions 端对端加密配置
* @param options.encodeOptions.uid 用户uid, 网页中可获取
* @param options.encodeOptions.key 查看消息的密码
*/
constructor(options) {
if (!options.sendKey) {
throw Error('sendKey is required!');
}
this.baseOptions = assignIn(this.baseOptions, options);
}
/**
* ServerChan send api
* @param sendOptions 配置
* @param sendOptions.title 标题
* @param sendOptions.desp 内容
* @param sendOptions.openid 收信人openid
* @param sendOptions.encoded 是否进行端对端加密, 需要先配置key和uid
* @param sendOptions.channel 发送通道, '|'好分隔,最多2个
* @returns
*/
send = (sendOptions) => {
return new Promise((resolve, reject) => {
const url = `${this.BASE_URL}${this.baseOptions.sendKey}.send`;
const { title, desp, encoded, openid, channel } = sendOptions;
const postForm = {
title,
openid,
desp: '',
encoded: encoded ? 1 : '',
channel
};
if (encoded && isObject(this.baseOptions.encodeOptions)) {
if (!this.baseOptions.encodeOptions.uid || !this.baseOptions.encodeOptions.key) {
reject(new Error('encoded params is requird!'));
}
else {
postForm.desp = ScEncode(desp, this.baseOptions.encodeOptions.key, this.baseOptions.encodeOptions.uid);
}
}
else {
postForm.desp = desp;
}
got.post(url, {
form: postForm,
hooks: {
beforeError: [
(error) => {
const { response } = error;
if (response?.statusCode === 400) {
if (typeof response.body === 'string') {
error.message = JSON.parse(response.body).message;
}
}
return error;
}
]
}
})
.then((res) => {
if (res.statusCode === 200) {
const body = JSON.parse(res.body);
resolve(body);
}
})
.catch(err => {
reject('ERROR: ' + err.message || 'unknow error');
});
});
};
}
export default ServerChan;