Archive

Archive for January, 2012

使用Twisted的HTTPDownloader通过socks代理下载网页

January 15th, 2012 No comments

心血来潮想要学习一下使用twsited库如何下载网页内容。同时为了能下载一下在天朝不可见的网页,我这里需要使用ssh代理。我在网上下载了一个为twsited制作的socks5的客户端。但是使用的时候发现有的时候和twsited.web.client.HTTPDownloader一起使用会出现问题。不得以查看了一下twisted.web.client.HTTPPageGetter的代码。发现当第一次GET请求但是服务器返回301的时候,HTTPPageGetter不会使用socks代理的地址去创建一个新的连接。所以我做了如下的改动。

首先,在socks5.py的ClientFactory的初始化函数中对otherFactory加入一个指向自己的引用(习惯了这种叫法)。

class ClientFactory (protocol.ClientFactory):
    def __init__(self, sockshost, socksport, host, port, otherFactory,
        method="CONNECT", login=None, password=None, timeout=60,
        readableID=None):
        ...
        self.sockshost      = sockshost
        self.socksport      = socksport
        self.host           = host
        self.port           = port
        self.method         = method
        self.login          = login
        self.password       = password
        self.otherFactory   = otherFactory
        otherFactory.otherFactory = self #加入一个指向自己的引用,这样就可以在HTTPPageGetter的派生类中使用自己的属性
        self.timeout        = timeout
        self.readableID     = readableID

然后就是从HTTPPageDownloader派生一个类,并且overwrite其中的handleStatus_301方法,主要是在建立一个新的连接的时候使用socks5.ClientFactory而不是默认是的HTTPDownloader。如下:

class SocksPageDownloader(client.HTTPPageDownloader):
    def handleStatus_301(self):
        l = self.headers.get('location')
        if not l:
            self.handleStatusDefault()
            return
        url = l[0]
        if self.followRedirect:
            scheme, host, port, path = client._parse(url, defaultPort=self.factory.otherFactory.port )
            self.factory._redirectCount += 1
            if self.factory._redirectCount >= self.factory.redirectLimit:
                err = error.InfiniteRedirection(self.status,'Infinite redirection detected',location=url)
                self.factory.noPage(failure.Failure(err))
                self.quietLoss = True
                self.transport.loseConnection()
                return
            self._completelyDone = False
            self.factory.setURL(url)

            sockhost = self.factory.otherFactory.sockshost#使用socks server的地址进行连接
            sockport = self.factory.otherFactory.socksport

            self.factory.otherFactory.host = host#修改sock5.ClientFactory的属性,以便连接到新的地址上

            if self.factory.scheme == 'https':
                from twisted.internet import ssl
                contextFactory = ssl.ClientContextFactory()
                reactor.connectSSL(sockhost, sockport,self.factory.otherFactory, contextFactory)
            else:#在connectTCP里面传入的factory是socks5.ClientFactory
                reactor.connectTCP( sockhost, sockport,self.factory.otherFactory)
        else:
            self.handleStatusDefault()
            self.factory.noPage( failure.Failure(error.PageRedirect(self.status, self.message, location = url)))
        self.quietLoss = True
        self.transport.loseConnection()

另外建立一个HTTPDownloader的配生类并且修改其中的protocol为SockPageDownloader即可

class SocksDownloaderFactory(client.HTTPDownloader):
    protocol = SockPageDownloader

下面是一段测试代码

def download():
    hd = SockDownloaderFactory("http://www.twitter.com","./foo")
    cf = socks5.ClientFactory("127.0.0.1",7070,"www.twitter.com",80,hd)
    reactor.connectTCP("127.0.0.1",7070,cf)#127.0.0.1:7070是socks代理的地址
    reactor.run()

如此就可以使用twsited的HTTPDownloader通过socks5代理下载网页数据了

downloadviasocks.tar

Categories: programming Tags: ,

ubuntu/mint 中修改显示器的分辨率

January 14th, 2012 Comments off

我在用virtual box新安装了一个linux mint 12, 但是最近在使用的时候发现一个问题。当我用Right_Ctrl + F键全屏进入mint的时候,发现整个屏幕明显没有被占满。上下留出一大段的黑色。看起来实在不爽。于是看了一下当前的屏幕分辨率,居然是1440X793. 这个太没有道理了,我的显示器是分辨率是1440×900的,不知道从哪个地方跑出这么一个乱七八糟的分辨率来。

我开始认为应该是virtual box中设置错误。但是我怎么都没有找到在什么地方可以设置这个分辨率。于是我打算在mint里面修改以下这个分辨率。但是12(也就是ubuntu 11.10)里面已经找不到/etc/X11/xorg.conf这个文件了。在google之后我找到了方法。

首先使用xrandr命令列出当前的模式

RoyM1 ~ # xrandr
Screen 0: minimum 64 x 64, current 1440 x 900, maximum 32000 x 32000
VBOX0 connected 1440x793+0+0 0mm x 0mm
   1440x793       60.0 +
   1024x768       60.0
   800x600        60.0
   640x480        60.0

发现里面没有1440×900这个模式。于是使用xrandr添加一个新的模式进去。在添加之前,首使用cvt列出所需的模式的完整配置。然后添加这个新的模式并且应用。如下

RoyM1 ~ # cvt 1440 900
# 1440x900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz
Modeline "1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync
RoyM1 ~ # xrandr --newmode "1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync
RoyM1 ~ # xrandr --addmode VBOX0 "1440x900_60.00" 
RoyM1 ~ # xrandr --output VBOX0 --mode "1440x900_60.00"
RoyM1 ~ #

这样以来,整个屏幕空间都被利用上了。感觉明显好了许多

Categories: mutter Tags: