源代码出处:http://xiaoxia.org
今天Google了一下发现的,简直是大喜过望,终于可以在非windows平台使用非wine非虚拟机的方法(好拗口= =)使用sogou代理加速了,对我等教育网各种网站上不去的人简直是福音哪。最有缘的是作者竟然和我同一个学校同一级…膜拜啊…
不过试用之后呢,也发现有一些不甚完美的地方,比如仅支持http代理,导致launchpad.net这种死活要安全链接的就上不去;也导致很多应用程序没法使用,比如evernote的开源linux版Nevernote;还有相比较搜狗浏览器来说,速度不知道为什么还是差了不少…但现在总归是有的用了,很开心!!!
截图:
稍微改了一下代码,让自己用着舒服点…
#!usr/bin/env python
# -*- coding:gb2312 -*-
from threading import Thread
from struct import unpack
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from httplib import HTTPResponse
from SocketServer import ThreadingMixIn
import socket
import time, sys, random
print "sogou代理全网加速器"
print
print "源代码来自:xiaoxia.org"
x_sogou_auth = "9CD285F1E7ADB0BD403C22AD1D545F40/30/853edc6d49ba4e27"
proxy_host = "h0.cnc.bj.ie.sogou.com"
proxy_port = 80
def calc_sogou_hash(t, host):
s = (t + host + 'SogouExplorerProxy').encode('ascii')
code = len(s)
dwords = int(len(s)/4)
rest = len(s) % 4
v = unpack(str(dwords) + 'i'+str(rest)+'s', s)
for vv in v:
if(type(vv)==type('i')):
break
a = (vv & 0xFFFF)
b = (vv >> 16)
code += a
code = code ^ (((code<<5)^b) << 0xb)
# To avoid overflows
code &= 0xffffffff
code += code >> 0xb
if rest == 3:
code += ord(s[len(s)-2]) * 256 + ord(s[len(s)-3])
code = code ^ ((code ^ (ord(s[len(s)-1])*4)) << 0x10)
code &= 0xffffffff
code += code >> 0xb
elif rest == 2:
code += ord(s[len(s)-1]) * 256 + ord(s[len(s)-2])
code ^= code << 0xb
code &= 0xffffffff
code += code >> 0x11
elif rest == 1:
code += ord(s[len(s)-1])
code ^= code << 0xa
code &= 0xffffffff
code += code >> 0x1
code ^= code * 8
code &= 0xffffffff
code += code >> 5
code ^= code << 4
code = code & 0xffffffff
code += code >> 0x11
code ^= code << 0x19
code = code & 0xffffffff
code += code >> 6
code = code & 0xffffffff
return hex(code)[2:].rstrip('L').zfill(8)
class Handler(BaseHTTPRequestHandler):
s = 0
def do_proxy(self):
try:
if self.s == 0:
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect((proxy_host, proxy_port))
self.s.send(self.requestline.encode('ascii') + b"\r\n")
# Add Sogou Verification Tags
self.headers["X-Sogou-Auth"] = x_sogou_auth
t = hex(int(time.time()))[2:].rstrip('L').zfill(8)
self.headers["X-Sogou-Tag"] = calc_sogou_hash(t, self.headers['Host'])
self.headers["X-Sogou-Timestamp"] = t
self.s.send(str(self.headers).encode('ascii') + b"\r\n")
# Send Post data
if(self.command=='POST'):
self.s.send(self.rfile.read(int(self.headers['Content-Length'])))
response = HTTPResponse(self.s, method=self.command, buffering=True)
response.begin()
# Reply to the browser
status = "HTTP/1.1 " + str(response.status) + " " + response.reason
self.wfile.write(status.encode('ascii') + b'\r\n')
h = ''
for hh, vv in response.getheaders():
if hh.upper()!='TRANSFER-ENCODING':
h += hh + ': ' + vv + '\r\n'
self.wfile.write(h.encode('ascii') + b'\r\n')
while True:
response_data = response.read(8192)
if(len(response_data) == 0):
break
self.wfile.write(response_data)
except socket.error:
print('socket error for ' + self.requestline)
def do_POST(self):
self.do_proxy()
def do_GET(self):
self.do_proxy()
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
pass
server = ThreadingHTTPServer(("127.0.0.1", 8083), Handler)
print(u"请选择您的当下网络环境:\n\
1. CERNET 教育网\n\
2. CTCNET 电信\n\
3. CNCNET 联通\n\
4. DXT 电信通\n\
输入数字,如果直接回车则默认选择教育网: \n")
i = raw_input()
if i == 1:
proxy_host = 'h' + str(random.randint(0,10)) + '.edu.bj.ie.sogou.com'
elif i == 2:
proxy_host = 'h' + str(random.randint(0,3)) + '.ctc.bj.ie.sogou.com'
elif i == 3:
proxy_host = 'h' + str(random.randint(0,3)) + '.cnc.bj.ie.sogou.com'
elif i == 4:
proxy_host = 'h' + str(random.randint(0,10)) + '.dxt.bj.ie.sogou.com'
elif len(i) == 0:
proxy_host = 'h' + str(random.randint(0,10)) + '.edu.bj.ie.sogou.com'
print("正通过" + proxy_host + "进行代理,请将需要使用代理的程序设置代理地址为 127.0.0.1:8083 ")
server.serve_forever()