98 lines
2.2 KiB
TypeScript
98 lines
2.2 KiB
TypeScript
import axios, { AxiosInstance } from 'axios';
|
||
import crypto from 'crypto';
|
||
|
||
export class TailchatClient {
|
||
request: AxiosInstance;
|
||
jwt: string | null = null;
|
||
userId: string | null = null;
|
||
loginP: Promise<void>;
|
||
|
||
constructor(
|
||
public url: string,
|
||
public appId: string,
|
||
public appSecret: string
|
||
) {
|
||
if (!url || !appId || !appSecret) {
|
||
throw new Error(
|
||
'Require params: apiUrl, appId, appSecret. You can set it with env'
|
||
);
|
||
}
|
||
|
||
this.request = axios.create({
|
||
baseURL: url,
|
||
});
|
||
this.request.interceptors.request.use(async (val) => {
|
||
if (
|
||
this.jwt &&
|
||
['post', 'get'].includes(String(val.method).toLowerCase()) &&
|
||
!val.headers['X-Token']
|
||
) {
|
||
// 任何请求都尝试增加token
|
||
val.headers['X-Token'] = this.jwt;
|
||
}
|
||
|
||
return val;
|
||
});
|
||
this.loginP = this.login();
|
||
}
|
||
|
||
async login() {
|
||
try {
|
||
console.log('正在登录...');
|
||
const { data } = await this.request.post('/api/openapi/bot/login', {
|
||
appId: this.appId,
|
||
token: this.getBotToken(),
|
||
});
|
||
|
||
// NOTICE: 注意,有30天过期时间,需要定期重新登录以换取新的token
|
||
// 这里先不换
|
||
this.jwt = data.data?.jwt;
|
||
|
||
console.log('tailchat openapp login success!');
|
||
|
||
// 尝试调用函数
|
||
// this.whoami().then(console.log);
|
||
} catch (err) {
|
||
console.error(err);
|
||
throw new Error('登录失败, 请检查应用凭证');
|
||
}
|
||
}
|
||
|
||
async call(action: string, params = {}) {
|
||
try {
|
||
await Promise.resolve(this.loginP);
|
||
console.log('正在调用服务:', action);
|
||
const { data } = await this.request.post(
|
||
'/api/' + action.replace(/\./g, '/'),
|
||
params
|
||
);
|
||
|
||
return data;
|
||
} catch (err: any) {
|
||
console.error('服务调用失败:', err);
|
||
const data: string = err?.response?.data;
|
||
if (data) {
|
||
throw new Error(
|
||
JSON.stringify({
|
||
action,
|
||
data,
|
||
})
|
||
);
|
||
} else {
|
||
throw err;
|
||
}
|
||
}
|
||
}
|
||
|
||
async whoami() {
|
||
return this.call('user.whoami');
|
||
}
|
||
|
||
getBotToken() {
|
||
return crypto
|
||
.createHash('md5')
|
||
.update(this.appId + this.appSecret)
|
||
.digest('hex');
|
||
}
|
||
}
|