diff --git a/apps/tools.js b/apps/tools.js index 31a6b9b..84b125c 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -272,7 +272,7 @@ export class tools extends plugin { // 翻译插件 async trans(e) { const languageReg = /翻(.)/s; - const msg = e.msg.trim(); + let msg = e.msg.trim(); const language = languageReg.exec(msg); if (!(language[1] in transMap)) { e.reply( @@ -280,7 +280,16 @@ export class tools extends plugin { ); return; } - const place = msg.slice(1 + language[1].length) + let place = msg.slice(1 + language[1].length) + if (_.isEmpty(place)) { + const reply = await e?.getReply(); + if (reply !== undefined) { + logger.info(reply); + place = reply.message.find(item => item.text !== undefined).text; + } else { + return; + } + } // 如果没有百度那就Google const translateResult = await this.translateEngine.translate(place, language[1]); e.reply(translateResult.trim(), true); diff --git a/utils/trans-strategy.js b/utils/trans-strategy.js index e9c6029..57f8648 100644 --- a/utils/trans-strategy.js +++ b/utils/trans-strategy.js @@ -1,7 +1,6 @@ -import {transMap, tencentTransMap, googleTransMap} from "../constants/constant.js"; +import { transMap, tencentTransMap } from "../constants/constant.js"; import md5 from "md5"; import fetch from "node-fetch"; -import HttpProxyAgent from "https-proxy-agent"; import _ from 'lodash' // 定义翻译策略接口 @@ -16,126 +15,87 @@ class TencentTranslateStrategy extends TranslateStrategy { constructor(config) { super(); this.config = config; + this.url = "https://transmart.qq.com/api/imt"; + this.commonHeaders = { + "USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0" + }; + this.clientKey = "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800"; + } + + async detectLanguage(query) { + try { + const response = await fetch(this.url, { + method: "POST", + headers: this.commonHeaders, + body: JSON.stringify({ + "header": { + "fn": "text_analysis", + "client_key": this.clientKey + }, + "text": query, + "type": "plain", + "normalize": { + "merge_broken_line": false + } + }) + }); + const data = await response.json(); + return data.header.ret_code === 'succ' ? data.language : "en"; + } catch (error) { + logger.error("Error detecting language:", error); + return "en"; + } } async translate(query, targetLanguage) { - // 腾讯翻译的具体实现 - const url = `https://transmart.qq.com/api/imt` - const sourceLanguage = await fetch(url, { - method: "POST", - headers: { - "USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0" - }, - body: JSON.stringify({ - "header": { - "fn": "text_analysis", - "client_key": "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800" - }, - "text": query, - "type": "plain", - "normalize": { - "merge_broken_line": false - } - }) - }).then(async resp => { - const data = JSON.parse(await resp.text()); - if (data.header.ret_code !== 'succ') { - return "en" - } - return data.language; - }) - return fetch(url, { - method: "POST", - headers: { - "USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0" - }, - body: JSON.stringify({ - "header": { - "fn": "auto_translation", - "client_key": "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800" - }, - "type": "plain", - "model_category": "normal", - "text_domain": "general", - "source": { - "lang": sourceLanguage, - "text_list": [ - "", - query, - "" - ] - }, - "target": { - "lang": tencentTransMap[targetLanguage] - } - }) - }).then(async resp => { - const data = JSON.parse(await resp.text()); - if (data.header.ret_code !== 'succ') { - return "翻译失败" - } - return data.auto_translation?.[1]; - }) + try { + const sourceLanguage = await this.detectLanguage(query); + const response = await fetch(this.url, { + method: "POST", + headers: this.commonHeaders, + body: JSON.stringify({ + "header": { + "fn": "auto_translation", + "client_key": this.clientKey + }, + "type": "plain", + "model_category": "normal", + "text_domain": "general", + "source": { + "lang": sourceLanguage, + "text_list": ["", query, ""] + }, + "target": { + "lang": tencentTransMap[targetLanguage] + } + }) + }); + const data = await response.json(); + return data.header.ret_code === 'succ' ? data.auto_translation?.[1] : "翻译失败"; + } catch (error) { + logger.error("Error translating text:", error); + return "翻译失败"; + } } } // 百度翻译策略 class BaiduTranslateStrategy extends TranslateStrategy { - - config = { - /** - * 百度翻译appid - */ - translateAppId: "", - /** - * 百度翻译密匙 - */ - translateSecret: "", - /** - * 魔法 - */ - proxy: "" - } - constructor(config) { super(); this.config = config; } async translate(query, targetLanguage) { - // 百度翻译的具体实现 - const url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${ - transMap[targetLanguage] - }&appid=${this.config.translateAppId}&salt=rconsole&sign=${md5( - this.config.translateAppId + query + "rconsole" + this.config.translateSecret, - )}&q=${query}`; - return fetch(url) - .then(resp => resp.json()) - .then(text => text.trans_result) - .then(res => res[0].dst) - .catch(err => logger.error(err)); - } -} - -class GoogleTranslateStrategy extends TranslateStrategy { - constructor(config) { - super(); - this.config = config; - } - - async translate(query, targetLanguage) { - // 谷歌翻译的具体实现 - const url = `https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=auto&tl=${googleTransMap[targetLanguage]}&q=${query}`; - return fetch(url, { - method: "GET", - headers: { - "USER-AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36", - }, - agent: new HttpProxyAgent(this.config.proxy || "http://127.0.0.1:7890"), - }) - .then(resp => resp.text()) - .then(res => JSON.parse(res)) - .then(res => res[0][0][0]) + const url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${ transMap[targetLanguage] }&appid=${ this.config.translateAppId }&salt=rconsole&sign=${ md5(this.config.translateAppId + query + "rconsole" + this.config.translateSecret) }&q=${ query }`; + try { + const response = await fetch(url); + const data = await response.json(); + return data.trans_result[0].dst; + } catch (error) { + logger.error("Error translating text:", error); + return "翻译失败"; + } } } @@ -143,17 +103,23 @@ class GoogleTranslateStrategy extends TranslateStrategy { export default class Translate { constructor(config) { this.config = config; - this.strategy = null; + this.strategy = this.selectStrategy(); + } + selectStrategy() { if (!_.isEmpty(this.config.translateAppId) && !_.isEmpty(this.config.translateSecret)) { - this.strategy = new BaiduTranslateStrategy(this.config); + logger.info("[R插件][翻译策略]:当前选择 百度翻译") + return new BaiduTranslateStrategy(this.config); } else { - // 根据配置选择其他策略,例如 Tencent 或 Google - this.strategy = new TencentTranslateStrategy(this.config); + logger.info("[R插件][翻译策略]:当前选择 企鹅翻译") + return new TencentTranslateStrategy(this.config); } } async translate(query, targetLanguage) { + if (!this.strategy) { + throw new Error("无翻译策略可用"); + } return this.strategy.translate(query, targetLanguage); } -} \ No newline at end of file +}