From ba7f42f205fdb39b1913db10fee0ff55b52fa68d Mon Sep 17 00:00:00 2001 From: zhiyu1998 Date: Tue, 21 Mar 2023 14:23:35 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E7=BF=BB=E8=AF=91=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=96=B0=E5=A2=9EG=E7=BF=BB=E8=AF=91=20&=20?= =?UTF-8?q?=F0=9F=90=A7=E7=BF=BB=E8=AF=91=EF=BC=88=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/tools.js | 39 ++++++------ utils/transStrategy.js | 132 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 18 deletions(-) create mode 100644 utils/transStrategy.js diff --git a/apps/tools.js b/apps/tools.js index 1bc0cb1..82a885b 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -3,7 +3,6 @@ import fetch from "node-fetch"; import fs from "node:fs"; import { segment } from "oicq"; // 其他库 -import md5 from "md5"; import axios from "axios"; import _ from "lodash"; import tunnel from "tunnel"; @@ -15,6 +14,7 @@ import { parseUrl, parseM3u8, downloadM3u8Videos, mergeAcFileToMp4 } from "../ut import { transMap, douyinTypeMap, TEN_THOUSAND, XHS_CK } from "../utils/constant.js"; import { getIdVideo, generateRandomStr } from "../utils/common.js"; import config from "../model/index.js"; +import Translate from "../utils/transStrategy.js"; export class tools extends plugin { constructor() { @@ -81,10 +81,6 @@ export class tools extends plugin { this.proxyAddr = this.toolsConfig.proxyAddr; this.proxyPort = this.toolsConfig.proxyPort; this.myProxy = `http://${this.proxyAddr}:${this.proxyPort}`; - // console.log(this.myProxy) - // 加载百度翻译配置 - this.translateAppId = this.toolsConfig.translateAppId; - this.translateSecret = this.toolsConfig.translateSecret; // 加载twitter配置 this.bearerToken = this.toolsConfig.bearerToken; } @@ -101,19 +97,26 @@ export class tools extends plugin { return; } const place = msg.replace(language[0], "").trim(); - // let url = /[\u4E00-\u9FFF]+/g.test(place) - // let url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${ transMap[language[1]] }&appid=APP ID&salt=自定义&sign=${ md5("APP ID" + place + "自定义" + "密钥") }&q=${ place }`; - let url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${ - transMap[language[1]] - }&appid=${this.translateAppId}&salt=rconsole&sign=${md5( - this.translateAppId + place + "rconsole" + this.translateSecret, - )}&q=${place}`; - // console.log(url) - await fetch(url) - .then(resp => resp.json()) - .then(text => text.trans_result) - .then(res => this.reply(`${res[0].dst}`, true)) - .catch(err => logger.error(err)); + const translateEngine = new Translate({ + translateAppId: this.toolsConfig.translateAppId, + translateSecret: this.toolsConfig.translateSecret, + proxy: this.myProxy + }); + // 如果没有百度那就Google + let translateResult; + if (_.isEmpty(this.toolsConfig.translateAppId) || _.isEmpty(this.toolsConfig.translateSecret)) { + try { + translateResult = await translateEngine.google(place, language[1]); + } catch (err) { + console.err("谷歌翻译失败,", err); + } + // 腾讯交互式进行补充 + translateResult += "\n\n🐧翻译:" + await translateEngine.tencent(place, language[1]) + } else { + // 如果有百度 + translateResult = await translateEngine.baidu(place, language[1]); + } + e.reply(translateResult, true); return true; } diff --git a/utils/transStrategy.js b/utils/transStrategy.js new file mode 100644 index 0000000..c3cb26f --- /dev/null +++ b/utils/transStrategy.js @@ -0,0 +1,132 @@ +import {transMap} from "./constant.js"; +import md5 from "md5"; +import fetch from "node-fetch"; +import HttpProxyAgent from "https-proxy-agent"; + +/** + * 翻译插件策略模式 + */ +export default class Translate { + config = { + /** + * 百度翻译appid + */ + translateAppId: "", + /** + * 百度翻译密匙 + */ + translateSecret: "", + /** + * 魔法 + */ + proxy: "" + } + constructor(config) { + this.config = config; + } + + /** + * 百度翻译 + * @param query 查询句子 + * @param targetLanguage 目标语言 + * @returns {Promise} + */ + async baidu(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)); + } + + /** + * google翻译 + * @param query + * @param targetLanguage + * @returns {Promise} + */ + async google(query, targetLanguage) { + const url = `https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=auto&tl=${transMap[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]) + } + + + /** + * 腾选交互式翻译 + * @param query + * @param targetLanguage + * @returns {Promise} + */ + async tencent(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": "s", + "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": transMap[targetLanguage] + } + }) + }).then(async resp => { + const data = JSON.parse(await resp.text()); + if (data.header.ret_code !== 'succ') { + return "翻译失败" + } + return data.auto_translation?.[1]; + }) + } +} \ No newline at end of file