python写的sogou代理全网加速器,特别适合于教育网(稍改动)

源代码出处: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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章