Python针对特定服务定制的代理工具V2.1-------(简述与2.0的区别之处)(python 反向代理)

网友投稿 292 2022-08-29


Python针对特定服务定制的代理工具V2.1-------(简述与2.0的区别之处)(python 反向代理)

今天抽时间更新下,把这两个版本都介绍下,版本2.0在版本2.1之前一周写出,由于这周忙于产品上线测试比较忙,关于这个项目的整理一致拖延到今天。

“Python针对特定服务定制的代理工具V2.1”是为了解决“Python针对特定服务定制的代理工具V2.0”中输出json数据乱码问题。在这个版本截图如下:

在这个版本中你发现在LIb包中少了zipdeal.py文件。因为这个文件是处理gzip文件的,导致我走了完路,通过网上查阅资料,处理zipdeal”导入,因为不需要使用这个包。

proxyHandler.py主要区别如下所示:

头文件的区别:

do_Post方法中的不同:

2.1版本中proxyHandler.py的源码:

#coding=utf8from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServerimport socketimport urllib,gzipfrom StringIO import StringIOclass proxyHandler(BaseHTTPRequestHandler): def do_POST(self): try: #服务响应的链接uri #类似 uri = self.path #根据协议把url分成两部分,一部分是协议,例如 #另一部分是服务和接口:xxx.xxx.com/api/v1/statistics #把另一部分内容放入到: hostAndInterface hostAndInterface = urllib.splittype(uri)[-1] #根据服务器拆分成两个部分,一部分是服务器:xxx.xxx.com #另一部分是接口:/api/v1/statistics host, interface = urllib.splithost(hostAndInterface) #根据/拆分成几个部分,获取最后一个元素的值,例如:statistics lastOfInterface=interface.split("/")[-1] #判断接口最后一个字符是否是:statistics,如果是则执行if之后的语句 if lastOfInterface=='statistics': #根据端口号拆分成两个部分:host、port host, port = urllib.splitnport(host) #如果端口号小于80,把端口号设置为80 if port < 0: port = 80 #把服务域名转换为服务IP host_ip = socket.gethostbyname(host) #从headers中删除headers['Proxy-Connection']的引用 # 然后把headers['Connection']设置为'keep-alive' del self.headers['Proxy-Connection'] self.headers['Connection'] = 'keep-alive' #请求的第一行,把该行数据赋值给send_data变量 #requestline的格式如:POST HTTP/1.1 send_data = self.requestline #重新创建个head用来保存新的heads值 head = '' for key, val in self.headers.items(): head = head + "%s: %s\r\n" % (key, val) #给请求的数据加上head和请求参数 send_data = send_data + head+'\r\n' #创建一个客户端套接字链接 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #客户端发送连接请求 client.connect((host_ip, port)) #客户端发送请求数据 client.sendall(send_data) #保存服务端返回的字段 data = '' while True: #把客户端从服务中接收的数据保存到一个临时变量tmp中 tmp = client.recv(8192) #判断接收的数据是否为空,如果为空跳出循环 if not tmp: break #不为空,把tmp中的数据传递给data data = data + tmp #断开链接 client.close() #把接收到的数据data写入到文件wfile中 self.wfile.write(data) #self.rfile存放的是请求数据而且数据被gzip #对请求中被gzip的数据进行夺取,并输出在屏幕中 realjson=gzip.GzipFile(fileobj=StringIO(self.rfile.read())).read() print realjson except Exception,e: print e def do_CONNECT(self): pass def do_GET(self): pass def test(): host='192.168.xxx.xxx' port=8888 try: server = HTTPServer((host, port), proxyHandler) print 'Welcome to the Server HTTP On %s Port %d...' %(host,port) server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down server' server.socket.close()if __name__ == '__main__': test()


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java Spring boot实现生成二维码
下一篇:Python针对特定服务定制的代理工具V2.0----------(__init__.py与Run.py)(python 全局代理)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~