源代碼出處: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()