更新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?
  1. '''''
  2. Author:  Xiaoxia
  3. Contact: xiaoxia@xiaoxia.org
  4. Website: xiaoxia.org
  5. '''
  6. from threading import Thread, Lock
  7. from struct import unpack
  8. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
  9. from httplib import HTTPResponse
  10. from SocketServer import ThreadingMixIn
  11. import socket, os, select
  12. import time, sys, random
  13. import threading
  14. # Minimize Memory Usage
  15. threading.stack_size(128*1024)
  16. x_sogou_auth = "9CD285F1E7ADB0BD403C22AD1D545F40/30/853edc6d49ba4e27"
  17. proxy_host = "h0.edu.bj.ie.sogou.com"
  18. proxy_port = 80
  19. BufferSize = 8192
  20. RemoteTimeout = 15
  21. def calc_sogou_hash(t, host):
  22. s = (t + host + 'SogouExplorerProxy').encode('ascii')
  23. code = len(s)
  24. dwords = int(len(s)/4)
  25. rest = len(s) % 4
  26. v = unpack(str(dwords) + 'i'+str(rest)+'s', s)
  27. for vv in v:
  28. if(type(vv)==type('i')):
  29. break
  30. a = (vv & 0xFFFF)
  31. b = (vv >> 16)
  32. code += a
  33. code = code ^ (((code<<5)^b) << 0xb)
  34. # To avoid overflows
  35. code &= 0xffffffff
  36. code += code >> 0xb
  37. if rest == 3:
  38. code += ord(s[len(s)-2]) * 256 + ord(s[len(s)-3])
  39. code = code ^ ((code ^ (ord(s[len(s)-1])*4)) << 0x10)
  40. code &= 0xffffffff
  41. code += code >> 0xb
  42. elif rest == 2:
  43. code += ord(s[len(s)-1]) * 256 + ord(s[len(s)-2])
  44. code ^= code << 0xb
  45. code &= 0xffffffff
  46. code += code >> 0x11
  47. elif rest == 1:
  48. code += ord(s[len(s)-1])
  49. code ^= code << 0xa
  50. code &= 0xffffffff
  51. code += code >> 0x1
  52. code ^= code * 8
  53. code &= 0xffffffff
  54. code += code >> 5
  55. code ^= code << 4
  56. code = code & 0xffffffff
  57. code += code >> 0x11
  58. code ^= code << 0x19
  59. code = code & 0xffffffff
  60. code += code >> 6
  61. code = code & 0xffffffff
  62. return hex(code)[2:].rstrip('L').zfill(8)
  63. class Handler(BaseHTTPRequestHandler):
  64. remote = None
  65. # Ignore Connection Failure
  66. def handle(self):
  67. try:
  68. BaseHTTPRequestHandler.handle(self)
  69. except socket.error: pass
  70. def finish(self):
  71. try:
  72. BaseHTTPRequestHandler.finish(self)
  73. except socket.error: pass
  74. # CONNECT Data Transfer
  75. def transfer(self, a, b):
  76. fdset = [a, b]
  77. while True:
  78. r,w,e = select.select(fdset, [], [])
  79. if a in r:
  80. data = a.recv(BufferSize)
  81. if not data: break
  82. b.sendall(data)
  83. if b in r:
  84. data = b.recv(BufferSize)
  85. if not data: break
  86. a.sendall(data)
  87. def sogouProxy(self):
  88. if self.remote is None or self.lastHost != self.headers["Host"]:
  89. self.remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  90. self.remote.settimeout(RemoteTimeout)
  91. self.remote.connect((proxy_host, proxy_port))
  92. self.remote.sendall(self.requestline.encode('ascii') + b"\r\n")
  93. # Add Sogou Verification Tags
  94. self.headers["X-Sogou-Auth"] = x_sogou_auth
  95. t = hex(int(time.time()))[2:].rstrip('L').zfill(8)
  96. self.headers["X-Sogou-Tag"] = calc_sogou_hash(t, self.headers['Host'])
  97. self.headers["X-Sogou-Timestamp"] = t
  98. headerstr = str(self.headers).replace("\r\n", "\n").replace("\n", "\r\n")
  99. self.remote.sendall(headerstr.encode('ascii') + b"\r\n")
  100. # Send Post data
  101. if self.command == 'POST':
  102. self.remote.sendall(self.rfile.read(int(self.headers['Content-Length'])))
  103. response = HTTPResponse(self.remote, method=self.command)
  104. response.begin()
  105. # Reply to the browser
  106. status = "HTTP/1.1 " + str(response.status) + " " + response.reason
  107. self.wfile.write(status.encode('ascii') + b'\r\n')
  108. hlist = []
  109. for line in response.msg.headers: # Fixed multiple values of a same name
  110. if 'TRANSFER-ENCODING' not in line.upper():
  111. hlist.append(line)
  112. self.wfile.write("".join(hlist) + b'\r\n')
  113. if self.command == "CONNECT" and response.status == 200:
  114. return self.transfer(self.remote, self.connection)
  115. else:
  116. while True:
  117. response_data = response.read(BufferSize)
  118. if not response_data: break
  119. self.wfile.write(response_data)
  120. do_POST = do_GET = do_CONNECT = sogouProxy
  121. class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
  122. address_family = socket.AF_INET6
  123. server_address = ("", 1998)
  124. server = ThreadingHTTPServer(server_address, Handler)
  125. # Random Target Proxy Server
  126. proxy_host = 'h' + str(random.randint(0,5)) + '.edu.bj.ie.sogou.com'
  127. print('Proxy over %s.\nPlease set your browser\'s proxy to %s.' % (proxy_host, server_address))
  128. try:
  129. server.serve_forever()
  130. except:
  131. os._exit(1)

更新Sogou代理服务器程序,支持HTTPS相关推荐

  1. 让代理服务器支持HTTPS很难吗?

    转:http://www.site-digger.com/html/articles/20151203/107.html 我们开展稳定高匿名HTTP代理业务以来,我听到客户咨询最多的问题之一就是&qu ...

  2. (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新

    iOS开发技术分享群 147787076 [友盟+]友盟统计分析SDK已全面支持HTTPS,请IOS开发者及时升级文档(http://dev.umeng.com/analytics/ios-doc/i ...

  3. 电子木鱼微信云开发小程序,支持激励视频流量主源码下载(已更新)

    这两天经常有人问小编说有没有电子木鱼这个小程序源码 说网上很火,然后小编去搜了一下还真是 一个挺简单的一个小程序,居然每天最少300+人以上访问还有一个更夸张居然一万+ 然后小编就大半夜的给大家整来了 ...

  4. Nginx如何支持HTTPS?手把手教贼简单!

    随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性.在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择.今天我们来讲下如何从Nginx入手,从 ...

  5. go get 代理 找不到包_初步看看Go1.10 支持 HTTPS 代理

    Go1.10 支持 HTTPS 代理 Go1.9 出来后 6 个多月的时间,Go1.10 就被发布.新版本带来大大小小的变化(发行说明),但是我想谈谈有关 net/http 包的改变.1.10 版本支 ...

  6. Ubuntu安装Docker引擎和支持HTTPS的docker-registry服务

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1729858 虽然 ...

  7. Canonical通过Flutter启用Linux桌面应用程序支持

    子标题:Ubuntu团队为所有Linux发行版上的Flutter应用程序制作了一个新的基于GTK +的主机. 此文翻译自:https://medium.com/flutter/announcing-f ...

  8. 多DZ和UC同步登陆状态(支持HTTPS,PHP7.4.3)

    前端时间一个QQ上找到我的朋友求助在HTTPS下实现用户在多个DZ同步退出登陆状态,我摸索了一下 整理出了修改方法. 2020年3月16日更新: 本文发布一年了,最近有朋友反应使用最新版的DZ(Dis ...

  9. iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客

    一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...

  10. yuml 保存为图片_Towxml 3.0 让微信小程序支持 LaTex 数学公式及 yuml 流程图

    Towxml 3.0 让微信小程序支持 LaTex 数学公式及 yuml 流程图 Towxml 是一个让小程序可以解析 Markdown,html 的解析库. 能够使小程序完美解析 Markdown ...

最新文章

  1. c语言 如何读多种数据类型 非类,c语言程序设计教学大纲(非电气类)文档.doc
  2. PDF发明者逝世,曾因学生建议转行计算机,享年81岁
  3. python3 多进程 multiprocessing 报错 AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘
  4. php 将二维数组合并,PHP二维数组合并排重的两种方式
  5. Imageloader7-获取图片需要显示的大小
  6. 替换IP java代码
  7. 转:从零开始开发一款Android App (from 简书)
  8. 联想K系引领智能电视潮流,Android 4.0将成行业标配
  9. 9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法
  10. oracle创建数据库步骤
  11. undefined reference to `std::ios_base::Init::Init() 解决
  12. HTML5 CSS选择器总结(强烈推荐)
  13. Spring消息之STOMP
  14. 大家知道,我的废话很多,所以来凑热闹
  15. 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
  16. uniapp 支付宝小程序 获取用户信息 ISV权限不足
  17. 猿创征文 | 国产数据库之南大通用数据库详解安装和使用
  18. Astalavista被蹂躏过程 转载自baoz net
  19. 【JavaScript-移动端常用事件】了解移动端touch触摸事件
  20. 天梯赛 L1-054 福到了 (15 分) C++

热门文章

  1. 编译android源码 太慢,记编译Android源码的经历
  2. python correlation_相关性系数介绍+python代码实现 correlation analysis
  3. java 检测 类型_[Java教程]javascript类型与类型检测
  4. Ansbile实战经验
  5. 用脆弱性评估流程击败黑客
  6. ipsec在企业网中的应用(IKE野蛮模式)(转)
  7. Intellij IDEA 备忘录
  8. null值是不会算在count以内的
  9. How Touch Screen Monitors Work
  10. 提高短线操作成功率的诀窍!