简单的实现谷歌的代理:

架构就是下面这么简单。

=================

my server outside GFW  |    <----------------------> your browser  visit my server at port 8080

=================

代码如下:

#coding=utf-8
from twisted.web import resource, server
from twisted.internet import reactor,endpoints
from twisted.python import log
import urllib2
import urllib
import sys
from twisted.web.util import Redirect
#log.startLogging(sys.stdout) def get_redirect_url(url, prefix):
if not url:
return ''
index = url.find(prefix)
if index>-1:
index2 = url.find('&sa=')
return url[index:index2]
return url class router(resource.Resource):
def getChild(self, path, request):
url = r'https://www.google.com'
if path=="":
return Index(url)
else:
new_url = str(request.uri)
new_url = get_redirect_url(new_url,'http://')
new_url = get_redirect_url(new_url,'https://')
if new_url and (new_url.find('http://')>-1 or new_url.find('https://')>-1):
return Redirect(new_url)
return Index(url+ request.uri) class Index(resource.Resource):
def __init__(self, url):
self.url = url def render_GET(self, request):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36'}
req = urllib2.Request(self.url,headers=headers)
res = urllib2.urlopen(req)
return res.read() if __name__=='__main__':
rsc = router()
f = server.Site(rsc)
endpoints.serverFromString(reactor, 'tcp:8080').listen(f)
reactor.run()

  

干脆做成启动任务,参考这里:http://www.cnblogs.com/Tommy-Yu/p/4105942.html.

发现一个问题,就是,神马链接都给代理了,这样不行,搜索出来的链接得丢出去。改下router的getChild的实现。否则若是你的vps计费,流量得耗光。

解决这个问题,要把链接给redirect出去。方案有两种:

在不同的地方使用不同的方法:
  • 在 getChild 中使用 twisted.web.util.Redirect
  • 在 render 中使用 twisted.web.util.redirectTo
在 getChild 中:
 
class Index(Resource):
def getChild(self, path, request):
from twisted.web.util import Redirect return Redirect('/login')

  

 
在 render render_GET render_POST 中:

class Index(Resource):
def render(self, request):
from twisted.web.util import redirectTo
return redirectTo('/login', request)

  

使用twisted.web实现代理服务器的更多相关文章

  1. Python - twisted web 入门学习之一

    原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...

  2. Twisted web开发教程

    最近在网上看到一篇twisted web开发文章,将它实践了一下,twisted 提供基本的url路由 和 控制器,模板与模型需要外部扩展 1.目录浏览 2.get请求 3.url路由 4.接受带参数 ...

  3. Twisted的WEB开发

    1   简介 在WEB开发中,偶尔需要对HTTP协议更多底层细节进行控制,这时的django/web.py等等显然无法满足要求,所以只好求助于Twisted了.使用Twisted进行WEB开发,其实更 ...

  4. twisted学习笔记No.3 Web Clients

    原创博文,转载请注明出处. 这一章我们学习利用twisted建立web 客户端. twisted.web.client.getPage用来异步下载一个页面,并且返回一个deferred from tw ...

  5. HTTP架构介绍(1) Web服务器和代理服务器

    HTTP应用协议本身是不能运行的,它需是需要架构在硬件和软件解决方案上,才能在万维网上提供高效的传输服务. 在这系列的文章中,我们将会了解到以下概念: Web服务器 代理服务器 缓存 网关.信道和中继 ...

  6. http twisted

    Sunday, September 30th, 2007 Twisted的WEB开发 作者: gashero <harry.python@gmail.com> 目录 1   简介 2    ...

  7. Mina、Netty、Twisted一起学(八):HTTP服务器

    HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...

  8. Windows下配置Squid反向代理服务器

    Squid是一款类Unix系统下非常流行的服务器软件,其最重要的功能就是在客户端和服务端之间建立缓存.因而Squid可以用作反向代理,部署多级缓存或者搭建CDN等,无论名称是什么,本质上都是一样的.目 ...

  9. 【转】Python Twisted介绍

    Python Twisted介绍 作者:Jessica McKellar 原文链接 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开 ...

随机推荐

  1. Office2010 pro附+激活工具

    office2003经典的办公,office2010,很不错的办公工具配合Win7,就绝配! office2010,我也近几天接手她,慢慢熟悉... 00安装: 01激活: 内含office2010安 ...

  2. hdu1231 最大连续子序列

    #include<stdio.h> #include<string.h> #define maxn 10010 int a[maxn],dp[maxn]; int main() ...

  3. C语言结构体的初始化

    今天在工作时,看到了奇葩的结构体初始化方式,于是我查了一下C99标准文档和gcc的说明文档,终于搞清楚是怎么回事了. 假设有如下结构体定义: typedef struct { int a, b, c; ...

  4. Yii2分页

    Yii中的分页功能主要由yii\web: Linkable接口.yii\widgets: LinkPager类和yii\data: Pagination类三个组成 yii\data: Paginati ...

  5. poj 3463 最短路与次短路&&统计个数

    题意:求最短路和比最短路长度多1的次短路的个数 本来想图(有)方(模)便(版)用spfa的,结果妹纸要我看看dijkstra怎么解.... 写了三遍orz Ver1.0:堆优化+邻接表,WA //不能 ...

  6. [IOS Delegate和协议]

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/25655443 作者:小马 代理和协议的语法这里不赘述,自己查资料. 这个demo的 ...

  7. HDU 1285 确定比赛名次

    传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. jprofiler安装与使用

    1: 修改/etc/profile 增加以下内容: JPROFILER_HOME=/opt/jprofiler9/bin/linux-x64export LD_LIBRARY_PATH=$LD_LIB ...

  9. Why The Golden Age Of Machine Learning is Just Beginning

    Why The Golden Age Of Machine Learning is Just Beginning Even though the buzz around neural networks ...

  10. php实现文件安全下载

    public function downloads($name){ $name_tmp = explode("_",$name); $type = $name_tmp[0]; $f ...