天天看點

chrome浏覽器插件啟動本地應用程式

chrome浏覽器插件啟動本地應用程式  

2014-04-20 00:04:30|  分類: 浏覽器插件|舉報|字号 訂閱

  下載下傳LOFTER我的照片書  |

chrome的插件開發這裡就不多講了,本篇文章隻講如何調用谷歌浏覽器的api啟動本地的程式并與之通信

要啟動本地的應用插件需要包括兩部分的内容:

1)安裝到浏覽器的插件部分

2)放置在本地的json檔案

第一部分就跟普通的谷歌浏覽器插件是一樣的,包括兩個必須的檔案:

1)background.js(名字不一定為background.........取你自己喜歡的也行)

2)manifest.json(這個名字就是固定的了.............取你自己喜歡的不行)

在谷歌浏覽器中輸入chrome://extensions/->勾選開發者模式->加載正在開發的擴充程式->選擇你的擴充程式所在的檔案夾(就是那個js檔案和manifest.json所在檔案夾)

現在,你的擴充程式已經加載到你的浏覽器當中了

我們再看看manifest.json的内容:

{

"name" : "FastDownload",

"version" : "1.0.1",

"description" : "Get file download link fo Point",

"background" : { "scripts": ["background.js"] },

"permissions" : [

"nativeMessaging",

"contextMenus",

"downloads",

"tabs",

"http://*/*",

"https://*/*"

],

"minimum_chrome_version" : "6.0.0.0",

"manifest_version": 2

}

主要的是permissions那一項,因為,添加了"nativeMessaging"這一項是更本地應用程式通信的權限(新版的chrome建議使用這種方式),這樣就可以跟本地的應用程式通信了

background的scripts就是剛才講的那個script了

我們再看看這個background.js的内容:

//Author: match.yangwanqing

//Date: 2014.3.12

//Description: This is a javaScript file use for handle contextMenus action

//When click the contextMenus, it will sent the infomation to native app

//connect to native app

var port = null;

var nativeHostName = "fastdownload";//這個後面會講,是chrome與本地程式通信的橋梁

var downloadID = null;

function getDownloadID(URL)

{

/*chrome.downloads.download({"url": URL},

function(tmpDownloadID)

{

downloadID = tmpDownloadID;

});*/

//chrome.downloads.cancel({"downloadid": downloadID});

chrome.downloads.search({"url": URL},

function(tmpID)

{

alert(tmpID[0].id +

"#" + tmpID[0].totalBytes +

"#" + tmpID[0].mime);

});

}

//onNativeDisconnect

function onDisconnected()

{

//alert("連接配接到FastDownload服務失敗: " + chrome.runtime.lastError.message);

port = null;

}

//connect to native host and get the communicatetion port

function connectToNativeHost()

{

port = chrome.runtime.connectNative(nativeHostName);//根據配置檔案連接配接到本地程式

port.onDisconnect.addListener(onDisconnected);

}

//調用connectToNativeHost函數連接配接到本地程式,完成後使用port.postMessage函數即可

//将資訊寫入I/O流與本地程式通信

function getClickHandler() {

return function(info, tab) {

connectToNativeHost();

//getDownloadID(info.linkUrl);

port.postMessage(info.linkUrl);

};

};

//在浏覽器啟動時即建立右鍵菜單,當點選使用Point下載下傳的時候就會調用getClickHandler()函數處理

//資訊并與本地程式通信

chrome.contextMenus.create({

"title" : "使用Point下載下傳",

"type" : "normal",

"id": "FastDownloadMenu",

"contexts" : ["link"],

//"targetUrlPatterns":["*://*/*.*"],

"enabled": true,

"onclick" : getClickHandler()

});

上面說的這麼神秘的配置檔案就是最開始說到的第二部分:

fastdownload.json

我使用的測試環境是opensuse,ubuntu還有linuxdeepin,都是linux作業系統

我們需要建立一個路徑

/etc/opt/chrome/native-messaging-hosts/

然後将fastdownload.json拷貝到該路徑下,我們的插件在權限中加入"nativeMessaging"權限後就會到這個路徑查找相應的配置檔案,拷貝完成後記得保證該檔案可以讓其他人有讀的權限,不然插件就會報找不到制定host的錯誤,因為它沒有權限讀取配置檔案

注意該檔案的名字中不能使用大寫字母,隻能使用小寫字母加上"."這些符号進行命名

我們看一下這個配置檔案(配置檔案的叫法并不準确,暫且這麼叫吧,大家了解就好,具體看官方說明)的内容:

{

"name": "fastdownload",

"description": "Chrome sent download url to native app.",

"path": "/home/yang/QtWork…wnloadPopup/build/home/yang/QtWork…wnloadPopup/build/FastDownloadPopup",

"type": "stdio",

"allowed_origins": [

"chrome-extension://iebejdppbfamhgbnpoacblnlhpllanfbs/"

]

}

其中,name的内容就是剛才backgroound.js中的那個nativeHostName變量的值

"description",随便你寫,關于這個檔案的描述

path,這個是重點,就是你的可執行檔案所在的路徑,一定要絕對路經(windows的好像不用,沒試過),一定要確定權限可讀,不然你還是沒法啟動該程式并與之通信

type就是資料的通信方式,目前隻能是通過I/O流的方式,是以值隻能是“stdio”

allowed_origins,這個就是允許誰通路啦,我們這裡隻允許ID為iebejdppbfamhgbnpoacblnlhpllanfbs的插件通路

注意,插件的ID會在你改變了存放路徑等一些資訊後有所改變,是以一定要確定配置檔案所寫的ID跟你的擴充插件的ID是相同的,至此,整個插件的内容就算完成了,在谷歌浏覽器中右鍵看看效果吧!

下面給出c++中接受資料的代碼:

unsigned int length = 0;

//read the first four bytes (=> Length)      
//getwchar: receive char from stdin      
//putwchar: write char to stdout      
for (int i = 0; i < 4; i++)      
{      
length += getwchar();      
}      
//read the json-message      
fileURL = "";      
for (int i = 0; i < length; i++)      
{      
fileURL += getwchar();      
}      
//浏覽器端傳來的資料會有一個雙引号引在兩端      
fileURL = fileURL.mid(1,fileURL.length()-2);      

這段代碼可以放在main函數中也可以放在其他函數中,發揮你的想象吧!當然讀取的方式不止這一種,具體需求因人而異

(原創作品,歡迎轉載,轉載請注明出處,請尊重作者的勞動成果 I Match)

chrome浏覽器插件啟動本地應用程式