一个获取google chrome扩展crx文件信息的PHP操作类

此类中实现了从crx文件获取扩展的Appid、获取manifest.json文件内容、将crx文件转换为一般zip文件

代码如下:

<?php
class CrxParserException extends Exception {

}

/**
 * Chrome crx 解析器,用于获取扩展、皮肤ID
 *
 */
class CrxParser {
    const MAX_PUBLIC_KEY_SIZE = 65535;
    const MAX_SIGNATURE_SIZE  = 65535;
    const HEADER_MAGIC_PREFIX = ‘Cr24‘;
    const CURRENT_VERSION     = 2;

    private $fp = null; //文件指针
    private $filename = ‘‘; //文件路径
    private $_header = array(); //crx 文件的头信息

    public function __construct($filename){
        $this->parse($filename);
    }

    /**
     * 获取此应用的ID
     * @return string
     */
    public function getAppid() {
        $hash = hash(‘sha256‘,$this->_key);
        $hash = substr($hash,0,32);

        $length = strlen($hash);
        $ascii_0 = ord(‘0‘);
        $ascii_9 = ord(‘9‘);
        $ascii_a = ord(‘a‘);
        $data = ‘‘;
        for($i=0;$i<$length;$i++) {
            $c = ord($hash[$i]);

            if($c >= $ascii_0 && $c <= $ascii_9) {
                $d = chr($ascii_a + $c - $ascii_0);
            } else if($c >= $ascii_a && $c < $ascii_a + 6) {
                $d = chr($ascii_a + $c - $ascii_a + 10);
            } else {
                $d = ‘a‘;
            }
            $data .= $d;
        }
        return $data;
    }

    /**
     * 从crx文件中获取manifest.json文件的配置信息
     * @param unknown $zip_file
     * @return mixed[]
     */
    function getConfig($key=null){
        $zip_file=tempnam(dirname($this->filename),‘zip‘);
        $manifest_arr=array();
        if($this->convertToZip($zip_file)){
            $zip=zip_open($zip_file);
            if(is_resource($zip)){
                while($zip_entry=zip_read($zip)){
                    $entry_name=zip_entry_name($zip_entry);
                    if(preg_match(‘/manifest\.json$/‘, $entry_name)){
                        $content=zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                        $content_j=json_decode($content, true);
                        if(!empty($content_j)){
                            $manifest_arr=$content_j;
                        }
                    }
                }
            }
            zip_close($zip);
            unlink($zip_file);
        }
        return is_null($key) ? $manifest_arr : $manifest_arr[$key];
    }

    /**
     * 将文件转换为zip文件
     * @param unknown $target_path
     */
    public function convertToZip($target_path=null){
        $offset=16+$this->_header[‘key_size‘]+$this->_header[‘sig_size‘];
        $data=$this->getContent($this->filename,$offset);
        return !is_null($target_path) ? file_put_contents($target_path, $data) : $data;
    }

    /**
     * 开始解析该 crx 文件
     */
    private function parse($filename) {
        if(strpos($filename, ‘://‘)!==false && !file_exists($filename)) {
            throw new CrxParserException("parser init: crx file does not exisit");
        }
        $this->filename=$filename;
        $this->fp = fopen($filename, ‘r‘);
        $this->parse_header(); // 解析头部信息
        $this->parse_key();
        $this->parse_sig();
        fclose($this->fp);
    }

    /**
     * 解析头部信息,并设置 $_header 数组
     * @throws CrxParserException 解析错误抛出异常
     */
    private function parse_header() {
        $data = fread($this->fp, 16); // HEADER 头信息有16个字节
        if($data) {
            $data = @unpack(‘C4prefix/Vversion/Vkey_size/Vsig_size‘,$data);
        }else{
            throw new CrxParserException("header parse: error reading header");
        }
        // 前四个字节拼合 prefix
        $data[‘prefix‘] = chr( $data[‘prefix1‘] ).chr( $data[‘prefix2‘] ).chr( $data[‘prefix3‘] ).chr( $data[‘prefix4‘] );
        unset($data[‘prefix1‘],$data[‘prefix2‘],$data[‘prefix3‘],$data[‘prefix4‘]);

        if($data[‘prefix‘] != self::HEADER_MAGIC_PREFIX) {
            throw new CrxParserException("header parse: illegal prefix");
        }
        if( $data[‘version‘] != self::CURRENT_VERSION ) {
            throw new CrxParserException("header parse: illegal version");
        }
        if(
                empty($data[‘key_size‘]) || $data[‘key_size‘] > self::MAX_PUBLIC_KEY_SIZE ||
                empty($data[‘sig_size‘]) || $data[‘sig_size‘] > self::MAX_SIGNATURE_SIZE
                ){
                    throw new CrxParserException("header parse: illegal public key size or signature size");
        }
        $this->_header = $data;
    }

    /**
     * 解析key
     * @throws CrxParserException
     */
    private function parse_key() {
        $key = fread($this->fp,$this->_header[‘key_size‘]);
        if($key) {
            $this->_key = $key;
        }else{
            throw new CrxParserException("key parse: error reading key");
        }
    }

    /**
     * 解析sig
     * @throws CrxParserException
     */
    private function parse_sig() {
        $sig = fread($this->fp,$this->_header[‘sig_size‘]);
        if($sig) {
            $this->_sig = $sig;
        }else{
            throw new CrxParserException("sig parse: error reading sig");
        }
    }

    /**
     * 从文件中获取指定位置及大小的内容
     * @param unknown $filename
     * @param number $offset
     * @param unknown $length
     * @return string
     */
    private function getContent($filename,$offset=0,$length=-1){
        $stream = fopen($filename, ‘rb‘);
        $content = stream_get_contents($stream, $length, $offset);
        fclose($stream);
        return $content;
    }

}

使用方法:

<?php
$crxParser=new CrxParser(‘abc.crx‘);
echo $crxParser->getAppid();
var_dump($crxParser->getConfig());
//$crxParser->convertToZip(‘abc.zip‘);
时间: 2024-10-07 07:06:14

一个获取google chrome扩展crx文件信息的PHP操作类的相关文章

C# 获取Google Chrome的书签

其实这个很简单,就是读取一个在用户目录里面的一个Bookmarks文件就好了. 先建立几个实体类 1 public class GoogleChrome_bookMark_meta_info 2 { 3 public string last_visited_desktop { get; set; } 4 } 5 6 public class GoogleChrome_BookMark_children 7 { 8 public string date_added { get; set; } 9

获取google翻译的音频文件_合并音频文件的方法

1. 把引文输入google 翻译,然后点击“朗读” 2. 按下F12键,打开也变调试窗口,在网络标签页中,算中“媒体”列表,删选出媒体文件如下: 3. 获取音频文件 选中请求网址,复制网址,在浏览器中黏贴,访问 右键弹出菜单中,选中“另存为”,即可获取“音频文件” 4. 合并音频文件片段 因为google翻译,会截取翻译的段落为一段一段,所以获取的翻译文件也是一段一段的. 分别下载后,并按照顺序明明每个音频文件. 如文件 0001.MP3, 0002.mp3, 0003.MP3 算中第一个文件

Google Chrome浏览器扩展的架构

1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的background 页面,一种是persistent background pages,另一种是event pages.Persistent background pages持续运行,随时可访问.而Event pages是事件驱动运行的,只有在事件发生的时候才可以访问. Persistent background

【转】如何下载和离线安装Chrome的CRX扩展文件包

5月某天,Google将扩展工具库网址中的Extensions,全部跳转到Webstore,页面统一了. 这样做的后果是:原本“右键--另存”就能下载到CRX包,现在则不能了. 任何人都必须点击那个傻拉八叽的INSTALL按钮去使用喜欢的扩展…… 点击INSTALL之后,会发现窗口底部的下载器还是会弹出,只不过很快消失,这时打开Chrome内置下载器去寻找CRX,已经晚了,Chrome自动删除了CRX. Google真是霸气,苹果在线商店也没你们这么狠啊! 我觉得,把常用扩展随身携带,这其实不是

下载谷歌浏览器(Chrome)扩展离线安装包crx文件最简单的方法

引言(可以不看): 下面介绍一下,下载谷歌浏览器(Google Chrome)扩展的离线安装包crx文件最简单的方法!真的是再简单不过了! 谷歌浏览器(Google Chrome)的扩展功能让谷歌浏览器变的无比强大,需要特殊功能的时候去Chrome Web Store找一下,基本都可以找到合适的扩展.但是随着Chrome浏览器使用的时间越来越长,积累下来的扩展也越来越多,备份这些扩展就成了一个新的问题. 比如出于由于某些众所周知的原因,在给MM(或朋友.爸妈等)装机的时候可能上不去扩展安装页面.

如何下载 Chrome 应用商店的 .crx 文件

//一直用chrome,最近插件(web developer)莫名丢失,修改hosts文件不得.第一种方法简单,第二种方法对个别chrome 插件有用,对另一些无效(可能id对不上) .推荐第一种方法. Chrome Extension Downloader 是一个可以下载到 Chrome 应用商店扩展 .crx 文件的网站,直接输入 Chrome 扩展地址就能得到 .crx 文件. .crx 文件是 Chrome 浏览器的应用扩展打包文件,有它就可以无需联网安装应用扩展. 或许有千百个理由需要

Google Chrome浏览器扩展的调试

1)      查看扩展程序的详细信息和ID 通过Chrome 浏览器的“ 工具->更多工具->扩展程序”,打开chrome://extensions页面,选中右上角的“开发者模式”,可以查看扩展程序的详细信息(如名称.概述.占用空间大小.版本和权限等)和ID. 2)      查看扩展程序的popup页面 通过Chrome 浏览器的“工具 ->更多工具->扩展程序”,打开chrome://extensions页面,选中右上角的“开发者模式”(必须在开发者模式下才能够看到调试菜单项

HttpWebRequest / HttpWebResponse 远程获取文件信息

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(path+filename); //创建一个请求(获得需要的文件信息) HttpWebResponse myRes = (HttpWebResponse)myReq.GetResponse(); string gorlseftDate = myRes.LastModified.ToString("yyyy-MM-dd hh:mm:ss");//获得dataServer.ra

12 款不能少的使网页浏览获得的最佳体验Chrome 扩展

原文地址:http://whosmall.com/?post=414 本文标签: Chrome扩展 网页浏览体验 引擎划词翻译工具 Chrome浏览器 相信不少朋友和我一样,每安装新的操作系统之后,都会使用 Safari/IE 下载 Chrome 浏览器,然后将后者作为主力上网浏览器,而将前者束之高阁.毕竟从体验上说,Chrome拥有快速流畅的浏览体验,当然强大丰富的扩展也是让我一见倾心的关键. 此前我们向各位介绍了数款颇受欢迎的 Chrome 扩展,而今天笔者我起一回私心,给大家安利一些我正在