2011-01-23 162 views
9

我正尝试在python中创建一个简单的网页过滤应用程序。我想这样做的方式是监视端口tcp 80/443(http)上的流量,如果有流量,我想在我让它通过之前检查一些东西。如果检查失败,我希望将用户重定向到我选择的页面。Python拦截来自浏览器的网页流量

所以我的问题是,当用户在浏览器中访问http://www.google.com时,是否有一种方法可以拦截该请求,并且有什么方法可以将它们重定向到我选择的另一个页面?

回答

7

您需要编写一个Web代理,并将您的Web客户端代理服务器设置为http://localhost:8000/(或任何代理正在监听)。然后

你的Web客户端将发送HTTP这样的:

GET http://www.google.com

到您的代理,它必须重新写为:

GET/

,并发送到www。 google.com,获取响应,然后在原始套接字上将其发送回客户端。请注意,解释是大量简化。

无论如何,它的所有标准的东西,我怀疑Python网络代理已经存在,你可以入侵。

编辑:http://proxies.xhaus.com/python/

+1

谢谢比较。由于这是一个过滤器,如果我想确保没有人禁用代理,我该怎么做?有没有办法让浏览器的默认目标留在我的代理中? – Sam 2011-01-24 17:20:38

3

这是从blog post我写了一段时间回来。使用webob和粘贴。 TransparentProxy将请求转发到请求指定的任何URL。您可以编写中间件来在请求交给transparentproxy之前对请求执行某些操作。

然后,只需将您的浏览器代理设置设置为您的代理正在运行的任何地址即可。

这个例子打印请求和响应,对于你的情况,你想检查一个404或302的响应状态或者任何和调度来编写代码。

from webob.dec import wsgify 
from paste import httpserver 
from paste.proxy import TransparentProxy 


def print_trip(request, response): 
    """ 
    just prints the request and response 
    """ 
    print "Request\n==========\n\n" 
    print str(request) 
    print "\n\n" 
    print "Response\n==========\n\n" 
    print str(response) 
    print "\n\n" 


class HTTPMiddleware(object): 
    """ 
    serializes every request and response 
    """ 

    def __init__(self, app, record_func=print_trip): 
     self._app = app 
     self._record = record_func 

    @wsgify 
    def __call__(self, req): 
     result = req.get_response(self._app) 
     try: 
      self._record(req.copy(), result.copy()) 
     except Exception, ex: #return response at all costs 
      print ex 
     return result 

httpserver.serve(HTTPMiddleware(TransparentProxy()), "0.0.0.0", port=8088) 

编辑:

这里的中间件我写的,所以我可以拦截的路径,并返回不同的响应的例子。我使用它来测试一个为生产硬编码的JavaScript重度应用程序,我拦截了config.js并输出了我自己的单元测试特定设置。

class FileIntercept(object): 
    """ 
    wsgi: middleware 
    given request.path will call wsgi app matching that path instead 
    of dispatching to the wrapped application 
    """ 
    def __init__(self, app, file_intercept={}): 
     self._app = app 
     self._f = file_intercept 

    def __call__(self, environ, start_response): 
     request = Request(environ) 
     if request.path.lower() in self._f: 
      response = request.get_response(self._f[request.path.lower()]) 
     else: 
      response = request.get_response(self._app) 
     return response(environ, start_response) 

,并作为一个例子,我会初始化它像这样....

app = FileIntercept(TransparentProxy(), 
          file_intercept={"/js/config.js":Response("/*new settings*/")}) 
httpserver.serve(HTTPMiddleware(app), "0.0.0.0", port=8088) 
0

如果它是一个特定的网站,如google.com,你总是可以poision hosts文件。这将是一个丑陋而简单的解决方案。

如果它是一去,它位于:

C:/windows/system32/drivers/hosts.txt 

这也是在etc在Linux上,不能确定是虽然...