A Python package for interfacing with Native Messaging in WebExtensions
Based on Native Messaging on MDN and native-messaging on mdn/webextension-examples (MPL 2.0 License)
pip3 install nativemessaging
nativemessaging.get_message()
will poll for a message from the browser.
If runtime.connectNative
is used, get_message()
must be called repeatedly in a loop to poll for messages.
If runtime.sendNativeMessage
is used, get_message()
only needs to be called once.
nativemessaging.encode_message()
takes one argument, a message to be encoded.
Returns an encoded version of a message to be returned to the browser. Use with send_message()
.
nativemessaging.send_message()
takes one argument, an encoded message from encode_message()
. Returns a message to the browser.
Browser side:
function onReceived(response) {
console.log(response);
}
// runtime.connectNative
var port = browser.runtime.connectNative("application_name");
port.onMessage.addListener(onReceived);
port.postMessage("hello");
// runtime.sendNativeMessage
browser.runtime.sendNativeMessage("application_name", "hello").then(onReceived);
App side:
import nativemessaging
while True:
message = nativemessaging.get_message()
if message == "hello":
nativemessaging.send_message(nativemessaging.encode_message("world"))
nativemessaging-install
is a command line script provided with the package.
nativemessaging-install browser [--manifest manifest]
browser
- positional argument, 1 or more parameters. Must bechrome
orfirefox
.--manifest
- a path to a manifest file to use for installing.
A native-manifest.json
file is expected in the current working directory when running the script, unless --manifest
is passsed.
The format must be similar to the native manifest format for Chrome or Firefox, with two main differences:
path
must be a relative path to the native app in relation to your current working directory.- Both
allowed_extensions
andallowed_origins
must be in the manifest to work with both Chrome and Firefox.
{
"name": "application_name",
"description": "description",
"path": "application_name.py",
"type": "stdio",
"allowed_extensions": ["extension@id"],
"allowed_origins": ["chrome-extension://extension-id"]
}
On Windows, it will create <application_name>_firefox.json
and <application_name>_chrome.json
in the same directory as <path>
.
A batch file will also be created for python apps on Windows.
A registry key is created at HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\<application_name>
or HKEY_CURRENT_USER\Software\Mozilla\NativeMessagingHosts\<application_name>
On linux, it will create ~/.config/google-chrome/NativeMessagingHosts/<application_name>.json
or ~/.mozilla/native-messaging-hosts/<application_name>.json
On mac, it will create ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/<application_name>.json
or ~/Library/Application Support/Mozilla/NativeMessagingHosts/<application_name>.json