Files
Fuck-ChaoXing/chaoxing_ocr.js
2022-05-12 11:04:47 +08:00

147 lines
6.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==UserScript==
// @name 学习通搜题小助手
// @description 学习通搜题小助手
// @version v1.0.0
// @license MIT
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant unsafeWindow
// @require https://unpkg.com/dom-to-image@2.6.0/dist/dom-to-image.min.js
// @match https://mooc1.chaoxing.com/work/doHomeWorkNew*
// @run-at document-end
// ==/UserScript==
// 生成页面内联函数
function geneFunction(ocrEnabled, encText) {
return 'var ocrEnabled = ' + ocrEnabled + ',' +
'encText = ' + encText + ';' +
// 获取图片 ID 存入数组,然后开始 OCR
`var quizImg=document.querySelectorAll('img[alt="chaoxing_nmsl"]');quizImg.forEach(function(e,t,n){encText[t].innerText="正在修复乱码问题以便后续搜题,请稍候..."});var imgList=[];setTimeout(function(){for(var e=document.querySelectorAll('img[alt="chaoxing_nmsl"]'),t=0;t<e.length;t++)imgList.push(t);if(0<imgList.length){var n=-1<window.navigator.userAgent.indexOf("Edge")?"false":"true";async function i(){for(var e in imgList){var{data:{text:t}}=await async function(e){return await Tesseract.recognize(e,"eng+chi_sim",{cacheMethod:n,langPath:"http://127.0.0.1:8000/lib"})}(document.querySelectorAll('img[alt="chaoxing_nmsl"]')[e].src);encText[e].innerText=t,encText[e].style.color="black",console.log(t)}}i()}},2e3);`;
// 未压缩代码
/*
// 遍历 img 标签,替换对应题目文字
var quizImg = document.querySelectorAll('img[alt="chaoxing_nmsl"]');
quizImg.forEach(function(item, index, arr) {
encText[index].innerText = '正在修复乱码问题以便后续搜题,请稍候...';
});
// 获取图片 ID 存入数组
var imgList = [];
// 启动 OCR
setTimeout(function() {
var imgTag = document.querySelectorAll('img[alt="chaoxing_nmsl"]');
for (var i = 0; i < imgTag.length; i++) {
imgList.push(i);
}
if (imgList.length > 0) {
var cacheEnabled = window.navigator.userAgent.indexOf("Edge") > -1 ?
'false' :
'true';
async function displayText() {
for (var img in imgList) {
const {
data: {
text
}
} = await recText(document.querySelectorAll('img[alt="chaoxing_nmsl"]')[img].src);
encText[img].innerText = text;
encText[img].style.color = 'black';
console.log(text);
}
}
async function recText(img) {
return await Tesseract.recognize(
img,
'eng+chi_sim', {
cacheMethod: cacheEnabled
});
}
displayText();
}
}, 2000);
*/
}
function prettyText() {
var _encText = document.getElementsByClassName('font-cxsecret');
if (_encText) {
// 透过正则纠正一部分字符串,提高题目匹配成功率
[].forEach.call(_encText, function(item, index, arr) {
// 移除空格和换行
arr[index].innerText = arr[index].innerText.replace(/[\r\n]/g, '').replace(/\ +/g, '');
// 半角符号转全角
arr[index].innerText = arr[index].innerText.replace(/\[/g, '【').replace(/\]/g, '】');
// 碰到两个相同方向双引号,则替换为「“”」
//arr[index].innerText = arr[index].innerText.replace(/(?<=“).*?(?=“)/, '“$2”');
// 句号误判为 o自动转句号
//arr[index].innerText = arr[index].innerText.replace(/(.{3}$)/g, arr[index].innerText.match(/(.{3}$)/g)[0].replace(/o/g, '。'));
// 显示最终结果
arr[index].innerText = arr[index].innerText;
});
}
return prettyText;
}
setInterval(function() {
prettyText()
}, 1000);
// 根据情况向 HTML 中灌入 JS
if (document.getElementsByClassName('font-cxsecret')[0]) {
console.log('在页面中检测到加密文本');
var encText = `document.getElementsByClassName('font-cxsecret');`;
var encArray = document.getElementsByClassName('font-cxsecret');
// 将 DOM 转换为 Base64 图片
[].forEach.call(encArray, function(item, index, arr) {
// 改大字体、加入空格便于识别
if (arr[index].className == 'font-cxsecret fl after') {
arr[index].style = 'line-height: 90px; font-size: 50px; color: black; letter-spacing: 5px;';
} else {
arr[index].style = 'line-height: 90px; font-size: 50px; letter-spacing: 5px;';
}
});
// 按顺序生成图像
var count = 0;
async function genImg() {
for (let num of encArray) {
const url = await convertImg(num);
var img = new Image();
img.src = url;
img.alt = 'chaoxing_nmsl';
img.style = 'display:none;';
img.id = count;
document.body.appendChild(img);
if (encArray[count].className == 'font-cxsecret fl after') {
encArray[count].style = 'padding-left:10px; color: red;';
encArray[count].innerText = '正在修复乱码问题,以便后续搜题,这可能需要一些时间...';
} else {
encArray[count].style = 'line-height: 35px; font-size: 14px; padding-right: 15px; color: red;';
encArray[count].innerText = '正在修复乱码问题,以便后续搜题,这可能需要一些时间...';
}
console.log('生成第 ' + count++ + ' 个用于 OCR 辨识的图像');
}
}
async function convertImg(num) {
return await domtoimage.toJpeg(num, {
quality: 1.0,
bgcolor: '#fff'
});
}
genImg();
// 为页面引入 Tesseract.js
setTimeout(function() {
var pageHead = document.getElementsByTagName('head')[0],
importOcr = document.createElement('script'),
extScript = document.createElement('script');
importOcr.src = 'https://unpkg.com/tesseract.js@2.1.5/dist/tesseract.min.js';
pageHead.appendChild(importOcr);
// 生成内联函数并执行 OCR 识别任务
extScript.innerText = geneFunction(true, encText);
pageHead.appendChild(extScript);
}, 1000);
} else {
console.log('没有检测到加密文本');
}