响应未从本机应用程序发送到 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 函数,我可以发送消息 但是我想等待 main 函数,然后只有我想要发送的结果。所以这个成功没有用

如果 --> 从 main 函数调用或在 main 的 promise 返回后调用,则 sendMessage 不会发送消息,如代码所示

我检查了 chrome 日志。它不会打印任何错误

我做错了什么?如果从任何其他函数调用,我无法弄清楚为什么 sendMessage 会失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)