@umengfe/mcp-server-umeng-openapi
Version:
MCP server for using the Umeng OpenAPI
53 lines (52 loc) • 2.04 kB
JavaScript
import * as crypto from 'crypto';
class UmengOpenAPI {
apiKey;
apiSecurity;
baseURL = 'https://gateway.open.umeng.com/openapi';
constructor(apiKey, apiSecurity) {
this.apiKey = apiKey;
this.apiSecurity = apiSecurity;
}
/**
* 生成签名并返回完整请求URL
* @param {string} url - 请求URL(如:https://api.umeng.com/data/get)
* @param {Object} params - 请求参数(如:{ appkey: "123", date: "20230101" })
* @returns {string} 带签名的完整URL
*/
generateSignedUrl(url, params) {
// 1. 提取URL路径和查询参数
const urlPath = `${url}/${this.apiKey}`;
// 2. 处理参数:添加时间戳并排序
const now = Date.now(); // 当前时间戳(秒)
const sortedParams = {
...params,
_aop_timestamp: now,
};
const keys = Object.keys(sortedParams).sort();
// 3. 构造参数字符串(URL编码)
const queryStr = keys
.map(key => `${encodeURIComponent(key)}${encodeURIComponent(sortedParams[key])}`)
.join('');
const queryStrRaw = keys
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(sortedParams[key])}`)
.join('&');
// 4. 构造签名字符串(路径 + \n + 参数)
const signString = `${urlPath}${queryStr}`;
// 5. 计算签名
const signature = this.generateSignature(signString);
// 6. 拼接完整URL
const fullUrl = `${this.baseURL}/${urlPath}?${queryStrRaw}&_aop_signature=${signature}`;
return fullUrl;
}
/**
* 使用HMAC-SHA1生成签名
* @param {string} signString - 签名字符串
* @returns {string} 签名结果(大写十六进制)
*/
generateSignature(signString) {
const hmac = crypto.createHmac('sha1', this.apiSecurity);
hmac.update(signString);
return hmac.digest('hex').toUpperCase(); // 转为大写
}
}
export default UmengOpenAPI;