更新Sogou代理服务器程序,支持HTTPS
更新Sogou代理服务器程序,支持HTTPS « Xiaoxia[PG]
更新Sogou代理服务器程序,支持HTTPS
这个是对之前用Python写的一个Sogou本地代理服务器的更新版本,新版本支持了HTTPS连接,实现了CONNECT请求。
我发现,Sogou上的squid服务器,限制了CONNECT命令只能够连接远程主机的443端口,其他的端口都返回403 Forbidden状态。教育网的用户,可以使用我在学校建立的HTTP代理,scut.tk:1998。支持IPv4和IPv6的访问。
Windows Binary 下载
sogou.zip (Win32, IPv4)
上代码:
view plaincopy to clipboardprint?
- '''''
- Author: Xiaoxia
- Contact: xiaoxia@xiaoxia.org
- Website: xiaoxia.org
- '''
- from threading import Thread, Lock
- from struct import unpack
- from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
- from httplib import HTTPResponse
- from SocketServer import ThreadingMixIn
- import socket, os, select
- import time, sys, random
- import threading
- # Minimize Memory Usage
- threading.stack_size(128*1024)
- x_sogou_auth = "9CD285F1E7ADB0BD403C22AD1D545F40/30/853edc6d49ba4e27"
- proxy_host = "h0.edu.bj.ie.sogou.com"
- proxy_port = 80
- BufferSize = 8192
- RemoteTimeout = 15
- 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):
- remote = None
- # Ignore Connection Failure
- def handle(self):
- try:
- BaseHTTPRequestHandler.handle(self)
- except socket.error: pass
- def finish(self):
- try:
- BaseHTTPRequestHandler.finish(self)
- except socket.error: pass
- # CONNECT Data Transfer
- def transfer(self, a, b):
- fdset = [a, b]
- while True:
- r,w,e = select.select(fdset, [], [])
- if a in r:
- data = a.recv(BufferSize)
- if not data: break
- b.sendall(data)
- if b in r:
- data = b.recv(BufferSize)
- if not data: break
- a.sendall(data)
- def sogouProxy(self):
- if self.remote is None or self.lastHost != self.headers["Host"]:
- self.remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.remote.settimeout(RemoteTimeout)
- self.remote.connect((proxy_host, proxy_port))
- self.remote.sendall(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
- headerstr = str(self.headers).replace("\r\n", "\n").replace("\n", "\r\n")
- self.remote.sendall(headerstr.encode('ascii') + b"\r\n")
- # Send Post data
- if self.command == 'POST':
- self.remote.sendall(self.rfile.read(int(self.headers['Content-Length'])))
- response = HTTPResponse(self.remote, method=self.command)
- response.begin()
- # Reply to the browser
- status = "HTTP/1.1 " + str(response.status) + " " + response.reason
- self.wfile.write(status.encode('ascii') + b'\r\n')
- hlist = []
- for line in response.msg.headers: # Fixed multiple values of a same name
- if 'TRANSFER-ENCODING' not in line.upper():
- hlist.append(line)
- self.wfile.write("".join(hlist) + b'\r\n')
- if self.command == "CONNECT" and response.status == 200:
- return self.transfer(self.remote, self.connection)
- else:
- while True:
- response_data = response.read(BufferSize)
- if not response_data: break
- self.wfile.write(response_data)
- do_POST = do_GET = do_CONNECT = sogouProxy
- class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
- address_family = socket.AF_INET6
- server_address = ("", 1998)
- server = ThreadingHTTPServer(server_address, Handler)
- # Random Target Proxy Server
- proxy_host = 'h' + str(random.randint(0,5)) + '.edu.bj.ie.sogou.com'
- print('Proxy over %s.\nPlease set your browser\'s proxy to %s.' % (proxy_host, server_address))
- try:
- server.serve_forever()
- except:
- os._exit(1)
更新Sogou代理服务器程序,支持HTTPS相关推荐
- 让代理服务器支持HTTPS很难吗?
转:http://www.site-digger.com/html/articles/20151203/107.html 我们开展稳定高匿名HTTP代理业务以来,我听到客户咨询最多的问题之一就是&qu ...
- (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新
iOS开发技术分享群 147787076 [友盟+]友盟统计分析SDK已全面支持HTTPS,请IOS开发者及时升级文档(http://dev.umeng.com/analytics/ios-doc/i ...
- 电子木鱼微信云开发小程序,支持激励视频流量主源码下载(已更新)
这两天经常有人问小编说有没有电子木鱼这个小程序源码 说网上很火,然后小编去搜了一下还真是 一个挺简单的一个小程序,居然每天最少300+人以上访问还有一个更夸张居然一万+ 然后小编就大半夜的给大家整来了 ...
- Nginx如何支持HTTPS?手把手教贼简单!
随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性.在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择.今天我们来讲下如何从Nginx入手,从 ...
- go get 代理 找不到包_初步看看Go1.10 支持 HTTPS 代理
Go1.10 支持 HTTPS 代理 Go1.9 出来后 6 个多月的时间,Go1.10 就被发布.新版本带来大大小小的变化(发行说明),但是我想谈谈有关 net/http 包的改变.1.10 版本支 ...
- Ubuntu安装Docker引擎和支持HTTPS的docker-registry服务
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1729858 虽然 ...
- Canonical通过Flutter启用Linux桌面应用程序支持
子标题:Ubuntu团队为所有Linux发行版上的Flutter应用程序制作了一个新的基于GTK +的主机. 此文翻译自:https://medium.com/flutter/announcing-f ...
- 多DZ和UC同步登陆状态(支持HTTPS,PHP7.4.3)
前端时间一个QQ上找到我的朋友求助在HTTPS下实现用户在多个DZ同步退出登陆状态,我摸索了一下 整理出了修改方法. 2020年3月16日更新: 本文发布一年了,最近有朋友反应使用最新版的DZ(Dis ...
- iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客
一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...
- yuml 保存为图片_Towxml 3.0 让微信小程序支持 LaTex 数学公式及 yuml 流程图
Towxml 3.0 让微信小程序支持 LaTex 数学公式及 yuml 流程图 Towxml 是一个让小程序可以解析 Markdown,html 的解析库. 能够使小程序完美解析 Markdown ...
最新文章
- c语言 如何读多种数据类型 非类,c语言程序设计教学大纲(非电气类)文档.doc
- PDF发明者逝世,曾因学生建议转行计算机,享年81岁
- python3 多进程 multiprocessing 报错 AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘
- php 将二维数组合并,PHP二维数组合并排重的两种方式
- Imageloader7-获取图片需要显示的大小
- 替换IP java代码
- 转:从零开始开发一款Android App (from 简书)
- 联想K系引领智能电视潮流,Android 4.0将成行业标配
- 9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法
- oracle创建数据库步骤
- undefined reference to `std::ios_base::Init::Init() 解决
- HTML5 CSS选择器总结(强烈推荐)
- Spring消息之STOMP
- 大家知道,我的废话很多,所以来凑热闹
- 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
- uniapp 支付宝小程序 获取用户信息 ISV权限不足
- 猿创征文 | 国产数据库之南大通用数据库详解安装和使用
- Astalavista被蹂躏过程 转载自baoz net
- 【JavaScript-移动端常用事件】了解移动端touch触摸事件
- 天梯赛 L1-054 福到了 (15 分) C++
热门文章
- 编译android源码 太慢,记编译Android源码的经历
- python correlation_相关性系数介绍+python代码实现 correlation analysis
- java 检测 类型_[Java教程]javascript类型与类型检测
- Ansbile实战经验
- 用脆弱性评估流程击败黑客
- ipsec在企业网中的应用(IKE野蛮模式)(转)
- Intellij IDEA 备忘录
- null值是不会算在count以内的
- How Touch Screen Monitors Work
- 提高短线操作成功率的诀窍!