基于Chrome的扩展开发(一)

      Google终于放出了Chrome的第一个扩展示例,虽然还十分简陋,但对喜欢扩展的firefox粉丝来说可说是个大好消息。

      准备工作:你需要使用a recent developer build 或者Google Chrome 2.0 beta.

      1)首先创建一个文件夹,例如c:"myextension,在这个目录下创建一个文本文件,命名为manifest.json,在其中放入下面几句:

  
  
  
  
  1. {  
  2.   "format_version": 1,  
  3.   "id""00123456789ABCDEF0123456789ABCDEF0123456",  
  4.   "version""1.0",  
  5.   "name""My First Extension",  
  6.   "description""The first extension that I made." 

其中各个参数含义如下:

format_version(必需的):向Chrome指明扩展所使用的清单格式版本。目前只有一个格式版本,因此设为1.

id(必需的):扩展的ID号(唯一的)。目前可以设为任何40个十进制数字,将来会改为扩展的公钥的SHA-1的哈希值。

version(必需的):扩展的版本号。可以使用任意点分格式的数字串

name(必需的):扩展的名称。

description(可选的):扩展的描述信息

      2)在目录下加入一个hello_world.html文件,在其中加入

 

  
  
  
  
  1. Hello,  World! 

     3)为了让Chrome支持扩展,右键桌面上Chrome的快捷键,选择属性,在目标这一栏中空一格后,加入

  
  
  
  
  1. --enable-extensions --load-extension="c:\myextension" 

 

      4)启动Chrome,输入下列URL:

  
  
  
  
  1. chrome-extension://00123456789ABCDEF0123456789ABCDEF0123456/hello_world.html 

如图所示:

    5)输入下列URL:

  
  
  
  
  1. chrome-ui://extensions/ 

将会列出所有已经安装的扩展,同时还会显示扩展系统启动时发生的错误信息。

6)内容脚本。它是由Chrome加载进来在web页面上运行的JavaScript文件。这和firefox扩展类似。要加入一个内容脚本,首先在清单文件中对其进行注册,如下所示:

  
  
  
  
  1. {  
  2.   "format_version": 1,  
  3.   "id": "00123456789ABCDEF0123456789ABCDEF0123456",  
  4.   "version": "1.0",  
  5.   "name": "My First Extension",  
  6.   "description": "The first extension that I made.",  
  7.   "content_scripts": [  
  8.     {  
  9.       "matches": ["http://www.google.com/*"],  
  10.       "js": ["foo.js"]  
  11.     }  
  12.   ]  

      然后创建一个脚本文件foo.js,其中代码如下:

  
  
  
  
  1. document.images[0].src = "http://bit.ly/1293Af";  
  2. document.images[0].style.height = "auto"

     在Chrome中输入http://www.google.com/,你将看到如下画面:

 

注:内容脚本可以在页面开头或结尾执行,默认情况下是结尾处执行,当然你也可以加入”run_at”:”document-start”来告诉Chrome在开头处执行。

7)NPAPI插件。Chrome扩展可以包含NPAPI插件这样的二进制组件。如果你想在扩展中使用一个NPAPI插件,首先在扩展中为其创建一个目录,名为”plugins”,然后在清单文件中为其注册如下:

  
  
  
  
  1. {  
  2.   "format_version": 1,  
  3.   "id": "00123456789ABCDEF0123456789ABCDEF0123456",  
  4.   "version": "1.0",  
  5.   "name": "My First Extension",  
  6.   "description": "The first extension that I made.",  
  7.   "plugins_dir": "plugins"  

8)打包发布。要对扩展进行打包发布前,首先确认你安装了Python2.6,然后使用下述脚本文件chromium_extension.py

  
  
  
  
  1. #!/usr/bin/python  
  2. # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.  
  3. # Use of this source code is governed by a BSD-style license that can be  
  4. # found in the LICENSE file.  
  5.  
  6. # chromium_extension.py  
  7.  
  8. import array  
  9. import hashlib  
  10. import logging  
  11. import optparse  
  12. import os  
  13. import re  
  14. import shutil  
  15. import sys  
  16. import zipfile  
  17.  
  18. if sys.version_info < (2, 6):  
  19.   import simplejson as json  
  20. else:  
  21.   import json  
  22.  
  23.  
  24. ignore_dirs = [".svn""CVS"]  
  25. ignore_files = [re.compile(".*~")]  
  26.  
  27. MANIFEST_FILENAME = "manifest.json" 
  28.  
  29. class ExtensionDir:  
  30.   def __init__(self, path):  
  31.     self._root = os.path.abspath(path)  
  32.     self._dirs = []  
  33.     self._files = []  
  34.     for root, dirs, files in os.walk(path, topdown=True):  
  35.       for dir in ignore_dirs:  
  36.         if dir in dirs:  
  37.           dirs.remove(dir)  
  38.       root = os.path.abspath(root)  
  39.       for dir in dirs:  
  40.         self._dirs.append(os.path.join(root, dir))  
  41.       for f in files:  
  42.         for match in ignore_files:  
  43.           if not match.match(f):  
  44.             self._files.append(os.path.join(root, f))  
  45.  
  46.   def validate(self):  
  47.     if os.path.join(self._root, MANIFEST_FILENAME) not in self._files:  
  48.       logging.error("package is missing a valid %s file" % MANIFEST_FILENAME)  
  49.       return False  
  50.     return True  
  51.  
  52.   def writeToPackage(self, path):  
  53.     if not self.validate():  
  54.       return False  
  55.     try:  
  56.       f = open(os.path.join(self._root, MANIFEST_FILENAME))  
  57.       manifest = json.load(f)  
  58.       f.close()  
  59.  
  60.       zip_path = path + ".zip" 
  61.       if os.path.exists(zip_path):  
  62.         os.remove(zip_path)  
  63.       zip = zipfile.ZipFile(zip_path, "w")  
  64.       (root, dir) = os.path.split(self._root)  
  65.       root_len = len(self._root)  
  66.       for file in self._files:  
  67.         arcname = file[root_len+1:]  
  68.         logging.debug("%s: %s" % (arcname, file))  
  69.         zip.write(file, arcname)  
  70.       zip.close()  
  71.  
  72.       zip = open(zip_path, mode="rb")  
  73.       hash = hashlib.sha256()  
  74.       while True:  
  75.         buf = zip.read(32 * 1024)  
  76.         if not len(buf):  
  77.           break 
  78.         hash.update(buf)  
  79.       zip.close()  
  80.  
  81.       manifest["zip_hash"] = hash.hexdigest()  
  82.  
  83.       # This is a bit odd - we're actually appending a new zip file to the end  
  84.       # of the manifest.  Believe it or not, this is actually an explicit  
  85.       # feature of the zip format, and many zip utilities (this library  
  86.       # and three others I tried) can still read the underlying zip file.  
  87.       if os.path.exists(path):  
  88.         os.remove(path)  
  89.       out = open(path, "wb")  
  90.       out.write("Cr24")  # Extension file magic number  
  91.       # The rest of the header is currently made up of three ints:  
  92.       # version, header size, manifest size  
  93.       header = array.array("l")  
  94.       header.append(1)  # version  
  95.       header.append(16)  # header size  
  96.       manifest_json = json.dumps(manifest);  
  97.       header.append(len(manifest_json))  # manifest size  
  98.       header.tofile(out)  
  99.       out.write(manifest_json);  
  100.       zip = open(zip_path, "rb")  
  101.       while True:  
  102.         buf = zip.read(32 * 1024)  
  103.         if not len(buf):  
  104.           break 
  105.         out.write(buf)  
  106.       zip.close()  
  107.       out.close()  
  108.  
  109.       os.remove(zip_path)  
  110.  
  111.       logging.info("created extension package %s" % path)  
  112.     except IOError, (errno, strerror):  
  113.       logging.error("error creating extension %s (%d, %s)" % (path, errno,  
  114.                     strerror))  
  115.       try:  
  116.         if os.path.exists(path):  
  117.           os.remove(path)  
  118.       except:  
  119.         pass  
  120.       return False  
  121.     return True  
  122.  
  123.  
  124. class ExtensionPackage:  
  125.   def __init__(self, path):  
  126.     zip = zipfile.ZipFile(path)  
  127.     error = zip.testzip()  
  128.     if error:  
  129.       logging.error("error reading extension: %s", error)  
  130.       return 
  131.     logging.info("%s contents:" % path)  
  132.     files = zip.namelist()  
  133.     for f in files:  
  134.       logging.info(f)  
  135.  
  136.  
  137. def Run():  
  138.   logging.basicConfig(level=logging.INFO, format="[%(levelname)s] %(message)s")  
  139.  
  140.   parser = optparse.OptionParser("usage: %prog --indir=<dir> --outfile=<file>")  
  141.   parser.add_option("""--indir",  
  142.                     help="an input directory where the extension lives")  
  143.   parser.add_option("""--outfile",  
  144.                     help="extension package filename to create")  
  145.   (options, args) = parser.parse_args()  
  146.   if not options.indir:  
  147.     parser.error("missing required option --indir")  
  148.   if not options.outfile:  
  149.     parser.error("missing required option --outfile")  
  150.   ext = ExtensionDir(options.indir)  
  151.   ext.writeToPackage(options.outfile)  
  152.   pkg = ExtensionPackage(options.outfile)  
  153.   return 0  
  154.  
  155.  
  156. if __name__ == "__main__":  
  157.   retcode = Run()  
  158.   sys.exit(retcode) 

这个脚本运行方式如下所示:

  
  
  
  
  1. chromium_extension.py --indir="c:\myextension" --outfile="myextension.crx" 

这将会产生一个.crx文件,然后将其拖拽进Chrome即可实现扩展的安装

 

参考资料

1Chrome Extension HOWTO

2First Google Chrome Extensions

你可能感兴趣的:(开发,职场,chrome,休闲)