我在用GNU Icecat(GNU 版本的 Mozilla Firefox)三重奏 GNU/Linux。为了最大限度地减少/优化网络浏览时的数据使用量,我想使用 Google 的数据压缩代理。
那么,如何在 Firefox 上使用 Google 数据压缩代理?
答案1
在非 Chrome 浏览器上使用 Google Chrome 数据压缩代理涉及两个步骤。
- 将您的 HTTP 代理设置为
proxy.googlezip.net
和端口80
。 - 对于您的每个请求,计算并将
Chrome-Proxy
标头注入到您的请求中。
标题Chrome-Proxy
应包含以下字符串:
ps=<timestamp>-<num1>-<num2>-<num3>, sid=<md5 string>, b=<build>, p=<patch>, c=<platform>
其中:
- 时间戳:是自 unix 纪元以来经过的当前秒数
- num1、num2、num3:是随机数,可以设置为
0
- md5 字符串:是 auth 字符串的 md5
- 身份验证字符串:“
<timestamp>
”+“<auth key>
”+“<timestamp>
” - 授权键:
ac4500dd3b7579186c1b0620614fdb1f7d61f944
- build:Chrome 版本号,可以设置为
2214
- patch:Chrome 补丁号,可设置为
115
- platform:Chrome平台,可设置为“
win
”
作为标题的完整示例,您可能拥有:Chrome-Proxy: ps=1439961190-0-0-0, sid=9fb96126616582c4be88ab7fe26ef593, b=2214, p=115, c=win
现在,为了实际实现这一点,我认为最简单的解决方案是使用扩展,但 Firefox 似乎还没有具有此功能的扩展。
因此,我为 Firefox 38 或更高版本实现了自己的 Firefox 扩展,允许任何人都在 Firefox 上使用 Google Chrome 数据压缩代理,并包含下面的代码。
以下是我用来开发和测试扩展的程序,并允许其他人从头开始重新生成扩展。
获取并安装
nodejs
使用来自
npm
nodejs的安装jpm
npm install jpm
请注意,Ubuntu 的一些版本软件包
node
如下nodejs
,如果jpm
找不到,你node
可能需要安装另一个 nodejs 发行版或创建一个链接node
nodejs
为扩展创建一个新目录并
cd
进入其中jpm init
使用默认设置回答提示
使用下面提供的代码替换你的 index.js
jpm run
请注意,如果
jpm
无法在标准位置找到 Firefox,您还需要传递 -b 标志来jpm
告诉它在哪里找到您的浏览器。(例如jpm run -b /path/to/Firefox/Nightly
)
现在您应该打开 Firefox,加载此新扩展,并且在此会话期间所有流量都通过 Google Chrome 数据压缩代理进行代理。
因为会创建一个临时配置文件,所以每当您想要代理流量时,jpm run
您都需要此扩展。您也可以在附加组件管理器中使用它。jpm run
jpm xpi
Install Add-on From File
您可以通过检查响应标头来验证数据是否正在被代理,Via
该标头指示数据正在通过 Chrome 压缩代理发送(例如Via: "1.1 Chrome-Compression-Proxy"
)
Content-Length
您可以通过将该标头与X-Original-Content-Length
服务器响应中的标头进行比较来确定保存了多少数据。
index.js 的代码如下:
/*
* Data Compressor Proxy 0.0.1
* License: MPL
*
* Based on
* Data Compression Proxy Extension for Google Chrome on Desktop
* (c) 2014 Jerzy Glowacki. License: Apache 2.0
* and includes
* JavaScript MD5 1.0.1
* https://github.com/blueimp/JavaScript-MD5
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*
* JavaScript MD5 1.0.1 is Based on
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
var self = require('sdk/self');
var { Class } = require('sdk/core/heritage');
var { Unknown } = require('sdk/platform/xpcom');
var {Cc, Ci} = require("chrome");
var prefsvc = require("sdk/preferences/service");
var httpRequestObserver = Class(
{
extends: Unknown,
interfaces: [ 'nsIObserver' ],
topic: '*',
observe: function(subject, topic, data)
{
if (topic == "http-on-modify-request") {
var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
httpChannel.setRequestHeader("Chrome-Proxy", this.authHeader(), false);
}
},
get observerService() {
return Cc["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService);
},
authHeader : function() {
var authValue = 'ac4500dd3b7579186c1b0620614fdb1f7d61f944';
var timestamp = Date.now().toString().substring(0, 10);
return 'ps=' + timestamp + '-' + '0' + '-' + '0' + '-' + '0' + ', sid=' + md5(timestamp + authValue + timestamp) + ', b=2214' + ', p=115' + ', c=win';
},
register: function()
{
this.observerService.addObserver(this, "http-on-modify-request", false);
},
unregister: function()
{
this.observerService.removeObserver(this, "http-on-modify-request");
}
});
var httprequestobserver = httpRequestObserver();
httprequestobserver.register();
prefsvc.set("network.proxy.http", "proxy.googlezip.net");
prefsvc.set("network.proxy.http_port", 80);
prefsvc.set("network.proxy.type", 1);
!function(a){"use strict";function b(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}function c(a,b){return a<<b|a>>>32-b}function d(a,d,e,f,g,h){return b(c(b(b(d,a),b(f,h)),g),e)}function e(a,b,c,e,f,g,h){return d(b&c|~b&e,a,b,f,g,h)}function f(a,b,c,e,f,g,h){return d(b&e|c&~e,a,b,f,g,h)}function g(a,b,c,e,f,g,h){return d(b^c^e,a,b,f,g,h)}function h(a,b,c,e,f,g,h){return d(c^(b|~e),a,b,f,g,h)}function i(a,c){a[c>>5]|=128<<c%32,a[(c+64>>>9<<4)+14]=c;var d,i,j,k,l,m=1732584193,n=-271733879,o=-1732584194,p=271733878;for(d=0;d<a.length;d+=16)i=m,j=n,k=o,l=p,m=e(m,n,o,p,a[d],7,-680876936),p=e(p,m,n,o,a[d+1],12,-389564586),o=e(o,p,m,n,a[d+2],17,606105819),n=e(n,o,p,m,a[d+3],22,-1044525330),m=e(m,n,o,p,a[d+4],7,-176418897),p=e(p,m,n,o,a[d+5],12,1200080426),o=e(o,p,m,n,a[d+6],17,-1473231341),n=e(n,o,p,m,a[d+7],22,-45705983),m=e(m,n,o,p,a[d+8],7,1770035416),p=e(p,m,n,o,a[d+9],12,-1958414417),o=e(o,p,m,n,a[d+10],17,-42063),n=e(n,o,p,m,a[d+11],22,-1990404162),m=e(m,n,o,p,a[d+12],7,1804603682),p=e(p,m,n,o,a[d+13],12,-40341101),o=e(o,p,m,n,a[d+14],17,-1502002290),n=e(n,o,p,m,a[d+15],22,1236535329),m=f(m,n,o,p,a[d+1],5,-165796510),p=f(p,m,n,o,a[d+6],9,-1069501632),o=f(o,p,m,n,a[d+11],14,643717713),n=f(n,o,p,m,a[d],20,-373897302),m=f(m,n,o,p,a[d+5],5,-701558691),p=f(p,m,n,o,a[d+10],9,38016083),o=f(o,p,m,n,a[d+15],14,-660478335),n=f(n,o,p,m,a[d+4],20,-405537848),m=f(m,n,o,p,a[d+9],5,568446438),p=f(p,m,n,o,a[d+14],9,-1019803690),o=f(o,p,m,n,a[d+3],14,-187363961),n=f(n,o,p,m,a[d+8],20,1163531501),m=f(m,n,o,p,a[d+13],5,-1444681467),p=f(p,m,n,o,a[d+2],9,-51403784),o=f(o,p,m,n,a[d+7],14,1735328473),n=f(n,o,p,m,a[d+12],20,-1926607734),m=g(m,n,o,p,a[d+5],4,-378558),p=g(p,m,n,o,a[d+8],11,-2022574463),o=g(o,p,m,n,a[d+11],16,1839030562),n=g(n,o,p,m,a[d+14],23,-35309556),m=g(m,n,o,p,a[d+1],4,-1530992060),p=g(p,m,n,o,a[d+4],11,1272893353),o=g(o,p,m,n,a[d+7],16,-155497632),n=g(n,o,p,m,a[d+10],23,-1094730640),m=g(m,n,o,p,a[d+13],4,681279174),p=g(p,m,n,o,a[d],11,-358537222),o=g(o,p,m,n,a[d+3],16,-722521979),n=g(n,o,p,m,a[d+6],23,76029189),m=g(m,n,o,p,a[d+9],4,-640364487),p=g(p,m,n,o,a[d+12],11,-421815835),o=g(o,p,m,n,a[d+15],16,530742520),n=g(n,o,p,m,a[d+2],23,-995338651),m=h(m,n,o,p,a[d],6,-198630844),p=h(p,m,n,o,a[d+7],10,1126891415),o=h(o,p,m,n,a[d+14],15,-1416354905),n=h(n,o,p,m,a[d+5],21,-57434055),m=h(m,n,o,p,a[d+12],6,1700485571),p=h(p,m,n,o,a[d+3],10,-1894986606),o=h(o,p,m,n,a[d+10],15,-1051523),n=h(n,o,p,m,a[d+1],21,-2054922799),m=h(m,n,o,p,a[d+8],6,1873313359),p=h(p,m,n,o,a[d+15],10,-30611744),o=h(o,p,m,n,a[d+6],15,-1560198380),n=h(n,o,p,m,a[d+13],21,1309151649),m=h(m,n,o,p,a[d+4],6,-145523070),p=h(p,m,n,o,a[d+11],10,-1120210379),o=h(o,p,m,n,a[d+2],15,718787259),n=h(n,o,p,m,a[d+9],21,-343485551),m=b(m,i),n=b(n,j),o=b(o,k),p=b(p,l);return[m,n,o,p]}function j(a){var b,c="";for(b=0;b<32*a.length;b+=8)c+=String.fromCharCode(a[b>>5]>>>b%32&255);return c}function k(a){var b,c=[];for(c[(a.length>>2)-1]=void 0,b=0;b<c.length;b+=1)c[b]=0;for(b=0;b<8*a.length;b+=8)c[b>>5]|=(255&a.charCodeAt(b/8))<<b%32;return c}function l(a){return j(i(k(a),8*a.length))}function m(a,b){var c,d,e=k(a),f=[],g=[];for(f[15]=g[15]=void 0,e.length>16&&(e=i(e,8*a.length)),c=0;16>c;c+=1)f[c]=909522486^e[c],g[c]=1549556828^e[c];return d=i(f.concat(k(b)),512+8*b.length),j(i(g.concat(d),640))}function n(a){var b,c,d="0123456789abcdef",e="";for(c=0;c<a.length;c+=1)b=a.charCodeAt(c),e+=d.charAt(b>>>4&15)+d.charAt(15&b);return e}function o(a){return unescape(encodeURIComponent(a))}function p(a){return l(o(a))}function q(a){return n(p(a))}function r(a,b){return m(o(a),o(b))}function s(a,b){return n(r(a,b))}function t(a,b,c){return b?c?r(b,a):s(b,a):c?p(a):q(a)}"function"==typeof define&&define.amd?define(function(){return t}):a.md5=t}(this);
答案2
现在有一个Firefox 的 Google DataSaver 代理扩展已发布在 Mozilla 附加组件网站上。
Firefox 的 Google 数据压缩代理 - 为 Firefox 启用 DataSaver 功能