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()


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