UNPKG

@umengfe/mcp-server-umeng-openapi

Version:

MCP server for using the Umeng OpenAPI

53 lines (52 loc) 2.04 kB
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;