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)
