问题描述
我正在尝试开发 chrome 扩展来解决 svg 验证码问题。扩展将图像(作为 base64 数据)发送到本机应用程序。本机应用程序执行 OCR 并发回验证码字符串。 我能够从 chrome 扩展程序获取图像数据到本机应用程序。但无法将结果发送到扩展。
背景.js
img = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCABQAFADAREAAhEBAxEB/8QAGgABAAMBAQEAAAAAAAAAAAAAAAcICQoFBP/EACcQAAEEAwEBAAIBBAMAAAAAAAUCAwQGAAEHCAkREhUUISIjChMW/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AO/jAYDAYDAYDAYDAYDAYDAYDAYDAYDAYDAYDAYDAjbmnZuP9pgWApxzq3NusjKlaC9HtRHml6q97gVm6191LJ6n2cxvihWOGtAR5aGi9fIuRiw11SW5kRlata2Ek4DAYDAYDAYDAjvqZGdEp8wWHlf0dht8mJS69JSr9XoZOyu/x6yzCdf5OKro1ZCyutJ/yVGDv/jevx+dbnx6puNj8qdV8jdx5eeGwPO03qNT8l+rapDjgZoxipwhktSeFXN4o4KnmAZHk3Xy42sFGhxgGzJCXmc1ZtT0gxMaMGpeAwGAwGAwGAwKoeiux1TigHpve+gzmRvM/LPH7p1KyTZT7ceK7YHAJCQ0yh15SG0ThdUHEoaErWjTm77BSle1fslIc8/wdD9w9qfOT0VI9hl55Cj/AEe7F6g6tySLNiOslaBGLGocUk4KLKcTtz82tEi8c7kR4I92AuokCkVx1K4jiA6JfG3ULD1Xz5SSF72231Wk/wApyXs0NCVN/wBH13lZKRSL6pltmkuIhGDQd2yBXFJTqYANCp7WtsS2t7C0WAwGAwGAwPnlymYUZ+W/vaWY7S3V/rr9l70jW9/o2Jx91uL3+ENtp/KnHFJQnW1K1rYYFfWL6Z8y8lneVeKHPDk36Vdy9gDblatnkwIyDORiNTAssSmZ9yrJ6idNHHBLzonQ0ZBnVx1Gh9SmF0IcSOS1sKVcu+uH0L5y1yKiCv8Ai++heRcirUwRErQzmvSpM0DyGqPyJIiqrpfK6z5KCBq9ODgiJtUKqwt1CSQiSpA9EmBCMOSlhuZVjw3knqSJbBSpDXEveAsMaHS5MVwfHq/pul1JmKmAViy0syhU/sPJgUKNqDNZiuQrfyKYMlN/ztnajrDQbAYDAYDAYGVHvb63eQfBr8SvdbO3a09SKxS7/L+H8z5p0G8Xbr9uBxFSUAK5Jr9ZIVtmOJnqhRTBQkYjwgxmXBZnLamxkQ5QUg+L3iXulr6n2L7B/QKuLD+yvXUfUPl/MC0SS2/5f83fhn/ynPokUlvc0PYTYqOOWbiuR4M2EOjsMEY7RcqeZ0HRtgUT9dAoNP4x16ac551HpfK5cVPQpAvhooEb7HyW9gi0ayK6hzgAaPAHD7wE3DidJiC63spb4ltEFpAmv23Vl0HHBHHzB+mPnr6R8dM2LkHUQd/vHKC7dI61Gg12zUab/Nssa2PuDNFuw8VagIG5Rm1zosWZEkRhJhk3Wo5cykIktODTPAYDAYDA8WLW67BNE7JCABYdiNNRGDJ6KKgxzRZmA1/0QWSZRphE6e1CZ/0xG5T7qIzX+tnSEf2wPawGAwKbCPn75AqHbU+kuX8NpXFO8PKnJodo4mLj8sNXiKVWlZcf04ZT2xlX6tCJ7Slx1rpIC1Lhzm4xgU6POQR5OIFycBgMBgMBgMBgMBgMBgMBgMBgMBgMBgMBgf/Z"
var port = chrome.runtime.connectNative('com.solve.captcha')
port.onMessage.addListener((req) => {
if (chrome.runtime.lastError) {
console.log(chrome.runtime.lastError.message)
}
handleMessage(req)
return true;
})
port.ondisconnect.addListener(() => {
if (chrome.runtime.lastError) {
console.log(chrome.runtime.lastError.message)
}
console.log('disconnected')
})
port.postMessage({message: img})
function handleMessage (req) {
console.log(req)
}
“node ocr.js”是我从应用程序 json 运行的本机应用程序。
ocr.js
var Jimp = require('jimp'); //For image processing
var readline = require('readline');
var fs = require('fs');
const io = require('console-read-write');
const { execSync } = require('child_process');
const { EOL } = require('os');
var base64str = "" ;
var ocrResult = "" ;
async function readFromConsole() {
base64str = await io.read();
base64str = base64str.slice(4);
var base64str = JSON.parse(base64str.toString()) ;
base64str = base64str.message;
return new Promise(resolve => {
resolve(base64str);
});
};
async function sendMessage (msg) {
var buffer = Buffer.from(JSON.stringify(msg)) ;
var header = Buffer.alloc(4);
header.writeUInt32LE(buffer.length,0);
var data = Buffer.concat([header,buffer]) ;
process.stdout.write(data);
}
function imagetoText(file,callback) {
Jimp.read(file).then(image => {
image.write('./darknet64/temp.jpg',function () {
let result = execSync('run_darknet.bat',{stdio: [process.stderr]}); // supress output of .bat so it doesnt write to console. and doesnt sent to extension
let resultString = result.toString('utf8');
var lines = resultString.split(EOL);
var valdResA = [];
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
if (line.indexOf(":") !== -1 && line.indexOf("%") !== -1) {
valdResA.push({ c: line.split(":")[0],p: line.split(": ")[1].replace("%","") })
}
}
while (valdResA.length > 5) { //Remove letters with lowest props
var sma = 100; //Smallest confidence
var index = 0; //Index of char with smallest confidence
for (var i = 0; i < valdResA.length; i++) {
if (sma > valdResA[i]["p"]) {
sma = valdResA[i]["p"];
index = i;
}
}
valdResA.splice(index,1);
}
var textf = "";
var confidence = 0;
for (var i = 0; i < valdResA.length; i++) {
textf += valdResA[i]["c"];
confidence += parseFloat(valdResA[i]["p"]);
}
confidence = Math.round(confidence / 5);
callback({ textf: textf,confidence: confidence });
});
}).catch(err => {
console.log(err);
});
}
function writeContent (content) {
ocrResult = content["textf"];
}
function delay(n) {
n = n || 2000;
return new Promise(done => {
setTimeout(() => {
done();
},n);
});
}
async function main() {
base64str = await readFromConsole();
await delay(1000);
var inputPic = Buffer.from(base64str,'base64');
//var inputPic = 'input.gif';
imagetoText(inputPic,writeContent );
await delay(1000);
// sendMessage(ocrResult); // it doesn't send to extension. hence trying to return by promise below.
return new Promise(resolve => {
resolve(ocrResult);
});
}
main().then(function(ocrResult){
sendMessage(ocrResult); // still it doesnt sent any data. i check ocrResult variable is set properly.
})
ocrResult = "AS3H59";
sendMessage(ocrResult); // Here it sends data to extension but main function is not yet completed.
我没有编码背景,只是从互联网上学习 JavaScript。
如果 --> 最后在外部调用 sendMessage 函数,我可以发送消息 但是我想等待 main 函数,然后只有我想要发送的结果。所以这个成功没有用
如果 --> 从 main 函数调用或在 main 的 promise 返回后调用,则 sendMessage 不会发送消息,如代码所示
我检查了 chrome 日志。它不会打印任何错误。
我做错了什么?如果从任何其他函数调用,我无法弄清楚为什么 sendMessage 会失败。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)