Skip to content

Instantly share code, notes, and snippets.

@timesking
Created December 13, 2011 14:47
Show Gist options
  • Save timesking/1472374 to your computer and use it in GitHub Desktop.
Save timesking/1472374 to your computer and use it in GitHub Desktop.
用Python写一个本地Sogou代理服务器程序
'''
Hey guys!
This is a the first python program(except hello worlds) I have written.
With HTTPServer, I can easily write a webserver.
Python is such a powerful language that many complicated problems can be
solved by a few lines of code.
Welcome to visit my blog: www.xiaoxia.org
The proxy program is just coded for fun <img src="http://xiaoxia.org/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley">
'''
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
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", 1998), Handler)
#print(calc_sogou_hash('4d8cdaed', 'www.youku.com'))
print('Please select your network:\n\
1. CERNET(The China Education and Research Network)\n\
2. CTCNET(China Telecommunications Corporation)\n\
3. CNCNET(China NetCom)\n\
4. DXT(Dian Xin Tong)\n')
i = int(input('Input the number: '))
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'
print('Proxy over ' + proxy_host)
server.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment