首页 > 解决方案 > 响应未从本机应用程序发送到 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 会失败。

标签: javascriptgoogle-chrome-extensiongoogle-chrome-appchrome-native-messaging

解决方案


推荐阅读