使用twisted.web实现代理服务器

简单的实现谷歌的代理:

架构就是下面这么简单。

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

 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)

  

 

转载于:https://www.cnblogs.com/Tommy-Yu/p/4105393.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值