Native Message记录

需求

最近在开发一个小插件,需要实现在Chrome插件中钓鱼python脚本的功能。
查了一下发现使用Native Message来实现。

流程

https://developer.chrome.com/extensions/nativeMessaging
看官方文档,以及官方的例子其实就可以很清楚了。

大概意思就是在本地注册一个服务,然后插件去调用服务。也就是说我按照要求写好配置文件,插件调用配置文件里说好的python脚本就可以了。

问题记录

那我遇到了什么样的问题呢?

最开始遇到的问题在官方文档里也有给出:Failed to start native messaging host.,就是问没有执行权限。然后我给脚本加上执行权限之后,就ok了。

问题变成了:Native host has exited. 然后一天多的时间就一直是这个问题…我尝试了好多,google搜了好多,搞不清楚。

把官方例子里的代码抄抄改改,也还是不行,反正就始终提示这个问题。

然后我又搜到python是有一个这样的库的,就叫nativemessaging(https://pypi.org/project/nativemessaging/),直接pip install就可以安装…

但是!也不知道怎么回事,这个会报错,直接运行下面代码,

import nativemessaging

while True:
	message = nativemessaging.get_message()
	nativemessaging.send_message(nativemessaging.encode_message("world"))

会报raw_length = sys.stdin.buffer.read(4) AttributeError: 'file' object has no attribute 'buffer' 错(好像是这个来着)。我感觉像是这个库有点老了?但明明是前几个月才刚更新过…本来以为是因为直接运行脚本,没有输入才会报错,但是当我从命令行启动chrome之后,发现仍然有这样的报错信息,就觉得大概真的是不能用吧…
Native Message记录_第1张图片

还是老老实实从官方例子下手吧。

(⊙o⊙)…刚开始也还是一直都不行…官方例子里是开启了一个线程…我把线程去掉之后,就可以了

可以工作的代码是这样:

//background.js
chrome.runtime.sendNativeMessage(
            'com.my_company.my_application',
            { text: "Hello" },
            function(response) {//收到返回消息后的处理函数
                console.log(JSON.stringify(response))
        });

//因为我是想发送一次连一次的,所以没有建立端口。试过建立端口也是可以正常工作的,代码也给出来了

//port
connect();
sendNativeMessage();
function connect() {
    var hostName = "com.my_company.my_application";
    port = chrome.runtime.connectNative(hostName);
    port.onMessage.addListener(onNativeMessage);
    port.onDisconnect.addListener(onDisconnected);
  }

function sendNativeMessage() {
    message = {"text": "a"};
    port.postMessage(message);
}
function onNativeMessage(message) {
    console.log(JSON.stringify(message))
}
function onDisconnected() {
    port = null;
    console.log(chrome.runtime.lastError.message);
}


//python
#!/usr/bin/env python
import sys
import struct
import threading

def send_message(message):
    # Write message size.
    sys.stdout.write(struct.pack('I', len(message)))
    # Write the message itself.
    sys.stdout.write(message)
    sys.stdout.flush()

# Thread that reads messages from the webapp.
def read_thread_func():
    message_number = 0
    #while 1:去掉了循环,之前看nativemessaging库说是不建立连接时只需要执行一次就可以了,大概是调用一次执行一次的感觉
    # Read the message length (first 4 bytes).
    text_length_bytes = sys.stdin.read(4)
    if len(text_length_bytes) == 0:
        # sys.exit(0)
        #continue
        sys.exit(0)
    # Unpack message length as 4 byte integer.
    text_length = struct.unpack('i', text_length_bytes)[0]
    # Read the text (JSON object) of the message.
    text = sys.stdin.read(text_length).decode('utf-8')
    # In headless mode just send an echo message back.
    send_message('{"echo": %s}' % text)

def Main():
    read_thread_func()


if __name__ == '__main__':
  Main()
 

找了一天多,莫名其妙就好了…(⊙o⊙)…不知道我之前试错时候到底都试到了哪些情况。

另外,debug信息真的很重要,之前没有用命令行开chrome,一些信息看不到,F12只能看到Native host has exited. 不是最本质的,导致调试会受阻碍。

好了,我终于可以接着实现功能了。

你可能感兴趣的:(水滴石穿)