// ==UserScript==
// @name 扇贝单词小助手
// @namespace http://tampermonkey.net/
// @version 1.9.3
// @homepageURL https://greasyfork.org/zh-CN/scripts/419996-%E6%89%87%E8%B4%9D%E5%8D%95%E8%AF%8D%E5%B0%8F%E5%8A%A9%E6%89%8B
// @description 新增翻译小助手,快捷查询中文对应的英文单词。数字小键盘快捷键,数字键3:US发音,数字键4:UK发音,数字5:扇贝单词与柯林斯词典的切换,数字6:例句发音,数字7:真题例句发音,数字0:隐藏展示柯林斯词典中的英文,专注模式,让你更专注背单词,黑暗模式,更护眼。显示/隐藏扇贝例句和柯林斯例句中文翻译的按钮,并关联数字键8,更多快捷键请查看面板或者更新日志与使用说明
// @author ddrrcc
// @match https://web.shanbay.com/wordsweb/*
// @grant GM_info
// @grant GM_setValue
// @grant GM_getValue
// @connect youdao.com
// @connect greasyfork.org
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @icon https://static.baydn.com/static/img/shanbay_favicon.png
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
// @require https://cdn.bootcdn.net/ajax/libs/toastr.js/latest/js/toastr.min.js
// @require https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.min.js
// @require https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.1/index.min.js
// @require https://cdn.bootcdn.net/ajax/libs/blueimp-md5/2.18.0/js/md5.min.js
// @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js
// @require https://cdn.bootcdn.net/ajax/libs/limonte-sweetalert2/10.12.5/sweetalert2.all.min.js
// @grant unsafeWindow
// @downloadURL https://update.greasyfork.icu/scripts/419996/%E6%89%87%E8%B4%9D%E5%8D%95%E8%AF%8D%E5%B0%8F%E5%8A%A9%E6%89%8B.user.js
// @updateURL https://update.greasyfork.icu/scripts/419996/%E6%89%87%E8%B4%9D%E5%8D%95%E8%AF%8D%E5%B0%8F%E5%8A%A9%E6%89%8B.meta.js
// ==/UserScript==
(function() {
// 如果哪天翻译小助手不能使用了,可能就是费用不够了,自己可到有道翻译网站自行开通一个账号,将appKey和key填入即可
let appKey = '1c7773d325ec6c09';
let key = '0J9Aurlycl0JEUO5iQ4esUhh7qUNHfe0';
// 定义变量
var flag; // 用于数字5切换词典
var flag2; // 用于柯林斯词典真题例句发音
//const version = 1.8; // 脚本当前版本
const version = GM_info.script.version;
const updateURL = GM_info.script.homepage; // url
const scriptname = GM_info.script.name;
var font_size; //字体大小
var tip; // 展开笔记标识
// var versionMsg = "扇贝单词添加序号";
$(document.head).append(
``
)
// bootstrap按钮样式
$(document.head).append(
``
)
function fond_size(font_size) {
$(
".StudySummaryItem_content__3j9YG > div > div >span:nth-child(3),.BayTrans_paraphrase__2JMIz,.CollinsTrans_pos__3szum,.CollinsTrans_paraphraseList__3SZ3y > li > span:nth-child(3),.index_name__1gkfJ"
).css({
"font-size": font_size + `px`,
"font-weight": "bold",
})
// 扇贝单词添加序号
var ptotal = $(".BayTrans_paraphrase__2JMIz > p")
// console.log(ptotal)
let index = 1
for (let s of ptotal) {
// console.log("s",$(s))
$(s).children().first().before("" + index +
". ")
// s.before("" + var1 + ".")
index++
}
ptotal.css({
"margin-top": "6px"
})
}
// 设置字体大小
let util = {
getValue(name) {
return GM_getValue(name);
},
setValue(name, value) {
GM_setValue(name, value);
},
};
let main = {
/**
* 配置默认值
*/
initValue() {
let value = [{
name: 'current_val',
value: 15
}, {
name: 'has_init',
value: false
}];
value.forEach((v) => {
util.getValue(v.name) === undefined && util.setValue(v.name, v.value);
});
},
showSetting() {
Swal.fire({
title: '请选择字体大小',
icon: 'info',
input: 'range',
showCancelButton: true,
confirmButtonText: '保存',
cancelButtonText: '还原',
showCloseButton: true,
inputLabel: '拖动滑块观察字体大小变化',
inputAttributes: {
min: 15,
max: 25,
step: 0.1
},
footer: '
可点击
图标 -> 扇贝单词小助手 -> 字体大小设置 打开本页面
',
inputValue: util.getValue('current_val')
}).then((res) => {
util.setValue('has_init', true);
if (res.isConfirmed) {
font_size = util.getValue('current_val')
util.setValue('current_val', res.value);
// this.addStyle();
// console.log("ces")
fond_size(font_size)
}
if (res.isDismissed && res.dismiss === "cancel") {
util.setValue('current_val', 15);
font_size = util.getValue('current_val')
fond_size(font_size)
// this.addStyle();
}
});
document.getElementById('swal2-input').addEventListener('change', (e) => {
util.setValue('current_val', e.target.value);
font_size = util.getValue('current_val')
// this.addStyle();
fond_size(font_size)
})
},
registerMenuCommand() {
GM_registerMenuCommand('字体大小设置', () => {
this.showSetting();
});
},
init() {
this.initValue();
!util.getValue('has_init') && this.showSetting();
this.registerMenuCommand();
}
};
main.init();
// 设置通知位置
toastr.options = {
positionClass: "toast-center-center"
};
// 全屏与退出全屏====================================================
// 根据浏览器可视区域高度与屏幕实际高度差值判断页面是否为全屏状态
// 取值17是为了处理页面内容出现滚动条的情况
var isFull = Math.abs(window.screen.height - window.document.documentElement.clientHeight) <= 17
window.onresize = function() {
isFull = Math.abs(window.screen.height - window.document.documentElement.clientHeight) <= 17
}
// 阻止F11键默认事件,用HTML5全屏API代替
window.addEventListener('keydown', function(e) {
e = e || window.event
if (e.keyCode == 122 && !isFull) {
e.preventDefault()
enterFullScreen()
document.addEventListener("webkitfullscreenchange", exitF, true);
document.addEventListener("mozfullscreenchange", exitF, true);
}
})
function exitF() {
if (!document.webkitIsFullScreen) {
//退出全屏后执行的代码
$(".Nav_nav__3kyeO").show();
$(".Nav_container__sBZA1").show();
$(".SubNav_itemsWrapper__1mM4u").show();
toastr.warning("退出专注模式,不要被外界干扰哟!建议开启专注模式!")
// exitFullScreen()
}
}
// 打开浏览器全屏模式
function enterFullScreen() {
$(".Nav_nav__3kyeO").hide();
$(".Nav_container__sBZA1").hide();
$(".SubNav_itemsWrapper__1mM4u").hide();
toastr.success("进入专注模式,更专注于背单词!")
let el = document.documentElement
let rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el
.msRequestFullscreen
if (rfs) { // typeof rfs != "undefined" && rfs
rfs.call(el)
} else if (typeof window.ActiveXObject !== 'undefined') {
// for IE,这里其实就是模拟了按下键盘的F11,使浏览器全屏
let wscript = new ActiveXObject('WScript.Shell')
if (wscript != null) {
wscript.SendKeys('{F11}')
}
}
}
// 退出全屏
function exitFullScreen() {
$(".Nav_nav__3kyeO").show();
$(".Nav_container__sBZA1").show();
$(".SubNav_itemsWrapper__1mM4u").show();
toastr.warning("退出专注模式,不要被外界干扰哟!建议开启专注模式!")
let el = document
let cfs = el.cancelFullScreen || el.mozCancelFullScreen || el.msExitFullscreen || el.webkitExitFullscreen ||
el.exitFullscreen
if (cfs) { // typeof cfs != "undefined" && cfs
cfs.call(el)
} else if (typeof window.ActiveXObject !== 'undefined') {
// for IE,这里和fullScreen相同,模拟按下F11键退出全屏
let wscript = new ActiveXObject('WScript.Shell')
if (wscript != null) {
wscript.SendKeys('{F11}')
}
}
}
// ===================================================================
// 键盘监听========
$(document).keydown(function(event, repeat) {
if (repeat) return
// 数字键3,o ,US发音
if (event.keyCode == 99 || event.keyCode == 51 || event.keyCode == 79) {
$(".index_trump__3bTaM:last").click()
$(".Pronounce_audio__3xdMh:last").click()
}
// 数字键4,i,UK发音
if (event.keyCode == 100 || event.keyCode == 52 || event.keyCode == 73) {
$(".index_trump__3bTaM:first").click()
$(".Pronounce_audio__3xdMh:first").click()
}
// 数字5,u,用于切换扇贝单词与柯林斯词典
if (event.keyCode == 101 || event.keyCode == 53 || event.keyCode == 85) {
var msg = $(".index_tab__37Cha.index_active__1bHoy").html()
if (msg == $(".index_tabNavs__3tWev:eq(0) > p:eq(0)").html()) {
flag = true;
} else {
flag = false;
}
if (!flag) {
$(".index_tabNavs__3tWev:eq(0) > p:eq(0)").click()
flag = !flag;
// console.log($(".index_tab__37Cha").html())
// $(".index_tab__37Cha").trigger("click");
} else {
// console.log($(".index_tab__37Cha.index_active__1bHoy").html())
// $(".index_tab__37Cha.index_active__1bHoy").trigger("click");
$(".index_tabNavs__3tWev:eq(0) > p:eq(1)").click()
flag = !flag;
}
}
// 数字键盘6,f,例句发音,将f键改为t键(f键与扇贝原有的快捷键冲突)
if (event.keyCode == 102 || event.keyCode == 54 || event.keyCode == 84) {
$(".index_icon__1IK2K").click()
}
// 数字键盘7,,g,真题例句发音
if (event.keyCode == 103 || event.keyCode == 55 || event.keyCode == 71) {
$(".index_audio__1mSVg:first > img").click()
}
// 数字键盘8,h,例句翻译显示与隐藏
if (event.keyCode == 104 || event.keyCode == 56 || event.keyCode == 72) {
$(".btn.btn-primary.btn-xs").next().toggle()
}
// 数字键盘0,v,隐藏展示柯林斯词典中的英文
if (event.keyCode == 96 || event.keyCode == 48 || event.keyCode == 86) {
if (GM_getValue('check5') == 1) {
// $(".CollinsTrans_senseEn__17oYf").toggle()
$(".btn.btn-link.btn-xs").prev().prev().toggle()
} else if (GM_getValue('check5') == 2) {
// $(".CollinsTrans_senseEn__17oYf").next().toggle()
$(".btn.btn-link.btn-xs").prev().toggle()
}
}
// 键盘k,相当于2
if (event.keyCode == 75) {
// console.log("k按下")
$(".index_option__1CVr2.index_red__VSPTN").click()
// 撤销
// $(".Message_message__w-TNe.alert.middle > div > span").click()
}
// 键盘j,相当于1
if (event.keyCode == 74) {
// console.log("j按下")
$(".index_option__1CVr2.index_green__2lFgU").click()
}
// 键盘L
if (event.keyCode == 76) {
// console.log("l按下")
$(".StudyPage_nextBtn__1ygGn").click()
}
// 键盘回车 拼写模式下点击查看正确答案,继续
if (event.keyCode == 13) {
// console.log("enter弹起")
// console.log($(".index_tenseAnswer__2o47S").length)
if ($(".index_tenseAnswer__2o47S").length != 0) {
$(".index_tenseAnswer__2o47S").click()
} else {
$(".index_continueBtn__34NqT").click()
}
}
});
// 显示托盘==============================================
const html =
``
var node = document.createElement('div');
node.innerHTML = html;
document.body.appendChild(node);
// 显示翻译托盘==============================================
const html2 =
`
翻译小助手
清空
搜索
uk /{{trans_result["uk-phonetic"]}}/
us /{{trans_result["us-phonetic"]}}/
{{index+1}}、 {{items.slice(0,50)}}
{{item}}
{{msg}}
`
var node = document.createElement('div');
node.innerHTML = html2;
document.body.appendChild(node);
let vapp = new Vue({
el: "#app",
data() {
return {
trans_result: [],
msg: '',
textarea: '',
}
},
methods: {
palyAudio: function($event) {
// $(event.currentTarget).next()[0].play()
try {
event.currentTarget.nextElementSibling.load();
event.currentTarget.nextElementSibling.play();
// console.log(event.currentTarget.nextElementSibling)
} catch (e) {
//TODO handle the exception
}
},
// 取消多行文本框的回车
textareaKeydown() {
let e = window.event || arguments[0];
// console.log(e,e.keyCode)
if (e.key == 'Enter' || e.code == 'Enter' || e.keyCode == 13) {
e.returnValue = false;
vapp.search()
return false;
}
},
res_clear() {
// console.log("清除")
vapp.trans_result = ''
vapp.textarea = ""
vapp.msg = ""
},
truncate(q) {
var len = q.length;
if (len <= 20) return q;
return q.substring(0, 10) + len + q.substring(len - 10, len);
},
search() {
// 有道翻译
let query = vapp.textarea.trim() // 去除前后空格
// let appKey = '1c7773d325ec6c09';
// let key = '0J9Aurlycl0JEUO5iQ4esUhh7qUNHfe0';//注意:暴露appSecret,有被盗用造成损失的风险
let salt = (new Date).getTime();
let curtime = Math.round(new Date().getTime() / 1000);
let from = 'auto';
let to = 'auto';
let str1 = appKey + vapp.truncate(query) + salt + curtime + key;
let vocabId = '您的用户词表ID';
let sign = CryptoJS.SHA256(str1).toString(CryptoJS.enc.Hex);
let data3 =
"q=" + query +
"&appKey=" + appKey +
"&salt=" + salt +
"&from=" + from +
"&to=" + to +
"&sign=" + sign +
"&signType=" + "v3" +
"&curtime=" + curtime
if (vapp.textarea.trim() != '') {
vapp.msg = ''
GM_xmlhttpRequest({
url: "https://openapi.youdao.com/api",
method: "post",
headers: {
'Content-type': 'application/x-www-form-urlencoded',
'Accept': 'application/json, text/plain, */*',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4484.7 Safari/537.36"
},
dataType: 'jsonp',
// data:data2,
data: data3,
// data:JSON.stringify(data3),
onload: function(data) {
if ($.parseJSON((data.response)).basic.explains != undefined) {
vapp.trans_result = $.parseJSON((data.response)).basic
} else {
vapp.trans_result = ''
vapp.msg = $.parseJSON((data.response)).translation
}
}
});
} else {
vapp.trans_result = ''
vapp.textarea = ''
vapp.msg = "翻译内容不能为空!"
setTimeout(() => {
vapp.msg = ""
}, 1500)
}
}
}
})
$(".onea").click(() => {
$('#showorhide').toggle("slow")
})
$("#open").click(() => {
enterFullScreen()
})
$("#close").click(() => {
exitFullScreen()
})
$("#change").click(() => {
changeTheme()
})
// $("#oneinput").attr("checked", GM_getValue('check'));
// $("#oneinput").click(() => {
// GM_setValue('check', $("#oneinput").is(':checked'));
// })
$("#twoinput").attr("checked", GM_getValue('check2'));
$("#twoinput").click(() => {
GM_setValue('check2', $("#twoinput").is(':checked'));
})
$("#threeinput").attr("checked", GM_getValue('check3'));
$("#threeinput").click(() => {
GM_setValue('check3', $("#threeinput").is(':checked'));
})
$("#fourinput").attr("checked", GM_getValue('check4'));
$("#fourinput").click(() => {
GM_setValue('check4', $("#fourinput").is(':checked'));
})
// selectksl
$(`input[name='selectksl'][value=${GM_getValue('check5')}]`).attr("checked", true);
$("input[name='selectksl']").click((params) => {
// console.log($("input[name='selectksl']:checked").val())
GM_setValue('check5', $("input[name='selectksl']:checked").val());
})
// ==========================================================
// 主题切换==================================================================================================
let theme = "light";
/**
* 添加暗色主题
*/
function addDarkTheme() {
const style = document.createElement("style");
style.id = "theme-css-dark"; // 加上id方便后面好查找到进行删除
style.innerHTML =
` html{filter: invert(100%) hue-rotate(180deg);scrollbar-width: none;} ::-webkit-scrollbar{display:none} img,video {filter: invert(100%) hue-rotate(180deg);}`;
document.querySelector("head").appendChild(style);
}
/**
* 移除暗色主题
*/
function removeDarkTheme() {
document.querySelector("#theme-css-dark").remove();
}
/**
* 切换主题
*/
const changeTheme = () => {
if (theme === "light") {
addDarkTheme();
theme = "dark";
} else {
removeDarkTheme();
theme = "light";
}
};
// ==============================================================================
// 两个定时器============================================
var t = setInterval(() => {
//index_button__9uno8
if ($(".index_button__9uno8 > span").html() == '开始学习' || $(".index_button__9uno8 > span").html() ==
'继续学习') {
clearInterval(t)
$(".index_button__9uno8").click(() => {
enterFullScreen()
})
}
}, 800)
var t3 = setInterval(() => {
if ($(".StudyDone_checkinBtn__3DuXc").html() == '打卡') {
clearInterval(t3)
$(".StudyDone_checkinBtn__3DuXc").click(() => {
exitFullScreen()
})
}
}, 1000)
// 展开共享笔记函数
function show_note(tip) {
if (tip != undefined && tip.indexOf("展开") > -1) {
// console.log("123")
$(".index_unfold__3BwCB > span").click()
return
} else {
tip = $(".index_unfold__3BwCB > span").html()
// setTimeout(()=>{
show_note(tip)
// },100)
}
}
// 用于实时监听DOM================================
function addBr() {
let mutationObserver = new MutationObserver(function(mutations) {
// console.log(mutations);
// mutations.forEach(function(mutation) {
// $(".index_icon__1IK2K").after("数字键6发音
")
// $(".index_audio__1mSVg:first").after("数字键7发音
")
// $(".index_trump__3bTaM:first").after("数字键4:UK发音
")
// $(".Pronounce_audio__3xdMh:first").after("数字键4:UK发音
")
// $(".index_trump__3bTaM:last").after("数字键3:US发音
")
// $(".Pronounce_audio__3xdMh:last").after("数字键3:US发音
")
font_size = util.getValue('current_val')
$(".index_exampleEN__3OIEA,.index_sentenceEn__1Qjgx").after(
"")
// 隐藏例句中的中文
if (GM_getValue('check2')) {
$(".btn.btn-primary.btn-xs").next().hide()
}
$(".btn.btn-primary.btn-xs").click((event) => {
var $target = $(event.target);
$target.next().toggle()
})
//
// if(GM_getValue('check')){
$(".CollinsTrans_paraphraseList__3SZ3y > li > span:nth-child(3),.StudySummaryItem_content__3j9YG > div > div >span:nth-child(3)")
.after(
"  "
)
// }
$(".btn.btn-link.btn-xs").click((event) => {
// 取消冒泡事件
if (event.stopPropagation()) {
event.stopPropagation()
} else {
event.cancelBubble = true // 兼容ie浏览器
}
var $target = $(event.target);
if (GM_getValue('check5') == 1) {
$target.prev().prev().toggle()
} else if (GM_getValue('check5') == 2) {
$target.prev().toggle()
}
})
$(
".BayTrans_paraphrase__2JMIz > p"
).css({
"font-size": `inherit`,
})
// 加粗解释
fond_size(font_size)
// $(".CollinsTrans_senseEn__17oYf").after("
")
// $(".CollinsTrans_senseEn__17oYf").hide()
// $(".CollinsTrans_paraphraseList__3SZ3y > li > span:nth-child(3)").after($(".CollinsTrans_senseEn__17oYf").html())
// 隐藏柯林斯词典中的英文
// if (GM_getValue('check')) {
// $(".CollinsTrans_senseEn__17oYf").hide()
// }
// 隐藏柯林斯词典中的英文,中文
let getDiv = $(".StudySummaryItem_content__3j9YG > div > div");
if (GM_getValue('check5') == 1) {
$(".CollinsTrans_senseEn__17oYf").hide()
$(".StudySummaryItem_content__3j9YG > div > div >span:nth-child(2)").hide()
} else if (GM_getValue('check5') == 2) {
$(".CollinsTrans_senseEn__17oYf").next().hide()
$(".StudySummaryItem_content__3j9YG > div > div >span:nth-child(3)").hide()
}
// 柯林斯词典例句自动发音
if (GM_getValue('check3')) {
var msg2 = $(".index_tab__37Cha.index_active__1bHoy").html()
if (msg2 == $(".index_tabNavs__3tWev:eq(0) > p:eq(1)").html()) {
flag2 = true;
} else {
flag2 = false;
}
if (flag2) {
$(".index_audio__1mSVg:first > img").click()
}
}
// 如果智慧词根过期提示,直接关闭
$(".AppletTip_close__2lEIB").click()
// 展开笔记
function listenOne(tip) {
let mutationObserver = new MutationObserver(function(mutations) {
show_note(tip)
});
mutationObserver.observe($('.span12.block-center > div > div:last > div:last').get(0), {
childList: true
// subtree: true
});
}
if (GM_getValue('check4')) {
tip = $(".index_unfold__3BwCB > span").html()
try {
listenOne(tip)
} catch (e) {}
}
// });
});
// mutationObserver.observe($('.span12.block-center').get(0), {
mutationObserver.observe($('.StudyPage_studyPage__1Ri5C > div').get(0), {
childList: true
// subtree: true
});
// mutationObserver.disconnect()
}
try {
listenOne()
} catch (e) {
//TODO handle the exception
}
// 用于实时监听DOM,用这个监听器,去调用另一个监听器
function listenOne() {
let mutationObserver = new MutationObserver(function(mutations) {
// console.log(mutations);
// mutations.forEach(function(mutation) {
// clearInterval(show_note_time)
// 另一个监听器
try {
addBr()
} catch (e) {
//TODO handle the exception
}
// $(".index_trump__3bTaM:first").after("数字键4:UK发音
")
// $(".index_trump__3bTaM:last").after("数字键3:US发音
")
// clearInterval(show_note_time)
// });
});
mutationObserver.observe($('.Layout_main__2_zw8').get(0), {
childList: true
// subtree: true
});
}
function _click_hide_show(event) {
var $target = $(event.target);
// console.log($target)
}
update()
// upate
function update() {
GM_xmlhttpRequest({
url: updateURL,
method: "get",
headers: {
'Content-type': 'application/x-www-form-urlencoded',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4484.7 Safari/537.36'
},
onload: function(data) {
// console.log(data)
const newversion = $(data.response).find('.install-link').attr("data-script-version");
// console.log(data.status)
if (data.status == 200) {
if (version != newversion) {
Swal.fire({
icon: 'info',
title: '检测到新版本',
allowOutsideClick: false,
allowEscapeKey: false,
html: `当前《${scriptname}》不是最新版本
当前版本:${version}
最新版本:${newversion}
更新日志请查看:更新日志与使用说明
`,
footer: "保持最新版本,更好的体验",
confirmButtonText: '更新'
}).then((result) => {
if (result.value) {
window.open("https://greasyfork.org/" + $(data.response).find(
'.install-link').attr("href"), "_self");
setTimeout(() => {
Swal.fire({
icon: 'success',
title: '提示',
allowOutsideClick: false,
allowEscapeKey: false,
html: "更新后,请点击刷新",
footer: "点击刷新,加载最新版本",
confirmButtonText: '刷新'
}).then((result) => {
if (result.value) {
// GM_openInTab("https://greasyfork.org/"+$(data.response).find('.install-link').attr("href"),{active: true});
window.location.reload();
}
});
}, 500)
}
});
}
} else {
console.log("网络错误,错误码:" + data.status)
}
},
});
}
})();