UNPKG

n8n-nodes-onebot-api

Version:

OneBot node for n8n workflow, now you can send message to your QQ friend or group. This version includes optimized group and private chat operations and enhanced permission grading. OneBot 节点用于 n8n 工作流,现在您可以向您的 QQ 朋友或群组发送消息。此版本包括优化的群聊和私聊操作以及增强的权限分级。

123 lines 5.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.apiRequest = void 0; function isNetworkError(error) { const errorMessage = error instanceof Error ? error.message : String(error); return (errorMessage.includes('ECONNRESET') || errorMessage.includes('ETIMEDOUT') || errorMessage.includes('ENOTFOUND') || errorMessage.includes('ENETUNREACH') || errorMessage.includes('ECONNREFUSED') || errorMessage.includes('The connection to the server was closed unexpectedly') || errorMessage.includes('was aborted') || errorMessage.includes('timed out') || errorMessage.includes('getaddrinfo') || errorMessage.includes('socket hang up') || errorMessage.includes('network timeout')); } function isTimeoutError(error) { const errorMessage = error instanceof Error ? error.message : String(error); return (errorMessage.includes('ETIMEDOUT') || errorMessage.includes('timed out') || errorMessage.includes('timeout')); } function isConnectionAbortedError(error) { const errorMessage = error instanceof Error ? error.message : String(error); return (errorMessage.includes('aborted') || errorMessage.includes('connection') || errorMessage.includes('socket')); } const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); function simplifyBase64ForLog(jsonStr) { return jsonStr.replace(/(base64:\/\/[A-Za-z0-9+\/=]{20})[A-Za-z0-9+\/=]+/g, '$1...[BASE64数据]'); } async function apiRequest(method, endpoint, body, query, maxRetries = 1) { const credentials = (await this.getCredentials('oneBotApi')); const baseURL = credentials.server; if (!endpoint.startsWith('/')) { endpoint = '/' + endpoint; } const processedQuery = {}; if (query) { console.log('原始查询参数:', JSON.stringify(query)); for (const key in query) { if (query[key] !== undefined && query[key] !== null) { if (typeof query[key] === 'number') { processedQuery[key] = query[key]; } else if (typeof query[key] === 'string') { processedQuery[key] = query[key]; } else if (typeof query[key] === 'boolean') { processedQuery[key] = query[key]; } else if (typeof query[key] === 'object') { processedQuery[key] = JSON.stringify(query[key]); } } } console.log('处理后的查询参数:', JSON.stringify(processedQuery)); } let timeoutValue = 30000; if (endpoint.includes('send_') && endpoint.includes('_msg')) { timeoutValue = 60000; } const options = { url: endpoint, baseURL, headers: { 'User-Agent': 'n8n', }, method, body, qs: processedQuery, json: true, timeout: timeoutValue, }; let retries = 0; let lastError; while (retries <= maxRetries) { try { let bodyLog = ''; if (body) { const bodyStr = JSON.stringify(body); const simplifiedBody = simplifyBase64ForLog(bodyStr); bodyLog = `请求体: ${simplifiedBody.length > 1000 ? simplifiedBody.substring(0, 1000) + '...(省略)' : simplifiedBody}`; } console.log(`${retries > 0 ? `[重试 ${retries}/${maxRetries}] ` : ''}发送${method}请求到 ${baseURL}${endpoint}`, bodyLog, processedQuery && Object.keys(processedQuery).length > 0 ? `查询参数: ${JSON.stringify(processedQuery)}` : ''); const response = await this.helpers.httpRequestWithAuthentication.call(this, 'oneBotApi', options); console.log(`API响应状态: ${response.status || '未知'}`); const responseStr = JSON.stringify(response); const simplifiedResponse = simplifyBase64ForLog(responseStr); console.log(`API响应内容: ${simplifiedResponse.length > 500 ? simplifiedResponse.substring(0, 500) + '...(省略)' : simplifiedResponse}`); if (response.status === 'failed') { console.error('API请求失败:', response.message || '未知错误'); throw new Error(`OneBot API错误: ${response.message || '未知错误'}`); } return response; } catch (error) { lastError = error; const errorMsg = error instanceof Error ? error.message : String(error); if (isTimeoutError(error)) { console.log(`请求超时: ${errorMsg}`); } else if (isConnectionAbortedError(error)) { console.log(`连接中断: ${errorMsg}`); } if (isNetworkError(error) && retries < maxRetries) { retries++; const waitTime = retries * 1000; console.log(`遇到网络错误: ${errorMsg}, 将在${waitTime}毫秒后重试 (${retries}/${maxRetries})`); await sleep(waitTime); } else { console.error('API请求失败:', errorMsg); throw error; } } } throw lastError; } exports.apiRequest = apiRequest; //# sourceMappingURL=GenericFunctions.js.map