优化
This commit is contained in:
97
apps/github-app/src/client.ts
Normal file
97
apps/github-app/src/client.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user