摘要:,,本文介绍了关于某翻译平台翻译接口逆向工程的学习内容,并涉及到webpack的相关知识。通过学习翻译接口的逆向技术,可以深入了解接口的工作原理和实现方式。webpack作为一种前端资源构建和打包工具,能够帮助优化开发流程和提升项目效率。本文旨在分享如何结合两者进行学习,以更好地理解和应用相关技术。
逆向网址
aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLw==
逆向链接
aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLyMv
逆向接口
aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRl
逆向过程
请求方式
POST
逆向参数
sign c168e4cb76169e90f82d28118dbd24d2
接口请求结果解密
过程分析
根据XHR断点方式可快速进入发包内容

跟栈到如下位置处

设置条件断后释放掉xhr断点
e.url.indexOf( '/webtranslate' ) != -1
断点处开始跟栈,发现如下关键点
C = (e,t)=>(0,
a.H)("https://dict.xxxx.com/webtranslate", (0,
o.A)((0,
o.A)({}, e), k(t)), {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
})

【e】 【k(t)】构成请求体
function k(e, t) {
const n = (new Date).getTime();
return {
sign: S(n, e),
client: u,
product: d,
appVersion: p,
vendor: g,
pointParam: m,
mysticTime: n,
keyfrom: f,
mid: h,
screen: A,
model: v,
network: b,
abtest: T,
yduuid: t || "abcdefg"
}
}
//关键位置点
S(n, e),
function S(e, t) {
return _(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)
}
function _(e) {
return r.createHash("md5").update(e.toString()).digest("hex")
}
由方法【_】分析出来 参数【sign】为md5方式加密
验证加密
方法 _ 打上断点进行调试

由此可知为标准md5方式加密
解密定位
跟栈可追踪到如下位置
var s = (n(97815),
, r = n(91565)
N = (e,t,n)=>{
if (!e)
return null;
const o = s.alloc(16, y(t))
, a = s.alloc(16, y(n))
, i = r.createDecipheriv("aes-128-cbc", o, a);
let c = i.update(e, "base64", "utf-8");
return c += i.final("utf-8"),
c
}
function y(e) {
return r.createHash("md5").update(e).digest()
}
由此可知为【AES】
// key
const o = s.alloc(16, y(t))
// iv
const a = s.alloc(16, y(n))
代码扣取
向上查找 r 定义位置
var o = n(58788)
, a = n(95457)
, r = n(91565)
, i = n(91250)
, s = (n(97815),
n(25507),
n(48287)["Buffer"]);
可看出该方式为 webpack
加载器定位
定位加载器关键词
e[o].call(r.exports, r, r.exports, n),
上述位置断点断住后,刷新页面或点击底部输出结果可直接跳转至函数定义处

(function() {
var e = {
48559: function(e, t, n) {
n(44114),
n(27495),
n(25440),
n(13611);
(function(e, t, n, o, a) {
if (!e.__rl_event) {
var r = navigator.userAgent.toLowerCase()
, i = /(mobile|iphone|ipod|blackberry)/.test(r)
, s = !1
, c = "@VERSION@"
, l = ""
, u = 0
, d = ""
, m = ""
, p = 0
, g = "NULL"
, f = "NULL"
, h = "NULL"
, A = ""
, v = ""
, b = $()
, T = ($(!0),
N() + "//rlogs.youdao.com")
, y = L()
, _ = {
_default: y
}
, S = {}
, k = e._rlog
, I = e._rlog = {};
I.push = function(e) {
var t = e[0].split(".")
, n = t.pop();
t = t.join("_"),
t || (t = "_default"),
y = _[t] || (_[t] = L());
var o = S[n];
o && o.apply(this, e.slice(1))
}
,
S._setAccount = function(e) {
e && (y.pid = e)
}
,
S._setAutoPageview = function(e) {
y.autopv = e
}
,
S._setAutoUserId = function(e) {
y.autouid = e
}
,
S._addPost = function(e, t) {
S._removePost(e),
y.post.push([e, t])
}
,
S._onPageViewFinished = function(e) {
y.pvcb.push(e)
}
,
S._trackCustom = function(e, t, n) {
var a;
y.pid && (y.cat = e,
a = O(t) ? K(t) : "_nhrf=" + o(t),
C(a, n))
}
,
S._trackEvent = function(e, t) {
S._trackCustom("event", e, t)
}
,
S._trackPageview = function(e) {
if (!y.ispvt || "ido" === e) {
var t = y;
E((function() {
var e;
while (e = t.pvcb.shift())
try {
e()
} catch (n) {}
t.ispvt = 2
}
), O(e) && e.length ? "&" + K(e) : "")
}
}
,
S._removePost = function(e) {
if (e) {
for (var t = y.post, n = 0, o = t.length; n c.cancel && c.cancel(...e))
}, (0,
o.v_)(n.config.cancelButtonText || "取消"), 1), (0,
o.Lk)("div", {
class: "confirm btn",
onClick: t[1] || (t[1] = (...e)=>c.confirm && c.confirm(...e))
}, (0,
o.v_)(n.config.confirmButtonText || "确认"), 1)])])], 512)), [[o.aG, c.visible && n.config.text]])
}
var l = {
name: "PopUp",
props: {
config: {
type: Object
}
},
setup(e) {
const t = (0,
o.KR)(!1);
(0,
o.sV)((()=>{
t.value = !0
}
));
const n = ()=>{
e.config.cancel(),
t.value = !1
}
, a = ()=>{
e.config.confirm(),
t.value = !1
}
;
return {
visible: t,
cancel: n,
confirm: a
}
}
}
, u = n(66262);
const d = (0,
u.A)(l, [["render", c], ["__scopeId", "data-v-40db1403"]]);
var m = d;
const p = document.createElement("div");
p.setAttribute("class", "popup"),
document.body.appendChild(p);
var g = e=>{
const t = (0,
o.bF)(m, {
config: e
});
(0,
o.XX)(t, p)
}
},
3745: function(e, t, n) {
"use strict";
n.d(t, {
A: function() {
return d
}
});
var o = n(6301);
function a(e, t, n, a, r, i) {
return (0,
o.uX)(),
(0,
o.Wv)(o.eB, {
name: "fade"
}, {
default: (0,
o.k6)((()=>[(0,
o.bo)((0,
o.Lk)("div", {
class: "toasts"
}, (0,
o.v_)(n.text), 513), [[o.aG, a.visible]])])),
_: 1
})
}
var r = {
name: "toast",
props: {
text: {
type: String,
default: ""
}
},
setup() {
const e = (0,
o.KR)(!1);
return (0,
o.sV)((()=>{
e.value = !0
}
)),
{
visible: e
}
}
}
, i = n(66262);
const s = (0,
i.A)(r, [["render", a], ["__scopeId", "data-v-ebee6bee"]]);
var c = s;
const l = document.createElement("div");
l.setAttribute("class", "toast"),
document.body.appendChild(l);
let u = null;
var d = (e,t=1500)=>{
const n = (0,
o.bF)(c, {
text: e
});
(0,
o.XX)(n, l),
clearTimeout(u),
u = setTimeout((()=>{
(0,
o.XX)(null, l)
}
), t)
}
},
97504: function(e, t) {
"use strict";
t.A = [{
str: "0",
msg: "通用场景"
}, {
str: "2",
msg: "医学"
}, {
str: "1",
msg: "计算机"
}, {
str: "3",
msg: "金融经济"
}]
},
27950: function(e, t) {
"use strict";
t.A = {
product: "webfanyi",
signSecretKey: "LqMQV3ZdE2X6DYYyc6TNsVbHgCGk7XzG",
keyId: "ai-translate-llm",
keyIdPre: "ai-translate-llm-pre",
keyfrom: "fanyi.web",
needSignUrl: ["/translate_llm/userinfo"],
errorMap: {
500: "服务器错误",
602: "输出错误",
607: "服务异常",
603: "对不起,正在学习中"
}
}
},
42699: function(e, t, n) {
"use strict";
n.d(t, {
K: function() {
return o
}
});
const o = {
beforeMount(e, t, n) {
function o(n) {
if (e.contains(n.target))
return !1;
t.value && t.value(n)
}
e.__vueClickOutside__ = o,
document.addEventListener("mousedown", o)
},
unmounted(e, t) {
document.removeEventListener("mousedown", e.__vueClickOutside__),
delete e.__vueClickOutside__
}
}
},
34792: function(e, t, n) {
"use strict";
n.d(t, {
A: function() {
return i
}
});
n(33110);
var o = n(75220)
, a = n(66278)
, r = n(37282);
function i() {
const e = (0,
o.lq)()
, t = (0,
a.Pj)()
, n = ()=>{
r.A.$emit("saveTextTranslateContentToLS")
}
, i = ()=>{
"/AITranslate" === e.path && localStorage.setItem("afterProcessHistory", JSON.stringify(t.state.text.historyList))
}
;
return {
saveTextTranslateContentToLS: n,
saveAITranslateHistoryList: i
}
}
},
1360: function(e, t, n) {
"use strict";
n(23792),
n(3362),
n(9391),
n(39653);
var o = n(86964)
, a = n.n(o)
, r = n(81659)
, i = n.n(r)
, s = n(6301)
, c = n(54727)
, l = (n(12153),
n(3745))
, u = n(48066);
function d(e, t, n, o, a, r) {
return (0,
s.uX)(),
(0,
s.Wv)(s.eB, {
name: "blankTooltip"
}, {
default: (0,
s.k6)((()=>[(0,
s.eW)((0,
s.v_)(o.text), 1)])),
_: 1
})
}
var m = {
setup() {
const e = (0,
s.KR)();
return {
text: e
}
}
}
, p = n(66262);
const g = (0,
p.A)(m, [["render", d], ["__scopeId", "data-v-13c25996"]]);
var f = g;
const h = {
beforeMount: function(e, t) {
var n, o = "yd-tooltip", a = "", r = null, i = "bottom", c = "blank", l = !1;
const u = ()=>{
if (t.value && "function" === typeof t.value) {
var u = t.value();
const {component: e, data: o} = u;
n = (0,
s.Ef)(e, o),
l = !0,
c = "custom"
} else
!t.value || "string" !== typeof t.value && "number" !== typeof t.value ? e.dataset.tooltip && (a = e.dataset.tooltip) : a = t.value;
if (e.dataset["tooltipStyle"] && (c = e.dataset["tooltipStyle"]),
(l || "" != a.trim()) && (!l || n)) {
Object.keys(t.modifiers)[0] && (i = Object.keys(t.modifiers)[0]),
r = document.createElement("div");
var d = [o, c];
if (r.setAttribute("class", d.join(" ")),
r.style.zIndex = 100,
l) {
var m = document.body.appendChild(r);
n.mount(m)
} else {
m = document.body.appendChild(r);
var p = (0,
s.Ef)(f)
, g = p.mount(m);
g.text = a
}
var h = e.getBoundingClientRect();
(0,
s.dY)((()=>{
var e = 0
, t = 0
, n = 8
, o = 8;
switch (i) {
case "top":
e = h.left - r.offsetWidth / 2 + h.width / 2,
t = h.top - r.offsetHeight - n;
break;
case "left":
e = h.left - r.offsetWidth - o,
t = h.top + h.height / 2 - r.offsetHeight / 2;
break;
case "right":
e = h.left + h.width + o,
t = h.top + h.height / 2 - r.offsetHeight / 2;
break;
case "bottom":
e = h.left - r.offsetWidth / 2 + h.width / 2,
t = h.top + h.height + n;
break;
case "left-bottom":
e = h.left - r.offsetWidth - o,
t = h.bottom - r.offsetHeight;
break;
case "left-top":
e = h.left - r.offsetWidth - o,
t = h.top;
break;
case "right-top":
e = h.left + h.width + o,
t = h.top;
break;
case "right-bottom":
e = h.left + h.width + o,
t = h.bottom - r.offsetHeight;
break;
case "top-left":
e = h.left,
t = h.top - r.offsetHeight - n;
break;
case "top-right":
e = h.left + h.width - r.offsetWidth,
t = h.top - r.offsetHeight - n;
break;
case "bottom-left":
e = h.left,
t = h.bottom + n;
break;
case "bottom-right":
e = h.left + h.width - r.offsetWidth,
t = h.bottom + n;
break
}
var a = 20;
e document.body.offsetWidth && (e = document.body.offsetWidth - r.offsetWidth - a),
t document.body.offsetHeight && (t = document.body.offsetHeight - r.offsetHeight - a),
r.style.left = e + "px",
r.style.top = t + "px",
r.style.visibility = "visible"
}
))
}
}
, d = ()=>{
r && r.parentNode.removeChild(r),
n = null,
a = "",
l = !1,
r = null
}
;
e.addEventListener("mouseenter", u),
e.addEventListener("mouseleave", d)
},
updated(e, {value: t}) {
e.$value = t
},
unmounted(e) {
e.removeEventListener("mouseenter", e.mouseenterHandler),
e.removeEventListener("mouseleave", e.mouseleaveHandler)
}
};
var A = h;
const v = {
tooltip: A
};
var b = {
install(e) {
Object.keys(v).forEach((t=>{
e.directive(t, v[t])
}
))
}
}
, T = b
, y = n(71260)
, _ = n(68367)
, S = n(20618)
, k = n(42699);
const I = {
class: "sticky-sidebar"
};
function w(e, t, n, o, a, r) {
const i = (0,
s.g2)("router-view");
return (0,
s.uX)(),
(0,
s.CE)(s.FK, null, [o.show ? ((0,
s.uX)(),
(0,
s.Wv)(i, {
key: 0,
class: (0,
s.C4)(["os_" + o.currentOS])
}, null, 8, ["class"])) : (0,
s.Q3)("", !0), (0,
s.Lk)("div", I, [(0,
s.bF)(o["BackToTop"])])], 64)
}
n(27495),
n(62953);
function E(e, t, n, o, a, r) {
return (0,
s.uX)(),
(0,
s.CE)("div", {
class: "backToTopButton",
style: (0,
s.Tr)({
display: o.showButton ? "block" : "none"
}),
onClick: o.scrollToTop
}, null, 4)
}
var C = {
__name: "BackToTop",
setup(e, {expose: t}) {
t();
const n = (0,
s.KR)(!1)
, o = window.innerHeight || document.body.clientHeight
, a = ()=>{
const e = document.documentElement.scrollTop || document.body.scrollTop;
n.value = e >= o
}
;
window.addEventListener("scroll", a),
(0,
s.xo)((()=>{
window.removeEventListener("scroll", a)
}
));
const r = ()=>{
document.documentElement.scrollTo({
top: 0,
behavior: "smooth"
})
}
, i = {
showButton: n,
winHeight: o,
srollListener: a,
scrollToTop: r
};
return Object.defineProperty(i, "__isScriptSetup", {
enumerable: !1,
value: !0
}),
i
}
};
const D = (0,
p.A)(C, [["render", E], ["__scopeId", "data-v-e6a8c40e"]]);
var P = D
, x = n(53007)
, L = n(18908)
, O = n(96091)
, R = n(66278)
, N = n(83503)
, U = n.n(N)
, H = n(37282)
, M = {
__name: "App",
setup(e, {expose: t}) {
t();
const n = (0,
R.Pj)()
, o = (0,
s.KR)(!1);
(0,
s.sV)((async()=>{
H.A.$on("changeStickySidebarPosition", (()=>{
console.log("11")
}
)),
await (0,
O.A)(),
await n.dispatch("fetchAITranslateSecretKey"),
o.value = !0,
H.A.$on("buyVipSuccessFromVipCenter", (()=>{
f()
}
))
}
));
const a = (0,
s.nI)()
, r = a.appContext.config.globalProperties
, i = (0,
s.KR)("")
, c = (0,
s.KR)("")
, l = (0,
s.KR)("")
, u = (0,
s.KR)("https://ydlunacommon-cdn.nosdn.127.net/e5d302ac10bb57dbb7bace5281d5eb6a.png")
, d = (0,
s.KR)("")
, m = e=>{
const t = {
userid: e
};
x.A.getBatchUrl(t).then((e=>{
c.value = e.values.nickname,
n.dispatch("login/setNickName", c.value)
}
))
}
, p = ()=>{
x.A.getVipStatus().then((e=>{
n.dispatch("login/setSvip", e.svip),
n.dispatch("login/setVip", e.vip)
}
))
}
, g = ()=>{
const e = "education-certification"
, t = "cf41bbc6c60a46ff"
, o = +new Date
, a = "keyid,mysticTime,product"
, r = "webfanyi"
, i = U()(`keyid=${e}&mysticTime=${o}&product=${r}&key=${t}`).toString();
x.A.getStudentStatus({
keyid: e,
mysticTime: o,
pointParam: a,
product: r,
sign: i
}).then((e=>{
0 === e.code && n.dispatch("login/setIsStudent", !(!e.data.educationType || e.data.isGraduate))
}
))
}
, f = async()=>{
x.A.getAccountInfos().then((e=>{
const t = e.data;
0 === e.code ? (n.dispatch("login/setLogin", !0),
i.value = t.yduserid,
l.value = u.value,
n.dispatch("login/setOptionAvatar", l.value),
m(i.value),
p(),
g()) : n.dispatch("login/setLogin", !1)
}
))
}
;
f();
const h = ()=>{
const e = navigator.userAgent.toLowerCase()
, t = /macintosh|mac os x/i.test(e);
d.value = t ? "Mac" : "Windows"
}
;
h(),
(0,
s.sV)((()=>{
H.A.$on("buyVipSuccessFromVipCenter", p)
}
)),
(0,
s.hi)((()=>{
H.A.$off("buyVipSuccessFromVipCenter", p)
}
));
const A = {
store: n,
show: o,
internalInstance: a,
internalData: r,
yduserid: i,
nickname: c,
optionAvatar: l,
avatar: u,
currentOS: d,
getBatchData: m,
getVipInfo: p,
getStudentInfo: g,
getAccountInfo: f,
getOS: h,
BackToTop: P,
get service() {
return x.A
},
get serviceAI() {
return L.A
},
get getVisitorId() {
return O.A
},
get useStore() {
return R.Pj
},
get md5() {
return U()
},
ref: s.KR,
getCurrentInstance: s.nI,
onMounted: s.sV,
onUnmounted: s.hi,
get eventBus() {
return H.A
}
};
return Object.defineProperty(A, "__isScriptSetup", {
enumerable: !1,
value: !0
}),
A
}
};
const B = (0,
p.A)(M, [["render", w]]);
var K = B
, V = n(75220);
const j = {
class: "index"
};
function $(e, t, n, o, a, r) {
const i = (0,
s.g2)("dictWebsiteFooter")
, c = (0,
s.g2)("TranslationWebsiteFrame");
return (0,
s.uX)(),
(0,
s.CE)("div", j, [(0,
s.bF)(c, {
testMode: o.testMode,
canRouterJump: !0,
currentRouteName: "AITranslate" === e.$route.name ? "TextTranslate" : e.$route.name,
collapsed: "/AITranslate" === e.$route.path,
sidebarTransition: o.canTransition,
contentBgClassName: "/AITranslate" == e.$route.path ? "ai-bg" : "",
topNavFixedDis: "/AITranslate" == e.$route.path ? o.topNavFixedDisVal : 0,
onSaveTextTranslateContentToLS: o.saveTextTranslateContentToLS,
onSaveAITranslateHistoryList: o.saveAITranslateHistoryList,
onCollapseChange: o.collapseChange,
isFullContent: "/AITranslate" == e.$route.path,
needBaiduCallback: !0
}, {
footer: (0,
s.k6)((()=>["/AITranslate" !== e.$route.path ? ((0,
s.uX)(),
(0,
s.Wv)(i, {
key: 0
})) : (0,
s.Q3)("", !0)])),
default: (0,
s.k6)((()=>[(0,
s.bF)(o["TranslateTab"], {
class: (0,
s.C4)({
"ctrl-icon-nav": "/AITranslate" == e.$route.path
})
}, null, 8, ["class"]), "/AITranslate" !== e.$route.path ? ((0,
s.uX)(),
(0,
s.Wv)(o["Banner"], {
key: 0
})) : (0,
s.Q3)("", !0), "/" !== e.$route.path || o.isPrerender ? (0,
s.Q3)("", !0) : ((0,
s.uX)(),
(0,
s.Wv)(o["AdPopUp"], {
key: 1
}))])),
_: 1
}, 8, ["testMode", "currentRouteName", "collapsed", "sidebarTransition", "contentBgClassName", "topNavFixedDis", "onSaveTextTranslateContentToLS", "onSaveAITranslateHistoryList", "isFullContent"])])
}
var F = n(19358)
, G = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASYSURBVHgB7Zs9a1RBFIbf9Qf40YrC2hrB2ChJ4wqCWikIWhpEaw3ab9Iraq1oLFUE7QIKro1BGxNQscuaiK0hf2A9L3PG3F2ydz73I3ofOJm9y+zuPe/MnDl3ZgJUVFRUVFT8t9QwBDqdTl2KhthRLfcWzNJWWxZbEWvVarU2diri9F6xpthqJ55VsXsq4EDI3gPkZhtSNGFa2rIptij2VWxNy001ywGxg2JHxKbFJvQ9y4LYfO5ekU0AbaV7Yhf0LTr3DMbxJcQxJXZZ7FLhvQVkFCKLAOL8DSnmYMY0HX+otok8sGdQhFt63YYRYQGJJAvAMSrFTb1kS1OMnxgMFIIi2B5xX0SYRQLRAjDISfFObBKmpe/CtPowuCZ2W2w3zKxxSoTYQARRAvQ4vy52FSawDRP2hpcwgTJahFgBPmPL+YsYXJd30SWCCHAMgexCIDrmx8F59NzDpN5bEEE9QH5gRoonMGP+NEbrfBHmDOwJjAmz0hPu+37QuwfoPN/USwa8cXGeMP7c0dfNkMwxZAjQ+TpMcjOsaB/CI7EPMLmI91DwGgKq6KpeHsd4tX4RBsU3MEOBs0LL9QHfHhDa9T+JfUR3Lh/LwcL3uWBQtL2z6VHfLYC2/oxePoM/xSkqlpjvsCl4Q/OVUnx6gE1z6bxv17dTU4oIxc/a6c4H+xBGbroq+whwXsvn8Kc4P8eIsJ3zIXFnUcsrroqlQbAQ/HgTJxBOjCOpzlu+wwTDugTDH/0quXpAQ8vYPD+0J+RynthecKqskkuASS1jFzSIrwg5nSe20SbLKrkEOKrlF6ThEiG382RNy5NllVwC1LVcRzr9RBiE8+SblqVToSsIdvTlfuSj1+Ea8jtPGAAZCDckCO7rV2kUApDeYTCoR+tf/CMC9PUzeD3gX8MlgF1i2o189A6B1IwxiWELsF3Ay5E29/st0i6r5CvAEaTTL9qnps1lv0faZZVcArzv+bKUmymb6gYhwoSWK2WVXAIsa3kY8fjO87lFmNJyuaySS4CWlucQR2iSk1MEO2xbZZVKBdANSBqD4BTCiM3wcogwrZ9puzZRffKAp1qehT+p6W2qCHbv8LWronNRVJeVfsOstByH344v1/BypLe9QvqsSfAzdv3wUHIP0P22FswwuA5/cqS3Md9hW3/B5wyB77J4A2YzdNx2hHoJan3i9Syg6+uvYHqB97bTCLAHKLxan4Q8DPEgAocDI2zIUBgWvCd2/7bYvO+HvAVQRe0XU+kJjA/25AgJOj8U9Disu64PYIbCY4zg6W0b7EzBe3oQem6oOiCBOLjUvIwRPsdj60zA3yMyiCBKAM0NiiK8xXADI38r+XwQyXFMjnHhhl5yT26QhycoNvf+p/WaY965/1dGroOSM9g6QEEoQshmqgubhV7X12zt+ZCjMP3IfVR2Dt0bkhThBczJjRjY0mdgjsvaZTkmZLNjdVS2SB8hOFtwq2pJy3V0b7bQuT0wgY3dnAsw59C9FtmCafUWdgIUgvGhk35cfs7noEMsw/6HCeYO3G+sYytekI2CcR2SkX1n/8NERUVFRUXF+PMHJygcYfKZSDQAAAAASUVORK5CYII=";
const W = ["src"];
function X(e, t, n, o, a, r) {
return (0,
s.uX)(),
(0,
s.Wv)(o["Overlay"], {
visible: o.showAd,
modalClosable: !0
}, {
content: (0,
s.k6)((()=>[(0,
s.Lk)("img", {
class: "ad",
src: o.picture,
onClick: o.goAd
}, null, 8, W), (0,
s.Lk)("img", {
class: "close",
src: G,
onClick: o.closeAd
})])),
_: 1
}, 8, ["visible"])
}
n(44114);
var Q = n(52670)
, J = n(91588)
, Y = n(45358)
, q = {
__name: "AdPopUp",
setup(e, {expose: t}) {
t();
const n = (0,
s.KR)(!1)
, o = (0,
s.KR)("")
, a = (0,
s.KR)("")
, r = (0,
s.nI)()
, i = r.appContext.config.globalProperties
, c = ()=>{
n.value = !1
}
, l = ()=>{
window.open(o.value, "_self"),
window._rlog.push(["_trackCustom", "event", [["action", "pop-up_windows"]]])
}
;
(0,
s.sV)((()=>{
J.A.getPopUpInfos().then((e=>{
if (0 !== Object.keys(e.data.value).length) {
const t = e.data.value;
o.value = t.url,
a.value = t.picture,
Y.A.isDuringDate(t.startTime, t.endTime) && null === i.$cookies.get("adcookie") ? (n.value = !0,
window._rlog.push(["_trackCustom", "event", [["show", "pop-up_windows"]]]),
i.$cookies.set("adcookie", !0, 86400)) : n.value = !1
}
}
))
}
));
const u = {
showAd: n,
url: o,
picture: a,
internalInstance: r,
internalData: i,
closeAd: c,
goAd: l,
ref: s.KR,
onMounted: s.sV,
getCurrentInstance: s.nI,
Overlay: Q.A,
get service() {
return J.A
},
get util() {
return Y.A
}
};
return Object.defineProperty(u, "__isScriptSetup", {
enumerable: !1,
value: !0
}),
u
}
};
const z = (0,
p.A)(q, [["render", X], ["__scopeId", "data-v-05c25f5a"]]);
var Z = z
, ee = n(34792);
const te = e=>((0,
s.Qi)("data-v-456af1b4"),
e = e(),
(0,
s.jt)(),
e)
, ne = {
class: "TextTranslateSetting yd-form-container"
}
, oe = {
class: "checkbox"
}
, ae = te((()=>(0,
s.Lk)("span", {
class: "color_text_1 label-text"
}, "日语假名(仅译文)", -1)))
, re = {
class: "checkbox"
}
, ie = te((()=>(0,
s.Lk)("span", {
class: "color_text_1 label-text"
}, "日语罗马音(仅译文)", -1)))
, se = {
class: "checkbox"
}
, ce = te((()=>(0,
s.Lk)("span", {
class: "color_text_1 label-text"
}, "显示原文字数", -1)));
function le(e, t, n, o, a, r) {
return (0,
s.uX)(),
(0,
s.Wv)(o["InterfaceDialog"], {
dialogVisible: !0,
width: "auto",
height: "auto",
top: 28,
left: -140,
onCloseDialog: o.closeDialog
}, {
default: (0,
s.k6)((()=>[(0,
s.Lk)("div", ne, [(0,
s.bF)(o["StrokeSwitch"]), (0,
s.Lk)("label", oe, [(0,
s.bo)((0,
s.Lk)("input", {
class: "g-checkbox",
type: "checkbox",
"onUpdate:modelValue": t[0] || (t[0] = e=>o.showPjm = e)
}, null, 512), [[s.lH, o.showPjm]]), ae]), (0,
s.Lk)("label", re, [(0,
s.bo)((0,
s.Lk)("input", {
class: "g-checkbox",
type: "checkbox",
"onUpdate:modelValue": t[1] || (t[1] = e=>o.showRomanPronunciation = e)
}, null, 512), [[s.lH, o.showRomanPronunciation]]), ie]), (0,
s.Lk)("label", se, [(0,
s.bo)((0,
s.Lk)("input", {
class: "g-checkbox",
type: "checkbox",
"onUpdate:modelValue": t[2] || (t[2] = e=>o.showWordsNumber = e)
}, null, 512), [[s.lH, o.showWordsNumber]]), ce])])])),
_: 1
})
}
var ue = n(50953)
, de = n(20641)
, me = n(95124);
const pe = {
class: "stroke-switch yd-form-container"
}
, ge = {
class: "checkbox"
};
function fe(e, t, n, o, a, r) {
return (0,
s.uX)(),
(0,
s.CE)("div", pe, [(0,
s.Lk)("label", ge, [(0,
s.Lk)("span", {
class: "color_text_1 label-text",
onClick: t[0] || (t[0] = (...e)=>o.downloadChrome && o.downloadChrome(...e))
}, "下载划词插件")])])
}
var he = {
name: "StrokeSwitch",
setup(e, t) {
const n = ()=>{
window.open("https://chrome.google.com/webstore/detail/%E7%BD%91%E6%98%93%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91/eopjamdnofihpioajgfdikhhbobonhbb?hl=en&authuser=1")
}
;
return {
downloadChrome: n
}
}
};
const Ae = (0,
p.A)(he, [["render", fe], ["__scopeId", "data-v-8d65aa18"]]);
var ve = Ae
, be = {
__name: "TextTranslateSetting",
emits: ["closeDialog"],
setup(e, {expose: t, emit: n}) {
t();
const o = (0,
R.Pj)()
, a = n
, r = (0,
ue.KR)(!1)
, i = (0,
ue.KR)(!1)
, c = (0,
ue.KR)(!0);
(0,
s.KC)((()=>{
o.dispatch("initTextTranslateSettingStore"),
r.value = o.state.text.showPjm,
i.value = o.state.text.showRomanPronunciation,
c.value = o.state.text.showWordsNumber
}
)),
(0,
de.wB)(r, ((e,t)=>{
e !== t && o.commit("SET_SHOW_PJM", e)
}
)),
(0,
de.wB)(i, ((e,t)=>{
e !== t && o.commit("SET_SHOW_ROMAN_PRONUNCICATION", e)
}
)),
(0,
de.wB)(c, ((e,t)=>{
e !== t && o.commit("SET_SHOW_WORDS_NUMBER", e)
}
));
const l = ()=>{
a("closeDialog")
}
, u = {
store: o,
emit: a,
showPjm: r,
showRomanPronunciation: i,
showWordsNumber: c,
closeDialog: l,
get computed() {
return de.EW
},
get ref() {
return ue.KR
},
get watch() {
return de.wB
},
get useStore() {
return R.Pj
},
InterfaceDialog: me.A,
StrokeSwitch: ve
};
return Object.defineProperty(u, "__isScriptSetup", {
enumerable: !1,
value: !0
}),
u
}
};
const Te = (0,
p.A)(be, [["render", le], ["__scopeId", "data-v-456af1b4"]]);
var ye = Te
, _e = n.p + "img/AITranslateTabGuide.d2c8a07b.png";
const Se = e=>((0,
s.Qi)("data-v-a9443b36"),
e = e(),
(0,
s.jt)(),
e)
, ke = {
class: "tab-left"
}
, Ie = ["onClick", "onMouseenter"]
, we = {
key: 1,
class: "tab-title"
}
, Ee = {
class: "tab-right"
}
, Ce = Se((()=>(0,
s.Lk)("i", {
class: "icon ic_text_translate_setting"
}, null, -1)))
, De = Se((()=>(0,
s.Lk)("span", {
class: "text_translate_setting"
}, "设置", -1)))
, Pe = Se((()=>(0,
s.Lk)("i", {
class: "icon ic_leftbar_document_normal"
}, null, -1)))
, xe = Se((()=>(0,
s.Lk)("span", {
class: "color_text_1"
}, "文档翻译记录", -1)))
, Le = [Pe, xe];
function Oe(e, t, n, o, a, r) {
const i = ye
, c = (0,
s.gN)("tooltip");
return (0,
s.uX)(),
(0,
s.CE)("div", {
class: (0,
s.C4)(["tab-header", {
"tab-header-ai": "AITranslate" === r.routeName
}])
}, [(0,
s.Lk)("div", ke, ["TextTranslate" === r.routeName || "AITranslate" === r.routeName ? ((0,
s.uX)(),
(0,
s.CE)(s.FK, {
key: 0
}, [((0,
s.uX)(!0),
(0,
s.CE)(s.FK, null, (0,
s.pI)(a.tabList, ((e,n)=>((0,
s.uX)(),
(0,
s.CE)("div", {
class: (0,
s.C4)(["tab-item", [e.value === a.currentTab ? "active color_text_1" : "color_text_3", e.customStyle]]),
key: n,
onClick: t=>r.tabItemClickHandler(e),
onMouseenter: t=>r.tabItemMouseHoverHandler(e),
onMouseleave: t[1] || (t[1] = e=>r.guideMouseHoverHandler(0))
}, [(0,
s.Lk)("span", null, (0,
s.v_)(e.label), 1), a.isPrerender || "AITranslate" !== e.value || !a.showTabAiGuide && !a.isHoverShowAiGuide || "AITranslate" === r.routeName ? (0,
s.Q3)("", !0) : ((0,
s.uX)(),
(0,
s.CE)("img", {
key: 0,
class: "ai-guide",
src: _e,
onClick: t[0] || (t[0] = (0,
s.D$)(((...e)=>r.clickTabAIGuide && r.clickTabAIGuide(...e)), ["stop"]))
}))], 42, Ie)))), 128)), (0,
s.bo)(((0,
s.uX)(),
(0,
s.CE)("div", {
class: "tab-item color_text_3",
onClick: t[2] || (t[2] = e=>r.tabItemClickHandler(a.humanTranslateTab))
}, [(0,
s.Lk)("span", null, (0,
s.v_)(a.humanTranslateTab.label), 1)])), [[c, r.HumanTranslateHoverTip, void 0, {
"bottom-left": !0
}]])], 64)) : "DocumentUpload" === r.routeName ? ((0,
s.uX)(),
(0,
s.CE)("div", we, [(0,
s.Lk)("span", null, (0,
s.v_)(a.documentUploadTab.label), 1)])) : (0,
s.Q3)("", !0)]), (0,
s.Lk)("div", Ee, ["TextTranslate" === r.routeName ? ((0,
s.uX)(),
(0,
s.CE)("div", {
key: 0,
class: "tool-button",
onClick: t[3] || (t[3] = (...e)=>r.textTranslateSettingButtonClickHander && r.textTranslateSettingButtonClickHander(...e))
}, [Ce, De, (0,
s.bF)(i, {
dialogVisible: a.textTranslateSettingDialogVisible,
onCloseDialog: r.textTranslateSettingCloseCallbackHandler
}, null, 8, ["dialogVisible", "onCloseDialog"])])) : (0,
s.Q3)("", !0), "DocumentUpload" === r.routeName ? ((0,
s.uX)(),
(0,
s.CE)("div", {
key: 1,
class: "tool-button",
onClick: t[4] || (t[4] = (...e)=>r.docHistoryEntryClickHandler && r.docHistoryEntryClickHandler(...e))
}, Le)) : (0,
s.Q3)("", !0)])], 2)
}
var Re = n(62512);
const Ne = {
class: "hunman-translate-hover-tip"
}
, Ue = (0,
s.Fv)('母语润色服务全新上线
', 2) , He = [Ue]; function Me(e, t) { return (0, s.uX)(), (0, s.CE)("div", Ne, He) } const Be = {} , Ke = (0, p.A)(Be, [["render", Me], ["__scopeId", "data-v-1674d62e"]]); var Ve = Ke , je = { name: "TabHeader", data() { var e; return { tabList: [{ label: "翻译", value: "TextTranslate" }, { label: "AI 翻译", value: "AITranslate", params: { keyfrom: "fanyiweb_tab" }, customStyle: "gradient-item" }, { label: "文档翻译", value: "DocumentUpload" }], humanTranslateTab: { label: "人工翻译", url: "https://f.youdao.com/?vendor=fanyibanner", log: "human_translation" }, documentUploadTab: { label: "文档翻译", value: "DocumentUpload" }, currentTab: "", textTranslateSettingDialogVisible: !1, showTabAiGuide: !1, isHoverShowAiGuide: !1, isPrerender: (null === (e = window.__PRERENDER_INJECTED) || void 0 === e ? void 0 : e.isPrerender) || !1 } }, computed: { routeName() { return this.$route.name }, isLogin() { return this.$store.state.login.isLogin } }, components: { TextTranslateSetting: ye }, mounted() { this.checkShowTabAiGuide(), window.addEventListener("click", this.clickHandler) }, methods: { clickTabAIGuide() { this.$router.push({ name: "AITranslate", query: { keyfrom: "fanyiweb_tab_guide" } }) }, clickHandler(e) { const {target: t} = e; "pop-up-comp mask" !== t.className && "close" !== t.className && (this.showTabAiGuide = !1, window.removeEventListener("click", this.clickHandler)) }, checkShowTabAiGuide() { const e = this.getLocalStorage("isShowTabAiGuide"); if (void 0 === e) { const e = new Date , t = `${e.getMonth() + 1}-${e.getDate()}`; this.setLocalStorage("isShowTabAiGuide", t), this.showTabAiGuide = !0 } else { const t = new Date , n = `${t.getMonth() + 1}-${t.getDate()}`; e !== n ? (this.setLocalStorage("isShowTabAiGuide", n), this.showTabAiGuide = !0) : this.showTabAiGuide = !1 } }, getLocalStorage(e) { return Re.A.get(e) }, setLocalStorage(e, t) { Re.A.set(e, t) }, guideMouseHoverHandler(e) { this.isHoverShowAiGuide = Boolean(e) }, tabItemMouseHoverHandler(e) { "AITranslate" === e.value && (this.isHoverShowAiGuide = !0) }, HumanTranslateHoverTip() { return { component: Ve } }, tabItemClickHandler(e) { H.A.$emit("stopTransition"), e.value ? this.$router.push({ name: `${e.value}`, query: e && e.params || {} }) : (e.log && window._rlog.push(["_trackCustom", "event", [["action", e.log]]]), window.open(e.url, "_blank")) }, textTranslateSettingButtonClickHander() { this.textTranslateSettingDialogVisible = !0 }, textTranslateSettingCloseCallbackHandler() { this.textTranslateSettingDialogVisible = !1 }, docHistoryEntryClickHandler() { if (this.isLogin) { const e = this.$router.resolve({ path: "/person/docHistory" }); window.open(e.href, "_blank") } else { const e = `${window.location.origin}${window.location.pathname}#/person/docHistory`; window.location.href = `https://c.youdao.com/common-login-web/index.html?redirect_url=${encodeURIComponent(e)}&t=${(new Date).getTime()}` } } }, watch: { $route: { handler() { this.currentTab = decodeURIComponent(this.$route.name) }, immediate: !0 } } }; const $e = (0, p.A)(je, [["render", Oe], ["__scopeId", "data-v-a9443b36"]]); var Fe = $e; const Ge = { class: "tab-body color_bg_3" }; function We(e, t, n, o, a, r) { const i = Fe , c = (0, s.g2)("router-view"); return (0, s.uX)(), (0, s.CE)("div", { class: (0, s.C4)(["translate-tab-container", { "ai-content": "/AITranslate" === o.route.path, "ai-content ai-content-small-process": "/AITranslateSmallProcess" === o.route.path, changeHeight: "/AITranslate" === o.route.path && o.changeHeight }]), ref: "AIContent", onScroll: o.handleScroll }, [(0, s.bF)(i), (0, s.Lk)("div", null, [(0, s.Lk)("div", Ge, [(0, s.bF)(c, null, { default: (0, s.k6)((({Component: e})=>[((0, s.uX)(), (0, s.Wv)(s.PR, null, [((0, s.uX)(), (0, s.Wv)((0, s.$y)(e)))], 1024))])), _: 1 })])])], 34) } var Xe = n(34917) , Qe = { __name: "index", setup(e, {expose: t}) { t(); const n = (0, V.lq)() , o = (0, s.nI)() , a = o.appContext.config.globalProperties , r = (0, R.Pj)() , i = (0, s.KR)(null) , c = (0, s.KR)(0) , l = (0, s.KR)(0) , u = (0, s.KR)(!1) , d = e=>{ const t = e.target.scrollHeight - e.target.clientHeight , n = e.target.scrollTop 90 && t - n > 90 && (H.A.$emit("AITranslateResultScroll", 1), c.value = 1), n { r.dispatch("fetchLanguageData"), r.dispatch("fetchDomainData"); const e = { keyid: "minor-search-server" } , t = "8XdqRK6tvAQAtRB349Wdmkzxr2A5fqDJ"; Xe.A.getAigcEntrance(e, t).then((n=>{ r.commit("SET_ISALLOWAIGC", n.data.isAllow), !n.data.isAllow && r.state.login.isLogin || Xe.A.getAigcStyle(e, t).then((e=>{ r.commit("SET_AIGCDOMAINMAP", e.data.styleList), null !== a.$cookies.get("participation-aigc-invitation") && r.dispatch("updateDomainMap") } )) } )) } )), (0, s.sV)((()=>{ H.A.$on("AITranslateResultScroll", (e=>{ u.value = !!e } )) } )); const m = { route: n, internalInstance: o, internalData: a, store: r, AIContent: i, toggleTopBarStatus: c, lastScrollTop: l, changeHeight: u, handleScroll: d, getCurrentInstance: s.nI, onMounted: s.sV, get useRoute() { return V.lq }, get useStore() { return R.Pj }, get eventBus() { return H.A }, get service() { return Xe.A } }; return Object.defineProperty(m, "__isScriptSetup", { enumerable: !1, value: !0 }), m } }; const Je = (0, p.A)(Qe, [["render", We], ["__scopeId", "data-v-3b7ce05b"]]); var Ye = Je , qe = { __name: "Home", setup(e, {expose: t}) { var n; t(); const {saveTextTranslateContentToLS: o, saveAITranslateHistoryList: a} = (0, ee.A)() , r = (0, s.KR)(!0) , i = (null === (n = window.__PRERENDER_INJECTED) || void 0 === n ? void 0 : n.isPrerender) || !1 , c = (0, s.KR)(0) , l = ()=>{ const e = window.innerWidth; c.value = e { document.dispatchEvent(new Event("render-event")), l(), window.addEventListener("resize", l) } )), (0, s.hi)((()=>{ window.removeEventListener("resize", l) } )); const u = (0, s.EW)((()=>!1)) , d = e=>{ H.A.$emit("sidebarCollapseChange", e) } ; (0, s.sV)((()=>{ H.A.$on("stopTransition", (()=>{ r.value = !1, setTimeout((()=>{ r.value = !0 } ), 200) } )) } )); const m = { saveTextTranslateContentToLS: o, saveAITranslateHistoryList: a, canTransition: r, isPrerender: i, topNavFixedDisVal: c, getTopNavFixedDisVal: l, testMode: u, collapseChange: d, onMounted: s.sV, onUnmounted: s.hi, get useRoute() { return V.lq }, get eventBus() { return H.A }, Banner: F.A, AdPopUp: Z, get useTranslationWebsiteFrame() { return ee.A }, TranslateTab: Ye }; return Object.defineProperty(m, "__isScriptSetup", { enumerable: !1, value: !0 }), m } }; const ze = (0, p.A)(qe, [["render", $]]); var Ze = ze , et = n(25507); const tt = [{ path: "/", name: "Home", component: Ze, children: [{ path: "", name: "TextTranslate", component: ()=>Promise.all([n.e(667), n.e(762), n.e(665), n.e(348)]).then(n.bind(n, 40719)) }, { path: "documentUpload", name: "DocumentUpload", component: ()=>Promise.all([n.e(665), n.e(316), n.e(551)]).then(n.bind(n, 94099)) }, { path: "AITranslate", name: "AITranslate", component: ()=>Promise.all([n.e(667), n.e(762), n.e(873)]).then(n.bind(n, 57293)) }] }, { path: "/paraphraser", name: "Paraphraser", component: ()=>Promise.all([n.e(667), n.e(108)]).then(n.bind(n, 1258)) }, { path: "/person", name: "person", component: ()=>n.e(688).then(n.bind(n, 99961)), beforeEnter(e, t, n) { console.log(et.A.state.login.isLogin); const {isLogin: o} = et.A.state.login; o ? n() : n({ name: "Home" }) }, children: [{ path: "docHistory", name: "docHistory", component: ()=>Promise.all([n.e(189), n.e(637)]).then(n.bind(n, 12488)) }, { path: "termBank", name: "termBank", component: ()=>Promise.all([n.e(189), n.e(316), n.e(471)]).then(n.bind(n, 63093)) }] }, { path: "/login/:redirectUrl?", name: "NoLogin", component: ()=>n.e(333).then(n.bind(n, 65368)) }, { path: "/AITranslateSmallProcess", name: "/AITranslateSmallProcess", component: ()=>Promise.all([n.e(667), n.e(762), n.e(873)]).then(n.bind(n, 57293)) }] , nt = (0, V.aE)({ history: (0, V.Bt)(), routes: tt }); nt.beforeEach(((e,t,n)=>{ document.body.scrollTop = 0, document.documentElement.scrollTop = 0, n() } )); var ot = nt; n(48559); n(86964).polyfill(), a().polyfill(); const at = (0, s.Ef)(K); at.config.globalProperties.$cookies = i(), at.config.globalProperties.$toast = l.A, window.$CPopup = u.A, at.use(et.A).use(ot).use(i()).use(T).use(c.A).use(y.A).use(_.A).use(S.A).directive("clickoutside", k.K).mount("#app") }, 18908: function(e, t, n) { "use strict"; var o = n(58788) , a = n(25507) , r = n(97815) , i = n(27950) , s = n(14914) , c = n(95457); const l = "https://luna-ai.youdao.com" , {product: u, keyId: d, keyfrom: m, keyIdPre: p} = i.A , g = localStorage.getItem("yduuid") , f = async(e,t,n)=>{ const o = { signSecretKey: a.A.state.text.secretAIKey, keyId: d, product: u, keyfrom: m }; return e.yduuid = localStorage.getItem("yduuid"), (0, s.a)(`${l}/translate_llm/trans`, e, o, t, n) } , h = async(e,t,n)=>{ const o = { signSecretKey: a.A.state.text.secretAIKey, keyId: d, product: u, keyfrom: m }; return e.yduuid = localStorage.getItem("yduuid"), (0, s.a)(`${l}/translate_llm/afterProcess`, e, o, t, n) } , A = e=>(0, c.bE)(`${l}/translate_llm/like`, r.A.genParamV3FormData(e, a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))) , v = ()=>(0, c.Jt)(`${l}/translate_llm/functionList`, r.A.genParamV3({}, a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))) , b = (e,t)=>{ const n = "https://lunafeedback.youdao.com/feedback"; return (0, c.T3)(`${n}/add?${e}`, t) } , T = e=>(0, c.bE)(`${l}/translate_llm/modelfeedback`, r.A.genParamV3FormData((0, o.A)({ token: localStorage.getItem("ydtoken") }, e), a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))) , y = e=>(0, c.bE)(`${l}/translate_llm/modify`, r.A.genParamV3FormData((0, o.A)({ token: localStorage.getItem("ydtoken") }, e), a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))) , _ = e=>(0, c.bE)(`${l}/translate_llm/del`, r.A.genParamV3FormData((0, o.A)({ token: localStorage.getItem("ydtoken") }, e), a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))) , S = e=>(0, c.Jt)(`${l}/translate_llm/IntentionRec`, r.A.genParamV3((0, o.A)({ token: localStorage.getItem("ydtoken") }, e), a.A.state.text.secretAIKey, d, u, m, g)) , k = e=>(0, c.Jt)(`${l}/translate_llm/example`, r.A.genParamV3((0, o.A)({ token: localStorage.getItem("ydtoken") }, e), a.A.state.text.secretAIKey, d, u, m, g)) , I = ()=>(0, c.Jt)(`${l}/translate_llm/guideInfo`, r.A.genParamV3({ token: localStorage.getItem("ydtoken") }, a.A.state.text.secretAIKey, d, u, m, g)) , w = async(e,t,n)=>{ const o = { signSecretKey: a.A.state.text.secretAIKey, keyId: d, product: u, keyfrom: m }; return e.yduuid = localStorage.getItem("yduuid"), (0, s.a)(`${l}/translate_llm/v2/chat`, e, o, t, n) } , E = ()=>(0, c.Jt)(`${l}/translate_llm/v2/history/list`, r.A.genParamV3({ token: localStorage.getItem("ydtoken") }, a.A.state.text.secretAIKey, d, u, m, g)) , C = e=>(0, c.bE)(`${l}/translate_llm/v2/history/del`, r.A.genParamV3FormData({ token: localStorage.getItem("ydtoken"), id: e }, a.A.state.text.secretAIKey, d, u, m, g)) , D = ()=>(0, c.Jt)(`${l}/translate_llm/v2/init`, r.A.genParamV3({ token: localStorage.getItem("ydtoken") }, a.A.state.text.secretAIKey, d, u, m, g)) , P = e=>(0, c.Jt)(`${l}/translate_llm/v2/suggest`, r.A.genParamV3({ token: localStorage.getItem("ydtoken"), functionEnglishName: e }, a.A.state.text.secretAIKey, d, u, m, g)) , x = ()=>(0, c.Jt)(`${l}/translate_llm/userinfo`, r.A.genParamV3({ token: localStorage.getItem("ydtoken") }, a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))) , L = e=>(0, c.Jt)(`${l}/translate_llm/v2/history/details`, r.A.genParamV3({ token: localStorage.getItem("ydtoken"), id: e }, a.A.state.text.secretAIKey, d, u, m, localStorage.getItem("yduuid"))); t.A = { fetchSSEMethod: f, getUserRemainTime: x, translatellmlike: A, getMenu: v, fetchAfterProcessSSE: h, feedback: b, compareModel: T, modifyAfterProcess: y, delAfterProcess: _, getIntentionRec: S, getLargeModelGuideExample: k, getLargeModelGuideInfo: I, getChat: w, getDialogList: E, delDialog: C, getInit: D, getProcess: P, recoverDialogs: L } }, 91588: function(e, t, n) { "use strict"; var o = n(95457); const a = "https://api-overmind.youdao.com/openapi/get/luna/dict/dict-common-config/prod" , r = ()=>(0, o.Jt)(`${a}/translateMainPageBanner`) , i = ()=>(0, o.Jt)(`${a}/translateMainPagePopup`); t.A = { getBannerInfos: r, getPopUpInfos: i } }, 95457: function(e, t, n) { "use strict"; n.d(t, { H: function() { return u }, Jt: function() { return s }, T3: function() { return l }, bE: function() { return c } }); var o = n(58788) , a = n(91250) , r = (n(6301), n(3745)) , i = n(48066); function s(e, t, n={}) { return new Promise(((r,i)=>{ a.A.get(e, (0, o.A)({ params: t }, n)).then((e=>{ r(e.data) } )).catch((e=>{ i(e) } )) } )) } function c(e, t, n) { return new Promise((o=>{ n ? a.A.post(e, t, { timeout: n }).then((e=>{ o(e.data) } )).catch((e=>{ o(e) } )) : a.A.post(e, t).then((e=>{ o(e.data) } )).catch((e=>{ o(e) } )) } )) } function l(e, t, n) { const o = t , r = new FormData; return Object.keys(o).forEach((e=>{ r.append(e, o[e]) } )), new Promise(((t,o)=>{ const i = {}; n && (i.timeout = n), a.A.post(e, r, i).then((e=>{ t(e.data) } )).catch((e=>{ o(e) } )) } )) } function u(e, t, n) { return new Promise(((o,r)=>{ a.A.post(e, t, n).then((e=>{ o(e.data) } )).catch((e=>{ r(e) } )) } )) } a.A.defaults.withCredentials = !0, a.A.defaults.timeout = 6e4, a.A.interceptors.response.use((e=>{ const {headers: t} = e , n = Object.keys(e.headers).find((e=>"exceedmaxdevicecnt" === e.toLowerCase())); return t && "true" === t[n] && (0, i.A)({ confirmButtonText: "重新登录", text: "您同时登录的设备数过多,已被挤下线,登录新账号,可继续使用~", confirm: ()=>{ const e = encodeURIComponent(window.location.href); window.location.href = `https://c.youdao.com/common-login-web/index.html?redirect_url=${e}&t=${(new Date).getTime()}` } , cancel: ()=>{ const e = encodeURIComponent(window.location.href); window.location.href = `https://dict.youdao.com/login/acc/se/reset?product=DICT&samesite=true&ru=${e}` } }), e } ), (e=>(e.code && "ERR_CANCELED" === e.code || (0, r.A)("网络异常,请检查网络"), Promise.reject(e)))) }, 53007: function(e, t, n) { "use strict"; n(33110); var o = n(95457); const a = "https://dict.youdao.com" , r = "https://dict.youdao.com/vip" , i = "https://dict.youdao.com/login/acc" , s = ["option_avatar", "nickname"] , c = "https://backendmarket.youdao.com" , l = "https://education-certification.youdao.com/education/pub/get" , u = e=>(0, o.bE)(`${r}/user/status`, e) , d = ()=>(0, o.Jt)(`${a}/login/acc/query/accountinfo`) , m = e=>(0, o.Jt)(`${a}/profile/batch/get?content=${encodeURIComponent(JSON.stringify(s))}`, e) , p = e=>(0, o.bE)(`${c}/collect/docreport`, e) , g = ({keyid: e, mysticTime: t, product: n, pointParam: a, sign: r})=>(0, o.Jt)(`${l}?keyid=${e}&mysticTime=${t}&product=${n}&pointParam=${a}&sign=${r}`, {}) , f = e=>(0, o.Jt)(`${i}/device/check`, e); t.A = { getAccountInfos: d, getBatchUrl: m, getVipStatus: u, baiduCallback: p, getStudentStatus: g, checkLogin: f } }, 34917: function(e, t, n) { "use strict"; var o = n(58788) , a = n(95457) , r = n(91565) , i = n(91250) , s = (n(97815), n(25507), n(48287)["Buffer"]); const {CancelToken: c} = i.A; let l; const u = "fanyideskweb" , d = "webfanyi" , m = "client,mysticTime,product" , p = "1.0.0" , g = "web" , f = "fanyi.web" , h = 1 , A = 1 , v = 1 , b = "wifi" , T = 0; function y(e) { return r.createHash("md5").update(e).digest() } function _(e) { return r.createHash("md5").update(e.toString()).digest("hex") } function S(e, t) { return _(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`) } function k(e, t) { const n = (new Date).getTime(); return { sign: S(n, e), client: u, product: d, appVersion: p, vendor: g, pointParam: m, mysticTime: n, keyfrom: f, mid: h, screen: A, model: v, network: b, abtest: T, yduuid: t || "abcdefg" } } const I = "https://luna-ai.youdao.com" , w = (e,t)=>(0, a.Jt)("https://dict.youdao.com/webtranslate/key", (0, o.A)((0, o.A)({}, e), k(t))) , E = (e,t,n)=>(0, a.Jt)(`${I}/translate_llm/secret`, (0, o.A)((0, o.A)({}, e), k(t, n))) , C = (e,t)=>(0, a.H)("https://dict.youdao.com/webtranslate", (0, o.A)((0, o.A)({}, e), k(t)), { headers: { "Content-Type": "application/x-www-form-urlencoded" } }) , D = ()=>{ l && l() } , P = e=>(0, a.T3)("https://dict.youdao.com/keyword/key", e) , x = (e,t)=>(0, a.Jt)(" https://dict-subsidiary.youdao.com/aigc/entrance", (0, o.A)((0, o.A)({}, e), k(t))) , L = (e,t)=>(0, a.Jt)(" https://dict-subsidiary.youdao.com/aigc/style", (0, o.A)((0, o.A)({}, e), k(t))) , O = (e,t)=>(0, a.Jt)(" https://dict-subsidiary.youdao.com/aigc/tran", (0, o.A)((0, o.A)({}, e), k(t)), { cancelToken: new c((e=>{ l = e } )) }) , R = e=>(0, a.T3)("https://fanyi.youdao.com/feedback", e) , N = (e,t,n)=>{ if (!e) return null; const o = s.alloc(16, y(t)) , a = s.alloc(16, y(n)) , i = r.createDecipheriv("aes-128-cbc", o, a); let c = i.update(e, "base64", "utf-8"); return c += i.final("utf-8"), c } , U = "https://lunafeedback.youdao.com/feedback" , H = e=>{ const t = { comments: e }; return (0, a.T3)(`${U}/add?product=deskdict_contentCorrection&client=fanyiweb&appVersion=1.0.0`, t) } ; t.A = { getTextTranslateSecretKey: w, getTextTranslateResult: C, getTextTranslateKeyword: P, decodeData: N, feedback: H, getAigcEntrance: x, getAigcStyle: L, getAigcTran: O, fanyiFeedback: R, getAITranslateSecretKey: E, cancelLastGpt: D } }, 25507: function(e, t, n) { "use strict"; n(44114), n(72712), n(27495), n(25440), n(62953); var o = n(66278); const a = [] , r = n(84870) , i = r.keys().reduce(((e,t)=>{ const n = t.replace(/^\.\/(.*)\.\w+$/, "$1"); a.push(n); const o = r(t); return e[n] = o.default, e } ), {}); t.A = (0, o.y$)({ modules: i }) }, 57185: function(e, t, n) { "use strict"; n.r(t); n(44114), n(33110); var o = n(91250) , a = n(97504) , r = n(62512); const i = "DOMAIN" , s = "DOMAIN_MAP" , c = "TEXTDOMAIN_MAP" , l = { domainMap: a.A, allowDomainLanguageCombineList: ["en2zh-CHS", "zh-CHS2en"], isAllowAigc: !1, textTransDomainMap: a.A, aigcDomainMap: [] } , u = { [s](e, t) { e.domainMap = t }, [c](e, t) { e.textTransDomainMap = JSON.parse(JSON.stringify(t)) }, SET_ISALLOWAIGC(e, t) { e.isAllowAigc = t }, SET_AIGCDOMAINMAP(e, t) { e.aigcDomainMap = t } } , d = { initDictDomainFromLS({commit: e, state: t}, n) { var o = r.A.get(`${n}`); e(i, null !== o ? o : "0") }, async fetchDomainData({commit: e, state: t}, n) { var a = await o.A.get("https://doctrans-service.youdao.com/common/enums/list?key=domain&_=" + +new Date); a.data.data && (e(s, a.data.data), e(c, a.data.data)) }, updateDomainMap({commit: e, state: t}) { if (0 !== t.aigcDomainMap.length) { const e = t.textTransDomainMap.length; t.aigcDomainMap.forEach(((n,o)=>{ t.textTransDomainMap.push({ str: String(e + o), msg: n, from: "aigc" }) } )) } } } , m = { getDomainLabelByValue: e=>t=>{ let n = ""; for (var o = 0; o t=>{ let n = ""; for (var o = 0; o e.code === o)) } }; var u = { state: i, mutations: s, actions: c, getters: l } }, 37180: function(e, t, n) { "use strict"; n.r(t); const o = { isLogin: !0, isSvip: !1, isVip: !1, optionAvatar: "", nickname: "", isStudent: !1 } , a = { isLogin: e=>e.isLogin, optionAvatar: e=>e.optionAvatar, nickname: e=>e.nickname, isSvip: e=>e.isSvip, isVip: e=>e.isVip, isStudent: e=>e.isStudent } , r = { setOptionAvatar: ({commit: e},t)=>{ e("SET_OPTIONAVATAR", t) } , setNickName: ({commit: e},t)=>{ e("SET_NICKNAME", t) } , setLogin: ({commit: e},t)=>{ e("SET_LOGIN", t) } , setSvip: ({commit: e},t)=>{ e("SET_SVIP", t) } , setVip: ({commit: e},t)=>{ e("SET_VIP", t) } , setIsStudent: ({commit: e},t)=>{ e("SET_IS_STUDENT", t) } } , i = { SET_OPTIONAVATAR(e, t) { e.optionAvatar = t }, SET_NICKNAME(e, t) { e.nickname = t }, SET_LOGIN(e, t) { e.isLogin = t }, SET_SVIP(e, t) { e.isSvip = t }, SET_VIP(e, t) { e.isVip = t }, SET_IS_STUDENT(e, t) { e.isStudent = t } }; t["default"] = { namespaced: !0, state: o, getters: a, mutations: i, actions: r } }, 87087: function(e, t, n) { "use strict"; n.r(t), n.d(t, { default: function() { return u } }); n(44114); var o = n(34917) , a = n(62512); function r(e) { window.YoudaoSelector && (window.YoudaoSelector.Config.select = e ? "on" : "off") } const i = { secretKey: "", secretAIKey: "", dictResult: {}, decodeKey: "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl", decodeIv: "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4", allowStroke: !1, showPjm: !1, showRomanPronunciation: !1, showWordsNumber: !0, originResultId: "", originResultText: "", sourceText: "", selectedSourceText: "", historyList: [], isAfterProcessLoadng: !1, keyfrom: "", producting: !1, guideFreeTimes: 0, isInsertFromPaste: !1, firstTwoOriginText: "", isENandZH: !1, homeOriginText: "", dialogs: [], dialogInfo: {}, suggPrompts: "", guideFromOther: {}, remainTime: 0 } , s = { secretKey: e=>e.secretKey, secretAIKey: e=>e.secretAIKey, dictResult: e=>e.dictResult, suggPrompts: e=>e.suggPrompts, originResultId: e=>e.originResultId, originResultText: e=>e.originResultText, sourceText: e=>e.sourceText, guideFreeTimes: e=>e.guideFreeTimes, historyList: e=>e.historyList, isAfterProcessLoadng: e=>e.isAfterProcessLoadng, selectedSourceText: e=>e.selectedSourceText, producting: e=>e.producting, isInsertFromPaste: e=>e.isInsertFromPaste, firstTwoOriginText: e=>e.firstTwoOriginText, homeOriginText: e=>e.homeOriginText, isENandZH: e=>e.isENandZH } , c = { fetchAITranslateSecretKey: async({commit: e},t)=>{ const n = "ai-translate-llm-pre" , a = "EZAmCfVOH2CrBGMtPrtIPUzyv3bheLdk" , r = localStorage.getItem("yduuid") , i = localStorage.getItem("ydtoken") || void 0; return new Promise((t=>{ o.A.getAITranslateSecretKey({ keyid: n, token: i }, a, r).then((n=>{ 0 === n.code && (e("UPDATE_SECRET_AI_KEY", n.data.secretKey), n.data.token && localStorage.setItem("ydtoken", n.data.token), t(n.data.secretKey)) } )).catch((e=>{} )) } )) } , fetchTextTranslateSecretKey: async({commit: e},t)=>{ const n = "webfanyi-key-getter" , a = "asdjnjfenknafdfsdfsd"; return new Promise((t=>{ o.A.getTextTranslateSecretKey({ keyid: n }, a).then((n=>{ 0 === n.code && n.data.secretKey && (e("UPDATE_SECRET_KEY", n.data.secretKey), e("UPDATE_DECODE_KEY", n.data.aesKey), e("UPDATE_DECODE_IV", n.data.aesIv), t(n.data.secretKey)) } )).catch((e=>{} )) } )) } , setDictResult: ({commit: e},t)=>{ e("SET_DICTRESULT", t) } , initTextTranslateSettingStore: ({commit: e},t)=>{ const n = a.A.get("allowStroke") , o = a.A.get("showPjm") , r = a.A.get("showRomanPronunciation") , i = a.A.get("showWordsNumber"); e("SET_ALLOW_STROKE", null !== n && n), e("SET_SHOW_PJM", null !== o && o), e("SET_SHOW_ROMAN_PRONUNCICATION", null !== r && r), e("SET_SHOW_WORDS_NUMBER", null === i || i) } , setOriginResultId: ({commit: e},t)=>{ e("UPDATE_ORIGIN_ID", t) } , setSource: ({commit: e},t)=>{ e("UPDATE_SOURCE", t) } , setOriginResultText: ({commit: e},t)=>{ e("UPDATE_ORIGIN_TEXT", t) } , addHistoryItem: ({commit: e},t)=>{ e("ADD_HISTORY_ITEM", t) } , delHistoryItem: ({commit: e},t)=>{ e("DEL_HISTORY_ITEM", t) } , removeHistoryList: ({commit: e})=>{ e("REMOVE_HISTORY_LIST") } , updateHistoryList: ({commit: e},t)=>{ e("UPDATA_HISTORY_LIST", t) } , updateDialogs: ({commit: e},t)=>{ e("UPDATA_DIALOGS", t) } } , l = { ISWNANDZH(e, t) { e.isENandZH = t }, HOMEORIGINTEXT(e, t) { e.homeOriginText = t }, FIRSTTWOORIGINTEXT(e, t) { e.firstTwoOriginText = t }, ISPASTE_ORIGIN_TEXT(e, t) { e.isInsertFromPaste = t }, UPDATE_SECRET_KEY(e, t) { e.secretKey = t }, UPDATE_DECODE_KEY(e, t) { e.decodeKey = t }, UPDATE_DECODE_IV(e, t) { e.decodeIv = t }, UPDATE_SECRET_AI_KEY(e, t) { e.secretAIKey = t }, SET_DICTRESULT(e, t) { e.dictResult = t }, SET_ALLOW_STROKE(e, t) { e.allowStroke = t, a.A.set("allowStroke", t), r(t) }, SET_SHOW_PJM(e, t) { e.showPjm = t, a.A.set("showPjm", t) }, SET_SHOW_ROMAN_PRONUNCICATION(e, t) { e.showRomanPronunciation = t, a.A.set("showRomanPronunciation", t) }, SET_SHOW_WORDS_NUMBER(e, t) { e.showWordsNumber = t, a.A.set("showWordsNumber", t) }, UPDATE_SUGG_PROMPTS(e, t) { e.suggPrompts = t, a.A.set("suggPrompts", t) }, UPDATE_ORIGIN_ID(e, t) { e.originResultId = t }, UPDATE_SOURCE(e, t) { e.sourceText = t }, UPDATE_ORIGIN_TEXT(e, t) { e.originResultText = t }, UPDATE_GUIDEFREETIMES(e, t) { e.guideFreeTimes = t }, ADD_HISTORY_ITEM(e, t) { e.historyList.push(t) }, ADD_HISTORY(e, t) { e.historyList = t }, DEL_HISTORY_ITEM(e, t) { const n = e.historyList.findIndex((e=>e.id == t)); -1 !== n && e.historyList.splice(n, 1) }, REMOVE_HISTORY_LIST(e) { e.historyList = [] }, UPDATA_HISTORY_LIST(e, t) { const n = e.historyList.findIndex((e=>e.id === t.id)); -1 !== n && e.historyList.splice(n, 1, t) }, UPDATE_ISAFTERPROCESS_LOADING(e, t) { e.isAfterProcessLoadng = t }, UPDATA_SELECTED_SOURCE_TEXT(e, t) { e.selectedSourceText = t }, UPDATE_KEYFROM(e, t) { e.keyfrom = t }, UPDATE_PRODUCTING(e, t) { e.producting = t }, UPDATA_DIALOGS(e, t) { const n = e.dialogs.findIndex((e=>e.roundId === t.roundId)); -1 !== n && e.dialogs.splice(n, 1, t) }, ADD_DIALOGS(e, t) { e.dialogs.push(t) }, RESET_DIALOGS(e) { e.dialogs = [] }, RECOVER_DIALOGS(e, t) { e.dialogs = t }, UPDATA_DIALOGINFO(e, t) { 0 !== Object.keys(t).length ? (t.id && (e.dialogInfo.id = t.id), t.functionEnglishName && (e.dialogInfo.functionEnglishName = t.functionEnglishName)) : e.dialogInfo = t }, UPDATA_GUIDEFROMOTHER(e, t) { e.guideFromOther = t }, SET_REMAIN_TIME(e, t) { e.remainTime = t } }; var u = { state: i, getters: s, mutations: l, actions: c } }, 37282: function(e, t, n) { "use strict"; var o = n(27380); const a = {} , r = (0, o.A)(); a.$on = r.on, a.$off = r.off, a.$emit = r.emit, t.A = a }, 45358: function(e, t, n) { "use strict"; n.d(t, { n: function() { return s } }); n(84864), n(57465), n(27495), n(25440); var o = n(53007); const a = ()=>{ o.A.baiduCallback({ loginUrl: window.location.href, type: 49 }) } , r = (e,t)=>{ const n = new Date , o = new Date(e) , a = new Date(t); return n >= o && n { let n; return function(...o) { const a = this; clearTimeout(n), n = setTimeout((()=>{ e.apply(a, o) } ), t) } } , s = (e,t)=>{ let n, o = 0; return function() { const a = this , r = arguments , i = +Date.now(); i - o >= t ? (clearTimeout(n), e.apply(a, r), o = i) : (clearTimeout(n), n = setTimeout((()=>{ e.apply(a, r) } ), t)) } } , c = (e,t)=>{ const n = { "M+": t.getMonth() + 1, "d+": t.getDate(), "H+": t.getHours(), "h+": t.getHours(), "m+": t.getMinutes(), "s+": t.getSeconds(), "q+": Math.floor((t.getMonth() + 3) / 3), S: t.getMilliseconds() }; /(y+)/.test(e) && (e = e.replace(RegExp.$1, `${t.getFullYear()}`.substr(4 - RegExp.$1.length))); for (const o in n) new RegExp(`(${o})`).test(e) && (e = e.replace(RegExp.$1, 1 === RegExp.$1.length ? n[o] : `00${n[o]}`.substr(`${n[o]}`.length))); return e } , l = ()=>/macintosh|mac os x/i.test(navigator.userAgent) , u = (e,t="")=>{ const n = document.createElement("a"); n.download = t, n.style.display = "none", n.href = e, document.body.appendChild(n), n.click(), document.body.removeChild(n) } , d = e=>{ var t = e.split("?")[1] , n = {}; if (!t) return n; t = t.split("&"); for (var o = 0, a = t.length; o { if (navigator.clipboard) navigator.clipboard.writeText(e); else { var t = document.createElement("textarea"); document.body.appendChild(t), t.style.position = "fixed", t.style.clip = "rect(0 0 0 0)", t.style.top = "10px", t.value = e, t.select(), document.execCommand("copy", !0), document.body.removeChild(t) } } , p = function(e, t) { if (!Object.keys(t).length) return e; e += "?"; for (let n in t) e += `${encodeURIComponent(n)}=${encodeURIComponent(t[n])}&`; return e.substring(0, e.length - 1) } , g = e=>{ const t = new RegExp(`(\\?|#|&)${e}=([^]*)(&|#|$)`) , n = window.location.href.match(t); return decodeURIComponent(n ? n[2] : "") } ; t.A = { isDuringDate: r, debounce: i, throttle: s, dateFormat: c, isMac: l, downloadFile: u, getUrlParams: d, getParameter: g, baiduCallback: a, genUrl: p, copy: m } }, 62512: function(e, t, n) { "use strict"; n(33110); let o; const a = "fanyiweb" , r = window.localStorage; function i(e) { return `${a}-${e}` } o = "undefined" !== typeof localStorage && null !== localStorage && { set: function(e, t) { var n = JSON.stringify(t); e = i(e); try { return r.setItem(e, n) } catch (o) { "QuotaExceededError" === o.name && (r.clear(), r.setItem(e, n)) } }, get: function(e) { var t = JSON.parse(r.getItem(i(e))); return t }, remove: function(e) { r.removeItem(i(e)) } }, t.A = o }, 96091: function(e, t, n) { "use strict"; var o = n(8661); function a() { return new Promise((e=>{ o.Ay.load().then((t=>{ t.get().then((t=>{ console.log(t.visitorId, "visitorId"), localStorage.setItem("yduuid", t.visitorId), e(t.visitorId) } )) } )) } )) } t.A = a }, 97815: function(e, t, n) { "use strict"; var o = n(58788) , a = (n(44114), n(26910), n(62953), n(21396)) , r = n.n(a); const i = "key" , s = (e={},t)=>{ const n = (0, o.A)({}, e); Object.keys(n).forEach((e=>{ "" === n[e] && delete n[e] } )); const a = Object.keys(n).sort().filter((e=>!(void 0 === n[e]))); a.push(i), n[i] = t; const s = `${a.map((e=>`${e}=${n[e]}`)).join("&")}`; return [r().MD5(s).toString(r().enc.Hex), a.join(",")] } , c = (e,t,n,a,r,i,c,l)=>{ const u = (0, o.A)({ product: a, appVersion: c || 1, client: l || "web", mid: 1, vendor: "web", screen: 1, model: 1, imei: 1, network: "wifi", keyfrom: r || "fanyi.web", keyid: n, mysticTime: Date.now(), yduuid: i || "abcdefg", abtest: 0 }, e); console.log("requestData", u); const [d,m] = s(u, t); return Object.assign(u, { sign: d, pointParam: m }), u } , l = (e,t,n,a,r,i,c,l)=>{ const u = (0, o.A)({ product: a, appVersion: c || 1, client: l || "web", mid: 1, vendor: "web", screen: 1, model: 1, imei: 1, network: "wifi", keyfrom: r || "fanyi.web", keyid: n, mysticTime: Date.now(), yduuid: i || "abcdefg", abtest: 0 }, e) , [d,m] = s(u, t); Object.assign(u, { sign: d, pointParam: m }); const p = new FormData , g = Object.keys(u); return g.forEach((e=>{ p.append(e, u[e]) } )), p } ; t.A = { genSign: s, genParamV3: c, genParamV3FormData: l } }, 19358: function(e, t, n) { "use strict"; n.d(t, { A: function() { return m } }); var o = n(6301) , a = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABGCAYAAAB8MJLDAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQmSURBVHgB7ZrPSxtBFMdffxwEe1C8BEW7hyKCBT0qHgw00IJgK/ijh2IFqznooR78H4p40GPFg96MCjaC0IKFVAj2GKGCoodFjFg8qKiQQ8HO13VkG8lmZvaHJp0PPLKzmdW87743+2Z2iDQajUaj0Wg0Go3mP+QBBU+ZzeycMMswO6QACUKAEmaNzOqYha7bTnARUsxMsoTxDT8FMJiFrz/dYDL7yWyLfMAPAQzyxvFsEAlz5HGKeCkAQjvMrIn8BdGQICtVXOOVABjQ+uj2wOYXiIYZ8mB8eETuwcD2gdkTCg5EGwZVk9k5ucCtAHC+j/KP7H6A//mc2S65EMGNAAj3dxTsnc/mMVki/CLFMUFVAKiPsA8q552ACEgH1A1/SBJVASLMntH9ATcEQuySJA9JHuS93486FfCbDJJERYC3dH8JkySyAiDX7kPe58IgySiQFUA69Gtqakqi0ejT5uZmYeH4NaRGWKazTCUIBz6SJKlUqqehoaHu+Pj4pK2tbXZ9fd2xeoNQKysr78vLy8t2dnbM2traWZLnEwk+FmUiwCAF2N3EoElwCI45RYLdebRLS0tVC6xG0Y4yAgj/UTv9/f0xfsxFQIhn98M5u/NgeHg4TmrUiXaUESBECiwtLR2Oj4/fOAIHWRr8IwKOcc7uPK7BtaSG8G8VFUBkJScno6OjKbsIlZWVodXV1R7exjHO8fb09PQ3XEPq4LcKDbqig6BB1qTHFfPz8+Gurq5W3k4mk1dOtrS03KTX4uJigvX5Qe6ZIWu26IioAPiBb8gDskWw46Hz4AtZ8wNHVCpBV3R3dycWFhZuOemx88IELgC4vLwUOhcEgQsQi8XCLApupQC7+2GWHq0UMKLTYYzQws/WXExNTTX19va+4O2NjY2ts7Oz84qKiqsRu76+3qiurs4sLy+nyT1YPM27ZhhYBIyNjTUODAy85O2Dg4PD9vb2eCQSieGYn2eF0yv0Jfd4Xgorg4kNe66/5m3MC1jZO7u3t5eB4dguAvoODg4apI7wKzbfBejo6AhNTEzcrCHwSREc5+dw3NnZGcN3/Nzk5GQPriU1hCtI3+uAdDod5VVevhlh9mQIUVFVVfWZ5BGqAYDvEXBxcXF1p0Wmw/gOfXgkHB0dqb74MEU7+v4UiMfj28yR9NDQ0PfNzc286/f7+/uZtbW1bSbC75GRkeTp6ansSq9J1hNAiMBL4QDAC1ThN8l3Ugn6CFJG6jV6sQkwJ9m/qARA3ksvoBSLAAj9BClQDALwvQJKL0cLXQA4jbxX3ihRyALA+RlyuWfoMRUmnm2RKUQBPN0kJSqASXePSZbjJnmI6FwAamOGpjo9dYNJ1uwuQT7sGpVJga/Xn16s1jjBFzNQ0qbIo1DPhco+QUSCQd5zYjONRqPRaDQajUbjL38BFOZkzE3BMTIAAAAASUVORK5CYII="; const r = ["src"]; function i(e, t, n, i, s, c) { return i.showBanner ? ((0, o.uX)(), (0, o.CE)("div", { key: 0, class: "banner", onClick: i.goBanner }, [(0, o.Lk)("img", { class: "banner-img", src: i.picture }, null, 8, r), (0, o.Lk)("img", { class: "close", src: a, onClick: (0, o.D$)(i.closeBanner, ["stop"]) })])) : (0, o.Q3)("", !0) } var s = n(91588) , c = n(45358) , l = { __name: "Banner", setup(e, {expose: t}) { t(); const n = (0, o.KR)("") , a = (0, o.KR)("") , r = (0, o.KR)(!0) , i = (0, o.nI)() , l = i.appContext.config.globalProperties; (0, o.sV)((()=>{ s.A.getBannerInfos().then((e=>{ const t = e.data.value; n.value = t.url, a.value = t.picture, c.A.isDuringDate(t.startTime, t.endTime) && null === l.$cookies.get("bannercookie") ? r.value = !0 : r.value = !1 } )) } )); const u = ()=>{ l.$cookies.set("bannercookie", !0, 86400), r.value = !1 } , d = ()=>{ window.open(n.value) } , m = { url: n, picture: a, showBanner: r, internalInstance: i, internalData: l, closeBanner: u, goBanner: d, get service() { return s.A }, get util() { return c.A } }; return Object.defineProperty(m, "__isScriptSetup", { enumerable: !1, value: !0 }), m } } , u = n(66262); const d = (0, u.A)(l, [["render", i], ["__scopeId", "data-v-77236003"]]); var m = d }, 52670: function(e, t, n) { "use strict"; n.d(t, { A: function() { return l } }); n(62953); var o = n(6301); const a = { class: "inner-content" }; function r(e, t, n, r, i, s) { const c = (0, o.gN)("fixed"); return (0, o.uX)(), (0, o.Wv)(o.Im, { to: "body" }, [n.visible ? (0, o.bo)(((0, o.uX)(), (0, o.CE)("div", { key: 0, class: "pop-up-comp mask", onClick: t[0] || (t[0] = (0, o.D$)(((...e)=>r.close && r.close(...e)), ["self"])) }, [(0, o.Lk)("div", a, [(0, o.RG)(e.$slots, "content", {}, void 0, !0)])])), [[c]]) : (0, o.Q3)("", !0)]) } var i = { name: "PopUp", props: { visible: Boolean, modalClosable: { type: Boolean, default: !0 } }, setup(e, t) { function n() { e.modalClosable && t.emit("update:visible", !1) } return { close: n } }, directives: { fixed: { mounted() { const e = document.body.scrollTop || document.documentElement.scrollTop; document.body.style.cssText += `position:fixed;top:-${e}px;width: 100%;` }, unmounted() { const {body: e} = document; e.style.position = "static"; const {top: t} = e.style; document.body.scrollTop = -parseInt(t, 10), document.documentElement.scrollTop = -parseInt(t, 10), e.style.top = "" } } } } , s = n(66262); const c = (0, s.A)(i, [["render", r], ["__scopeId", "data-v-909b0550"]]); var l = c }, 95124: function(e, t, n) { "use strict"; n.d(t, { A: function() { return u } }); var o = n(6301); const a = { key: 0, class: "interfaceDialogMask" } , r = { class: "interfaceDialog-body" }; function i(e, t, n, i, s, c) { return n.dialogVisible ? ((0, o.uX)(), (0, o.CE)("div", a, [(0, o.Lk)("div", { class: (0, o.C4)(["interfaceDialog", { "interfaceDialog-default-style": n.withDialogStyle }, { isCenter: n.isCenter }]), style: (0, o.Tr)({ width: c.pxStyle(n.width), height: c.pxStyle(n.height), top: c.pxStyle(n.top), left: c.pxStyle(n.left) }), ref: "interfaceDialog" }, [(0, o.Lk)("div", r, [(0, o.RG)(e.$slots, "default", {}, void 0, !0)])], 6)])) : (0, o.Q3)("", !0) } var s = { name: "InterfaceDialog", components: {}, props: { dialogVisible: { type: Boolean, required: !0, default: !1 }, width: { type: [Number, String], required: !0, default: "auto" }, height: { type: [Number, String], required: !0, default: "auto" }, top: { type: [Number, String], required: !0, default: 0 }, left: { type: [Number, String], required: !0, default: 0 }, withDialogStyle: { type: Boolean, default: !0 }, isCenter: { type: Boolean, default: !1 } }, data() { return { promiseStatus: {} } }, methods: { pxStyle(e) { return this.isString(e) ? e : e + "px" }, isString(e) { return "string" === typeof e }, isNumber(e) { return "number" === typeof e }, closeinterfaceDialog() { this.$emit("closeDialog") }, modalClickEventHandler(e) { this.$refs.interfaceDialog && !this.$refs.interfaceDialog.contains(e.target) && this.closeinterfaceDialog() } }, watch: { dialogVisible: { handler: function(e) { e ? this.$nextTick((()=>{ setTimeout((()=>{ document.body.addEventListener("click", this.modalClickEventHandler, !0) } ), 10) } )) : document.body.removeEventListener("click", this.modalClickEventHandler, !0) } } } } , c = n(66262); const l = (0, c.A)(s, [["render", i], ["__scopeId", "data-v-c8935532"]]); var u = l }, 84870: function(e, t, n) { var o = { "./domain.js": 57185, "./language.js": 36032, "./login.js": 37180, "./text.js": 87087 }; function a(e) { var t = r(e); return n(t) } function r(e) { if (!n.o(o, e)) { var t = new Error("Cannot find module '" + e + "'"); throw t.code = "MODULE_NOT_FOUND", t } return o[e] } a.keys = function() { return Object.keys(o) } , a.resolve = r, e.exports = a, a.id = 84870 }, 78982: function() {}, 47790: function() {}, 73776: function() {}, 77965: function() {}, 50477: function() {}, 66089: function() {}, 79368: function() {}, 64688: function() {}, 51069: function() {}, 15340: function() {}, 79838: function() {} } , t = {}; function n(o) { var a = t[o]; if (void 0 !== a) return a.exports; var r = t[o] = { id: o, loaded: !1, exports: {} }; return e[o].call(r.exports, r, r.exports, n), r.loaded = !0, r.exports } n.m = e, function() { var e = []; n.O = function(t, o, a, r) { if (!o) { var i = 1 / 0; for (u = 0; u = r) && Object.keys(n.O).every((function(e) { return n.O[e](o[c]) } )) ? o.splice(c--, 1) : (s = !1, r 0 && e[u - 1][2] > r; u--) e[u] = e[u - 1]; e[u] = [o, a, r] } }(), function() { n.n = function(e) { var t = e && e.__esModule ? function() { return e["default"] } : function() { return e } ; return n.d(t, { a: t }), t } }(), function() { n.d = function(e, t) { for (var o in t) n.o(t, o) && !n.o(e, o) && Object.defineProperty(e, o, { enumerable: !0, get: t[o] }) } }(), function() { n.f = {}, n.e = function(e) { return Promise.all(Object.keys(n.f).reduce((function(t, o) { return n.f[o](e, t), t } ), [])) } }(), function() { n.u = function(e) { return "js/" + ({ 108: "paraphraser", 333: "NoLogin", 348: "textTranslate", 471: "termBank", 551: "documentUpload", 637: "DocHistory", 688: "Person", 873: "aiTranslateV2" }[e] || e) + "." + { 108: "f7f3bb71", 189: "1b097f46", 316: "7dfe60c7", 333: "dd35b6a1", 348: "d336598c", 471: "d7e66b57", 551: "f013ccc6", 637: "99056b8a", 665: "832b6ef2", 667: "975ebdcd", 688: "80dee66f", 762: "dc5f2fd1", 873: "aaa38288" }[e] + ".js" } }(), function() { n.miniCssF = function(e) { return "css/" + ({ 108: "paraphraser", 333: "NoLogin", 348: "textTranslate", 471: "termBank", 551: "documentUpload", 637: "DocHistory", 688: "Person", 873: "aiTranslateV2" }[e] || e) + "." + { 108: "874603c4", 189: "866870da", 333: "5e783a0d", 348: "ab99eb3b", 471: "85b861c6", 551: "e3a3ba62", 637: "70e3b24a", 665: "f75992a6", 667: "100b0dc3", 688: "980320bd", 873: "ecad14a3" }[e] + ".css" } }(), function() { n.g = function() { if ("object" === typeof globalThis) return globalThis; try { return this || new Function("return this")() } catch (e) { if ("object" === typeof window) return window } }() }(), function() { n.o = function(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } }(), function() { var e = {} , t = "translation-website:"; n.l = function(o, a, r, i) { if (e[o]) e[o].push(a); else { var s, c; if (void 0 !== r) for (var l = document.getElementsByTagName("script"), u = 0; u
重构加载器
重新构建将加载器函数导出即可使用
(function( e ) {
function n(o) {
var a = t[o];
if (void 0 !== a)
return a.exports;
var r = t[o] = {
id: o,
loaded: !1,
exports: {}
};
return e[o].call(r.exports, r, r.exports, n),
r.loaded = !0,
r.exports
}
_util = n;
}
)({
});
坑1:加载器中检测
var t = {};
// 必须
n.g = function() {
if ("object" === typeof globalThis)
return globalThis;
try {
return this || new Function("return this")()
} catch (e) {
if ("object" === typeof window)
return window
}
}()
// 必须
n.nmd = function(e) {
return e.paths = [],
e.children || (e.children = []),
e
}
坑2:加载方法返回空对象
79838: function() {},
15340: function() {},
*** 这两个方法存在于加载器中, 被我提取到加载方法内部
最终版加载器
var _util;
(function( e ) {
var t = {};
function n(o) {
var a = t[o];
if (void 0 !== a)
return a.exports;
var r = t[o] = {
id: o,
loaded: !1,
exports: {}
};
return e[o].call(r.exports, r, r.exports, n),
r.loaded = !0,
r.exports
}
n.g = function() {
if ("object" === typeof globalThis)
return globalThis;
try {
return this || new Function("return this")()
} catch (e) {
if ("object" === typeof window)
return window
}
}()
n.nmd = function(e) {
return e.paths = [],
e.children || (e.children = []),
e
}
_util = n;
}
)({
79838: function() {},
15340: function() {},
});
提取代码
r = n(91565)
那么到这里基本就结束了。
只需将上面webpack适配下 即可实现扣代码模块
本人比较喜欢扣,所以就存在所谓的坑1,坑2。 以及最终构建出来的加载器。
如果你比较喜欢一把梭哈,那么就不存在以上问题


结果测试
加密
///
// sign
// ------
// r.createHash("md5").update(e.toString()).digest("hex")
var md5HashUtil = _util( 47108 )( 'md5' )
console.log( md5HashUtil.update( '1' ).digest("hex") )


解密
///
// aes
function y(e) {
var md5Util = _util( 47108 )( 'md5' )
return md5Util.update(e).digest()
}
t = 'xxxxx'
n = 'xxxxx'
var aesUtil = _util( 48287 ).Buffer
o = aesUtil.alloc(16, y(t) )
a = aesUtil.alloc(16, y(n) )
i = _util( 91565 ).createDecipheriv("aes-128-cbc", o, a);
let c = i.update( "Z21kD9ZK1ke6ugku2ccWu4n6eLnvoDT0YgGi0y3g-v0B9sYqg8L9D6UERNozYOHqnYdl2efZNyM6Trc_xS-zKtfTK4hb6JP8XwCzNh0avc8qItQUiIU_4wKKXJlIpvMvfKvJaaZzaX6VEtpkr2FdkfoT_Jgbm2GRSVj3r40autIdlImENG8hC0ZH4ww7utwuTt3Oo_ZpXg0BSq9wePSAB75-ChkiGKF9HTIPeCl2bl84SBD1XDfFCZpkKQhecYSs0JLoXOqP2ltavxRrg58Hp1q5uIgZZ_Oo2-Jmd-t1r4es40drcAq5bjmS62M2VJF8D6ojtOh9JTfNwgzD3CxYn-Pd7-TgHMyNEJEkFXTAyxzpjlFqtrCYDE3SZUYlENkqsL8Wrra1hM-1n TfiB-BLcWAdRBynNpP5_54aq_-GBsq8bB_9yEX5ovzDB4_Ry_spVVuUnb39iplMHCdCnjOD3ngiIDbl9SUz-9n pjBX05ZYRdPmFPAl424qdoaxeVqnVoH8jQFPZVqaHMzu4mJg0SICDWFH7GP1zqGRbXd3ESjT_iBInl3gICt2XVuhh_nubcELkTEC6xbqEDRQkPUNMpzXJHjcvsLHtcmSW0S9F0445ho9kT2qZYdMBC3Fs0OaHpUtFu77gZpQn7sGiqh8VliXIcUtfvvop-1 c-Vu5QjfUbLn2-s5POR9fGYG6rt6ioe_PGmwWj-Cc00zUM7FybfarKTr4D3Rk57R72qpXN4Ja86ZsCAMmDG-m5z31RQh_V7echJ8Kna3Go3yWKCK4vtSwOWrFhiS5RTz6EkrGc3SkFKbb5vp8Wop_84myBtgnBmj4CczhTq2HcOxrJf4def6yDt2uBxyv4bTVGx9Yx3uB4Gx0iK5kYvfma6B_LnkRWk331wjuXKQtBGYIuWkR8J5QtvBmIRVaa7AA19Z4xMIEAqbcuQ5p4I9FCElthBrJd9YOcouHK4U27xxYWJJXcJoTvzG7zWtiV76fHDeQLgAWvJJ7ww4NFgjhqc6AKA_2afxa4c_lAvVZgFuKL3XSCL7PfKxp6GhjcGKeSRr80PT1gfFw2xi8X4ejjNm_prsUZ", "base64", "utf-8");
c += i.final("utf-8"),
console.log( c )

参数刨析
加密参数:${t} //
解密参数:t //实际为aes key
解密参数:n //实际为aes iv
以上三个参数均由另外一个接口请求的来
以上问题请看下篇文章分解:某翻译平台翻译接口逆向之加解密参数刨析
还没有评论,来说两句吧...