Files
PicList/src/main/manage/utils/dogeAPI.ts
2025-08-06 11:19:19 +08:00

78 lines
1.9 KiB
TypeScript

import crypto from 'node:crypto'
import querystring from 'node:querystring'
import picgo from '@core/picgo'
import axios from 'axios'
import type { IObj } from '#/types/types'
export interface DogecloudToken {
accessKeyId: string
secretAccessKey: string
sessionToken: string
}
export async function dogecloudApi (
apiPath: string,
data = {},
jsonMode: boolean = false,
accessKey: string,
secretKey: string
) {
const body = jsonMode ? JSON.stringify(data) : querystring.encode(data)
const sign = crypto
.createHmac('sha1', secretKey)
.update(Buffer.from(apiPath + '\n' + body, 'utf8'))
.digest('hex')
const authorization = `TOKEN ${accessKey}:${sign}`
try {
const res = await axios.request({
url: 'https://api.dogecloud.com' + apiPath,
method: 'POST',
data: body,
responseType: 'json',
headers: {
'Content-Type': jsonMode ? 'application/json' : 'application/x-www-form-urlencoded',
Authorization: authorization
}
})
if (res.data.code !== 200) {
throw new Error('API Error')
}
return res.data.data
} catch (err: any) {
throw new Error('API Error')
}
}
export async function getTempToken (accessKey: string, secretKey: string): Promise<IObj | DogecloudToken> {
const dogeTempToken = (await picgo.getConfig('Credentials.doge-token')) || ({} as any)
if (dogeTempToken.token && dogeTempToken.expires > Date.now() + 7200000) {
return dogeTempToken.token
}
try {
const data = await dogecloudApi(
'/auth/tmp_token.json',
{
channel: 'OSS_FULL',
scopes: ['*']
},
true,
accessKey,
secretKey
)
const token = data.Credentials
picgo.saveConfig({
Credentials: {
'doge-token': {
token,
expires: data.ExpiredAt * 1000
}
}
})
return token
} catch (err: any) {
return {}
}
}