chrome浏览器插件启动本地应用程序

2014-04-20 00:04:30|  分类: 浏览器插件|举报|字号 订阅

 
 
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浏览器插件启动本地应用程序的更多相关文章

  1. 使用JS启动本地应用程序、屏幕键盘

    问题描述:     现在希望在Web端使用JS调用本地应用程序 问题解决:   (1)使用JS启动本地应用程序 使用上述代码重点是创建了一个ActiveXObject的对象     参考说明:     ...

  2. 使用 Chrome 浏览器插件 Web Scraper 10分钟轻松实现网页数据的爬取

    web scraper 下载:Web-Scraper_v0.2.0.10 使用 Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬 ...

  3. 还在为百度网盘下载速度太慢烦恼?chrome浏览器插件帮你解决!

    百度网盘已然成为分享型网盘中一家独大的“大佬”了.时代就是这样不管你喜不喜欢,上网总会遇到些百度网盘共享的文件需要下载.然而,百度网盘对免费用户的限速已经到了“感人”的地步了,常常十多KB/秒的速度真 ...

  4. 用Javascript编写Chrome浏览器插件

    原文:http://homepage.yesky.com/62/11206062.shtml 用Javascript编写Chrome浏览器插件 2010-04-12 07:30 来源:天极网软件频道 ...

  5. 通过Web启动本地应用程序

    通过自定义协议在Web中启动本地应用程序 实例是打开本地安装的Word程序   注册自己的协议Windows Registry Editor Version 5.00 [HKEY_CLASSES_RO ...

  6. Selenium Chrome浏览器的启动以及proxy设置

    Selenium Chrome浏览器的启动以及proxy设置   虽然WebDriver对Firefox的支持最好,之前写的脚本也都在Firefox浏览器运行,但最近项目做了整合,发现新整合的功能不太 ...

  7. Rest Client(Rest接口调试工具,有保存功配置功能) chrome浏览器插件

    Rest Client(Rest接口调试工具,有保存功配置功能) chrome浏览器插件 下载地址 插件的操作很简单,下面是一些简单的实例. 1.安装 在谷歌应用商城搜索postman,如下图1-1所 ...

  8. chrome浏览器插件window resizer调试webapp页面大小

    chrome浏览器插件window resizer可以调整当前浏览器分辨率大小 可以自定义大小,以适合于andorid和iphone设备

  9. chrome浏览器插件开发经验(一)

    最近在进行chrome浏览器插件的开发,一些小的经验总结随笔. 1.首先,推荐360的chrome插件开发文档:http://open.chrome.360.cn/extension_dev/over ...

随机推荐

  1. CoreAnimation-03-隐式动画

    简介 每个UI控件,默认自动创建一个图层(根图层),即每个UI控件对应于至少一个图层 可以手动创建图层,这些图层为非根图层 对非根图层的某些属性(标记为Animatable的属性)进行修改,默认会自动 ...

  2. java 之 对象与垃圾回收

    1.垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(如数据库连接,网络IO等资源) 2.程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行.当对象永久的失去引用后,系统会在合适的时 ...

  3. nim3取石子游戏 (威佐夫博弈)

    http://www.cnblogs.com/jackge/archive/2013/04/22/3034968.html 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有 ...

  4. Spring-2-J Goblin Wars(SPOJ AMR11J)解题报告及测试数据

    Goblin Wars Time Limit:432MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Th ...

  5. IE8下解决position:flxed无效的问题

    只需将文档类型声明改成如下方式即可 <!DOCTYPE html>

  6. 问题解决——OpenGL超级宝典 关于gltDrawTorus的错误解决

    看OpenGL超级宝典的时候,遇到一个函数 “gltDrawTorus”,在TRANSFORM和SPHEREWORLD中都有用到.但是一开始在自己写示例代码里时却没法使用,而在作者的代码目录结构下却可 ...

  7. ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  8. Xamarin.Android splash页面瞬间响应_避免APP启动闪白屏

    Application和Activity中的onCreate都进行了优化,基本没有耗时操作,但是启动应用之后还是会闪现一下白色背景,然后才进入Splash页面,对比了一下QQ.微信.微博等客户端,点击 ...

  9. zookeeper适用场景:分布式锁实现

    问题导读:1.zookeeper如何实现分布式锁?2.什么是羊群效应?3.zookeeper如何释放锁? 在zookeeper应用场景有关于分布式集群配置文件同步问题的描述,设想一下如果有100台机器 ...

  10. Mango Weekly Training Round #3 解题报告

    A. Codeforces 92A Chips 签到题.. #include <iostream> #include <cstdio> #include <cstring ...