javascript - 响应未从本机应用程序发送到 chome 扩展 - Javascript
问题描述
我正在尝试开发 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 函数,我可以发送消息但我想等待主函数,然后只有我想要发送的结果。所以这个成功没有用
如果 --> 从主函数调用或在主函数的承诺返回后调用,sendMessage 不发送消息,如代码所示
我检查了铬日志。它不会打印任何错误。
我究竟做错了什么?如果从任何其他函数调用,我无法弄清楚为什么 sendMessage 会失败。
解决方案
推荐阅读
- spring-boot - 从Angular 8中的后端获取字符串值
- gtk - 如何在 gtkmm DrawingArea 中绘制 poppler 文档
- javascript - 需要帮助修改一个JS代码来实现想要的输出
- python - 如何使用 Pandas 根据另一列值累积添加或减去值?
- ios - 为什么找不到构建输入文件?即使该文件存在于项目目录中?
- c++ - C++ 链接器未定义对函数的引用找不到我的错误
- javascript - CSS 不会与 HTML 和 Node 一起出现
- javascript - 为什么我的图像没有按预期渲染或翻译?
- pycharm - 从 PyCharm 中的 HTML 覆盖导出中排除 venv
- python - 了解一流的功能