0

我需要即时创建 CRX 文件。它适用于我的 CMS 后端,因此仅适用于可以将 CMS 后端安装为 web 应用程序并为 web 应用程序提供更多权限的经过身份验证的用户。问题是,后端用于许多域,因此为每个域创建 CRX 文件是一项艰巨的工作。因此,我认为按需创建 CRX 文件会更容易,该文件将由 PHP 使用自己的域和可能的自定义图标生成。

4

4 回答 4

1

在文档页面上,他们解释了 CRX 包格式。有许多第三方库实现了这种格式。在下面的页面中,您可以了解格式并下载 Ruby / Bash 脚本(您也可以在网上找到其他脚本),如果您想实现自己的打包程序,您可以按照那里描述的格式进行操作。

https://developer.chrome.com/extensions/crx

如果您真的不想遵循该格式,您可以让您的 PHP 脚本执行以下操作之一:

  1. 使用 Chrome 二进制文件chrome.exe --pack-extension=c:\myext --pack-extension-key=c:\myext.pem
  2. 使用 PHP 中的 Ruby 或 Bash 脚本(您可以调用系统命令)

希望有帮助!

于 2011-01-30T20:00:49.507 回答
0

这对我有用:DI 只是从真实路径更改为 null 没有该更改将不适用于新的 chrome :D

/** * CrxGenerator 类 * * 从 * 文件夹和 pem 私钥创建 Chrome 扩展 CRX 包 * * 基于 CRX 格式文档: http: //developer.chrome.com/extensions/crx.html * * @author:Tomasz Banasiak * @许可证:麻省理工学院 * @日期:2013-11-03 */

类 CrxGenerator { const TEMP_ARCHIVE_EXT = '.zip';

private $sourceDir = null;
private $cacheDir = '';

private $privateKeyContents = null;
private $publicKeyContents = null;

private $privateKey = null;
private $publicKey = null;

/**
 * @param $file Path to PEM key
 * @throws Exception
 */
public function setPrivateKey($file) {
    if (!file_exists($file)) {
        throw new Exception('Private key file does not exist');
    }

    $this->privateKeyContents = file_get_contents($file);
    $this->privateKey = $file;
}

/**
 * @param $file Path to PUB key
 * @throws Exception
 */
public function setPublicKey($file) {
    if (!file_exists($file)) {
        throw new Exception('Private key file does not exist');
    }

    $this->publicKeyContents = file_get_contents($file);
    $this->publicKey = $file;
}

/**
 * @param $cacheDir dir specified for caching temporary archives
 * @throws Exception
 */
public function setCacheDir($cacheDir) {
    if (!is_dir($cacheDir)) {
        throw new Exception('Cache dir does not exist!');
    }

    $this->cacheDir = $cacheDir;
}

/**
 * @param $sourceDir Extension source directory
 */
public function setSourceDir($sourceDir) {
    $this->sourceDir = $sourceDir;
}

/**
 * @param $outputFile path to output file
 * @throws Exception
 */
public function generateCrx($outputFile) {
    $basename = basename($outputFile);
    // First step - create ZIP archive
    $zipArchive = $this->cacheDir . DIRECTORY_SEPARATOR . $basename . self::TEMP_ARCHIVE_EXT;

    $result = $this->createZipArchive(
        $this->sourceDir,
        $zipArchive
    );

    if (!$result) {
        throw new Exception('ZIP creation failed');
    }

    $zipContents = file_get_contents($zipArchive);

    // Second step - create file signature
    $privateKey = openssl_pkey_get_private($this->privateKeyContents);
    openssl_sign($zipContents, $signature, $privateKey, 'sha1');
    openssl_free_key($privateKey);

    // Create output file

    $crx = fopen($outputFile, 'wb');
    fwrite($crx, 'Cr24');
    fwrite($crx, pack('V', 2));
    fwrite($crx, pack('V', strlen($this->publicKeyContents)));
    fwrite($crx, pack('V', strlen($signature)));
    fwrite($crx, $this->publicKeyContents);
    fwrite($crx, $signature);
    fwrite($crx, $zipContents);
    fclose($crx);

    // Clear cache
    unset($zipArchive);
}

/**
 * @param $source - source dir
 * @param $outputFile - output file
 * @return bool - success?
 */
private function createZipArchive($source, $outputFile) {
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($outputFile, ZIPARCHIVE::CREATE)) {
        return false;
    }

     $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true) {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
        foreach ($files as $file) {
            $file = str_replace('\\', '/', $file);

            // Exclude "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/') + 1), array('.', '..')) ) {
                continue;
            }

            $file = $file;

            if (is_dir($file) === true) {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true) {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true) {
        $zip->file_get_contents($source);
    echo  $source;
    }

    return $zip->close();
}

}

于 2013-12-19T03:26:12.443 回答
0

此外,对于仍在寻找在 PHP 中创建 CTX 的方法的任何人,请查看以下问题:使用 PHP 创建 Google Chrome Crx 文件

于 2011-11-28T16:33:16.407 回答
-1

看起来我已经找到了我想要的东西。Chrome 团队已选择此选项来创建无 CRX 的网络应用程序,只需使用简单的清单文件即可。

创建自己的 webapp 并将其发布在网站上进行安装要容易得多。当我有许多具有很多域的网站并且我不必为每个域创建自定义 CRX 文件时,它也解决了我的问题。我只是创建一个小的 PHP 脚本,它为每个域动态创建清单文件。

于 2011-02-04T11:13:50.267 回答