如何同步 chrome extension开发 的配置

文档在此:/trunk/extensions/webRequest.html
1,为了使用webRequest,首先需要在配置文件manifest.json中加入类似的内容:
&name": "My extension",
"permissions": {
"webRequest", "*://*."
这里的意思是说,只允许这个extension对*.的域名使用webRequest,如果这个字符串替换为其它格式的,比如*://*,就可以支持所有的网站访问了。
2,webRequest的核心意思就是要伪造各种request,那么就不单单是写某个对象的数据这么简单,还需要选择合适的时机,在发送某种request之前伪造好它,或者在真实的request到来之后半路截获它,替换成假的然后再发出去。Life cycle of request就是描述这个事情的。
其中,onBeforeSendHeaders这个回调比较有用,文档中如此描述&这个事件将允许extensions添加、修改或删除request headers。简单的用法如下:
chrome.webRequest.onBeforeRequest.addListener(
callback, filter, opt_extraInfoSpec);
a,callback被调用时将被赋予包含request信息的一个参数。
b,filter参数是一个object,有这些key可用:
& & URLs:类似这种格式的字符串:*://www.google.co/foo*bar
& & Types:像main_frame或sub_frame,image这样的类型
& & TabID:tab的标识符
& & WindowID:window的标识符
3,因为可能多个extension都要玩webRequest,所以需要一套冲突处理机制。如果设置了新的request,刷新页面后是否设置继续有效,设置了之后什么时候有效,这些都是关于cache的问题。另外就是使用timestamp属性的问题,凡从timestamp取得的属性值,相互之间可以比较,但是如果和new Date().getTime()这种方式取得的值比较就不一定对了,需要加以注意。
a,阻止所有发往的request
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {cancel: details.url.indexOf(":///") != -1};
{urls: ["&all_urls&"]},
["blocking"]);
另一种方法,使用filter:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {cancel: true}; },
{urls: ["*:///*"]},
["blocking"])
符合filter的都被cancel掉了。
b,从所有的request中删除User-Agent的header
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
for (var i = 0; i & details.requestHeaders. ++i) {
if (details.requestHeaders[i].name === 'User-Agent') {
details.requestHeaders.splice(i, 1);
return {requestHeaders: details.requestHeaders};
{urls: ["&all_urls&"]},
["blocking", "requestHeaders"]);
5,各种API文档
a,RequestFilter:
RequestFilter = {
tabId: interger, //optional
//URL的数组,或者是匹配URL的pattern
urls: array_of_string,
//可选的值有:"main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"
types: array_of_enumerated_string, //optional
windowId: integer //optional
// 设置了blocking关键字的就用这个object来作为block的规则了
BolockingResponse = {
//为true的话request被cancel,在onBeforeRequest里面用哦
cancel: boolean, //optional
//只在onBeforeRequest事件中使用,用来掉包的关键属性!!!
redirectUrl: string, //option
//只用在onHeadersReceived事件里,在浏览器返给server时把header给掉包
responseHeaders: HttpHeaders //optional
//只在onBeforeSendHeaders事件中使用。是另一个用来掉包的关键属性!!!
requestHeaders: HttpHeaders //optional
//只在onAuthRequred事件中使用,当然也是用来掉包的
authCredentials: object //optional
HttpHeaders:HTTP headers组成的数组,数组每个元素都有自己的键值对,就是object了。这个得实际打印出来才知道。
b,onBeforeSendHeaders,在TCP连接建立之后和HTTP数据发送之前被调用的事件。调用方法:
chrome.webRequest.onBeforeSendHeaders.addListener(function(object details) {...});
其中,传给callback的参数details结构如下:
details = {
tabId: integer, //如果没有和tab关联则返回-1
parentFrameId: integer,
url: string,
timeStamp: double,
//0表示request是在main frame里发生的
frameId: integer,
requestId: string,
requestHeaders: HttpHeaders, // optional
type: enumerated_string, //value in:
["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]
method: string //标准HTTP方法
其它事件大同小异,调用callback时传入的参数也都是details这个结构,只是某些字段会有不同的值。
6,总结:webRequest的API非常容易使用,基本上就是第四部分里三个例子的样式。当然, 要想更好地使用,还需要Http Request的一些基础知识,想伪造的话起码要知道应该伪造成什么样子才合适。
转:.cn//00080.html
阅读(...) 评论() &<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&原文:.cn/article/75729
名称描述最低版本
使用&chrome.alarms&API 安排代码周期性地或者在将来的指定时间运行。
使用&chrome.bookmarks&API 创建、组织以及通过其他方式操纵书签。您也可以参见替代页面,通过它您可以创建一个自定义的书签管理器页面。
browserAction
使用浏览器按钮可以在 Google Chrome 浏览器主窗口中地址栏右侧的工具栏中添加图标。除了弹出内容。
browsingData
使用&chrome.browsingData&API 从用户的本地配置文件删除浏览数据。
使用命令 API 添加快捷键,触发您的扩展程序中的操作,例如打开浏览器按钮或向扩展程序发送命令。
contentSettings
使用&chrome.contentSettings&API 更改设置,控制网站能否使用 Cookie、JavaScript 和插件之类的特性。大体上说,内容设置允许您针对不同的站点(而不是全局地)自定义 Chrome 浏览器的行为。
contextMenus
使用&chrome.contextMenus&API 向 Google Chrome 浏览器的右键菜单添加项目。您可以选择您在右键菜单中添加的项目应用于哪些类型的对象,例如图片、超链接和页面。
使用&chrome.cookies&API 查询和修改 Cookie,并在 Cookie 更改时得到通知。
chrome.debugger&API 是 Chrome 远程调试协议(英文)的另一种消息传输方式。使用chrome.debugger&可以附加到一个或多个标签页,以便查看网络交互、调试 JavaScript、改变 DOM 和 CSS 等等。使用调试对象的标签页标识符来指定 sendCommand 的目标标签页,并在 onEvent 的回调函数中通过标签页标识符分发事件。
declarativeContent
使用&chrome.declarativeContent&API 根据网页内容采取行动,而不需要读取页面内容的权限。
desktopCapture
桌面捕获 API 可以用于捕获屏幕、单个窗口或标签页的内容。
devtools.inspectedWindow
使用&chrome.devtools.inspectedWindow&API 与审查的窗口交互:获得审查页面的标签页标识符,在审查窗口的上下文中执行代码,重新加载页面,或者获取页面中所有资源的列表。
devtools.network
使用&chrome.devtools.network&API 获取开发者工具的网络面板中显示的与网络请求相关的信息。
devtools.panels
使用&chrome.devtools.panels&API将您的扩展程序整合到开发者工具窗口用户界面中:创建您自己的面板、访问现有的面板以及添加侧边栏。
使用&chrome.downloads&API 以编程方式开始下载,监视、操纵、搜索下载的文件。
chrome.events&命名空间包含 API 分发事件使用的通用类型,以便在某些有意义的事情发生时通知您。
chrome.extension&API 包含任何扩展程序页面都能使用的实用方法。它包括在扩展程序和内容脚本之间或者两个扩展程序之间交换消息的支持,这一部分内容在消息传递中详细描述。
fileBrowserHandler
使用&chrome.fileBrowserHandler&API 扩展 Chrome OS 的文件浏览器。例如,您可以使用这一 API 让用户向您的网站上传文件。
fontSettings
使用&chrome.fontSettings&API 管理 Chrome 浏览器的字体设置。
使用&chrome.history&API 与浏览器的历史记录交互,您可以添加、删除、通过 URL 查询浏览器的历史记录。如果您想要使用您自己的版本替换默认的历史记录页面,请参见替代页面。
使用&chrome.i18n&架构为您的整个应用或扩展程序实现国际化支持。
使用&chrome.identity&API 获取 OAuth2 访问令牌。
使用&chrome.idle&API 检测计算机空闲状态的更改。
使用&chrome.input.ime&API 为 Chrome OS 实现自定义的输入法,它允许您的扩展程序处理键盘输入、设置候选内容及管理候选窗口。
management
chrome.management&API 可以用来管理已经安装并且正在运行的扩展程序或应用,它对于替代内建的&打开新的标签页&页面的扩展程序特别有用。
notifications
使用&chrome.notifications&API 通过模板创建丰富通知,并在系统托盘中向用户显示这些通知。
多功能框 API 允许您在 Google Chrome 浏览器的地址栏(又叫多功能框)中注册一个关键字。
pageAction
使用&chrome.pageAction&API 在地址栏中添加图标。页面按钮代表用于当前页面的操作,但是不适用于所有页面。
pageCapture
使用&chrome.pageCapture&API 将一个标签页保存为 MHTML。
permissions
使用&chrome.permissions&API 在运行时而不是安装时请求声明的可选权限,这样用户可以理解为什么需要这些权限,并且仅在必要时授予这些权限。
使用&chrome.power&API 修改系统的电源管理特性。
使用&chrome.privacy&API 控制 Chrome 浏览器中可能会影响用户隐私的特性。这一模块依赖于类型 API 中的 ChromeSettings 原型,用于获取和设置 Chrome 浏览器的配置。
使用&chrome.proxy&API 管理 Chrome 浏览器的代理服务器设置。该模块依赖于类型 API 中的 ChromeSetting 原型,用于获取和设置代理服务器配置。
pushMessaging
使用&chrome.pushMessaging&使应用或扩展程序能够接收通过 Google 云消息服务发送的消息数据。
使用&chrome.runtime&API 获取后台页面、返回清单文件的详情、监听并响应应用或扩展程序生命周期内的事件,您还可以使用该 API 将相对路径的 URL 转换为完全限定的 URL。
使用&chrome.storage&API 存储、获取用户数据,追踪用户数据的更改。
system.cpu
使用&systemInfo.cpu&API 查询 CPU 元数据。
system.memory
chrome.system.memory&API。
system.storage
使用&chrome.system.storage&API 查询存储设备信息,并在连接或移除可移动存储设备时得到通知。
tabCapture
使用&chrome.tabCapture&API 与标签页的媒体流交互。
使用&chrome.tabs&API 与浏览器的标签页系统交互。您可以使用该 API 创建、修改和重新排列浏览器中的标签页。
使用&chrome.topSites&API 访问&打开新的标签页&页面中的显示的&常去网站&。
使用&chrome.tts&API 播放合成的文字语音转换(TTS),同时请您参见相关的 ttsEngine API,允许扩展程序实现语音引擎。
使用&chrome.ttsEngine&API 用扩展程序实现文字语音转换(TTS)引擎。如果您的扩展程序注册了这一 API,当任何扩展程序或 Chrome 应用使用 tts 模块朗读时,它会收到事件,包含要朗读的内容以及其他参数。您的扩展程序可以使用任何可用的网络技术合成并输出语音,并向调用方发送事件报告状态。
chrome.types&API 包含用于 Chrome 浏览器的类型声明。
webNavigation
使用&chrome.webNavigation&API 实时地接收有关导航请求状态的通知。
webRequest
使用&chrome.webRequest&API 监控与分析流量,还可以实时地拦截、阻止或者修改请求。
使用&chrome.webstore&API 从您的网站上&内嵌&安装应用与扩展程序。
使用&chrome.windows&API 与浏览器窗口交互。您可以使用该模块创建、修改和重新排列浏览器中的窗口。
accessibilityFeatures
使用&chrome.accessibilityFeatures&API 管理 Chrome 浏览器的辅助功能。该 API 使用类型 API 的 ChromeSetting 原型获取和设置辅助功能的各种特性。如果要获取特性的状态,扩展程序必须请求&accessibilityFeatures.read&权限。如果要修改特性状态,扩展程序需要&accessibilityFeatures.modify&权限。注意,accessibilityFeatures.modify&权限并不包含accessibilityFeatures.read&权限。
declarativeWebRequest
使用&chrome.declarativeWebRequest&API 实时地拦截、阻止或者修改请求,它比 API 要快得多,因为您注册的规则在浏览器而不是 JavaScript 引擎中求值,这样就减少了来回延迟并且可以获得极高的效率。
使用&chrome.gcm&通过 Google Cloud Messaging 在应用和扩展程序中发送和接收消息。
使用&<bars&API 在标签页内容的正上方添加一个水平面板,如以下屏幕截图所示。
使用&chrome.location&API 获取计算机的地理位置。该 API 是 HTML 地理定位 API 的另一种版本,与事件页面兼容。
使用&chrome.processes&API 与浏览器进程交互。
使用&chrome.sessions&API 查询和恢复浏览器会话中的标签页和窗口。
signedInDevices
使用&chrome.signedInDevices&API 获取以当前配置文件所对应的账户登录的设备列表。
阅读(...) 评论() &当读完了这个综述和入门之后,就可以开始创建应用(扩展)和WebApp了。
注意:WebApp是通过应用(扩展)的方式实现的,所以除非特别声明,本页所有内容都适用于WebApp。
一个应用(扩展)其实是压缩在一起的一组文件,包括HTML,CSS,Javascript脚本,图片文件,还有其它任何需要的文件。 应用(扩展)本质上来说就是web页面,它们可以使用所有的浏览器提供的API,从XMLHttpRequest到JSON到HTML5全都有。
应用(扩展)可以与Web页面交互,或者通过content script或cross-origin XMLHttpRequests与服务器交互。应用(扩展)还可以访问浏览器提供的内部功能,例如标签或书签等。
应用(扩展)的界面
很多应用(不包括WebApp)会以browser action或page action的形式在浏览器界面上展现出来。每个应用(扩展)最多可以有一个browser action或page action。当应用(扩展)的图标是否显示出来是取决于单个的页面时,应当选择page action;当其它情况时可以选择browser action。
这个gmail提醒应用使用了browser action,它在工具栏上增加一个图标
这个新闻阅读应用也使用了browser action,当点击时会弹出一个气泡窗口
这个地图应用使用了page action和content script(注入到页面内执行的脚本)
应用也可以通过其它方式提供界面,比如加入到上下文菜单,提供一个选项页面或者用一个content script改变页面的显示等。可以在"开发指南"中找到应用(扩展)特性的完整列表以及实现的细节。
WebApp界面
一个WebApp通常会打包一个包含了主要功能的html页面进来。例如下图中这个WebApp在HTML页面中显示了一个flash文件。
更多信息,查看
每个应用(扩展)都应该包含下面的文件:
一个manifest文件
一个或多个html文件(除非这个应用是一个皮肤)
可选的一个或多个javascript文件
可选的任何需要的其他文件,例如图片
在开发应用(扩展)时,需要把这些文件都放到同一个目录下。发布应用(扩展)时,这个目录全部打包到一个应用(扩展)名是.crx的压缩文件中。如果使用,上传应用(扩展),可以自动生成.crx文件。
任何需要的文件都可以放到应用(扩展)中,但是怎么使用它们呢?一般的说,可以像在普通的HTML文件中那样使用相对地址来引用一个文件。下面的例子演示了如何引用images子目录下的文件myimage.png
&img src="images/myimage.png"&
如果使用360极速版内置的调试器(开发人员工具),可以看到每一个应用(扩展)中的文件也可以用一个绝对路径来表示:chrome-extension://&extensionID&/&pathToFile&
在这个URL中,是为每一个应用(扩展)生成的唯一ID。从chrome://extensions页面中可以看到已经安装的所有应用(扩展)的唯一ID。是文件在应用(扩展)目录下的路径,也就是它的相对路径。
在这个URL中,名为manifest.json的文件包含了应用(扩展)的基本信息,例如最重要的文件列表,应用(扩展)所需要的权限等。下面是一个典型的应用(扩展),使用了browser action并访问
"name": "My Extension",
"version": "2.1",
"description": "Gets information from Google.",
"icons": { "128": "icon_128.png" },
"background_page": "bg.html",
"permissions": ["http://*./", "https://*./"],
"browser_action": {
"default_title": "",
"default_icon": "icon_19.png",
"default_popup": "popup.html"
详细信息,参考
绝大多数应用(扩展)都包含一个背景页面(background page),用来执行应用(扩展)的主要功能。
上图显示了安装了两个应用(扩展)的浏览器。两个应用(扩展)分别是黄色图标代表的browser action和蓝色图标代表的page action。在background.html文件里定义了browser action和javascript代码。在两个窗口里browser action都可以工作。
背景页面并不是应用(扩展)中唯一的页面。例如,一个browser action可以包含一个弹窗(popup),而弹窗就是用html页面实现的。应用(扩展)还可以使用chrome.tabs.create()或者window.open()来显示内部的HTML文件。
应用(扩展)里面的HTML页面可以互相访问各自DOM树中的全部元素,或者互相调用其中的函数。
下图显示了一个browser action的弹窗的架构。弹窗的内容是由HTML文件(popup.html)定义的web页面。它不必复制背景页面(background.html)里的代码,因为它可以直接调用背景页面中的函数。
更多细节可以参考
如果一个应用(扩展)需要与web页面交互,那么就需要使用一个content script。Content script脚本是指能够在浏览器已经加载的页面内部运行的javascript脚本。可以将content script看作是网页的一部分,而不是它所在的应用(扩展)的一部分。
Content script可以获得浏览器所访问的web页面的详细信息,并可以对页面做出修改。下图显示了一个content script可以读取并修改当前页面的DOM树。但是它并不能修改它所在应用(扩展)的背景页面的DOM树。
Content script与它所在的应用(扩展)并不是完全没有联系。一个content script脚本可以与所在的应用(扩展)交换消息,如下图所示。例如,当一个content script从页面中发现一个RSS种子时,它可以发送一条消息。或者由背景页面发送一条消息,要求content script修改一个网页的内容。
更多的信息可以查看
一个应用(扩展)中的HTML页面间经常需要互相通信。由于一个应用(扩展)的所有页面是在同一个进程的同一个线程中运行的,因此它们之间可以直接互相调用各自的函数。
可以使用中的方法来获取应用(扩展)中的页面,例如getViews()和getBackgroundPage()。一旦一个页面得到了对应用(扩展)中其它页面的引用,它就可以调用被引用页面中的函数,并操作被引用页面的DOM树。
保存数据和隐身模式
应用(扩展)可以使用HTML5的 (例如localStorage)来保存数据,或者向服务器发出请求来保存数据。当需要保存数据的时候,首先需要确定是否从隐身模式窗口中发出的请求。缺省情况下,应用(扩展)是不会运行在隐身模式下的,而webapp是会的。需要明确用户在隐身模式下究竟需要应用(扩展)或webapp做什么。
隐身模式保证在该窗口下浏览不会留下痕迹。当处理隐身窗口的数据时,一定要遵循这个前提。例如,如果一个的应用(扩展)的功能是将浏览历史保存在云端(服务器),那么不要保存隐身模式下的浏览历史。另一方面,任何窗口下都可以保存应用(扩展)的数据,不论是否隐身。
重要规则:如果一条数据可能表明用户在网上看了什么或做了什么,不要在隐身模式下保存它。
要检查窗口是否在隐身模式下,检查Tab或Window对象的incognito属性。例如:
var bgPage = chrome.extension.getBackgroundPage();
function saveTabData(tab, data) {
if (tab.incognito) {
bgPage[tab.url] =
// Persist data ONLY in memory
localStorage[tab.url] = // OK to store data
现在应用(扩展)的基本知识已经介绍完了,可以开始写自己的应用(扩展)了。更多的信息可以参考:

我要回帖

更多关于 chrome extension id 的文章

 

随机推荐