该小软件旨在辅助高校BBS用户方便发帖之用,实现的主要功能包括登陆登出BBS站点,上传附件以及发表帖子功能。由于测试账号有限,目前本软件只支持白云黄鹤、水木社区、水木清华、饮水思源、科苑星空5个高校BBS站点。(如果有愿意提供账号以供开发测试之用的,本人非常感谢,联系方式:yysdsyl#qq.com)
软件下载地址:CampusBBSAssistant
软件效果展示:
实现部分:
根据软件的功能,软件模块的划分很清晰,就以下几个模块:
1、BBS版面信息抓取
2、登陆登出BBS站点
3、上传附件
4、发表帖子
下面会分别就每个模块挑一些值得说的部分说一说
1、版面信息抓取
这个没啥技术含量,就是正则匹配,纯体力活。5个BBS站点中,白云黄鹤的版面信息抓取最容易,水木清华、饮水思源、科苑星空的有子版面嵌套,稍微复杂一点,但也不费什么功夫。水木社区的版面信息的抓取是5个中最比较费事的一个,原因在于水木社区的所有页面的源代码都是JavaScript的(有兴趣的可以看看),所以抓取的时候得自己解析这些js代码,然后得到版面及相应的url信息。
2、登陆和登出BBS
这个模块干的事情单一,就是模拟登陆登出BBS,得到并维护返回的Cookie,以供后面的模块使用。python提供的cookielib、urllib、urllib2模块能方便的完成这个任务,http://blog.csdn.net/yysdsyl/archive/2009/11/01/4754462.aspx
这篇文章中有相关代码参考。
不过5个BBS站点中,白云黄鹤有点例外,它在登录成功后通过js返回Cookie信息,所以使用cookielib不能得到Cookie,而只能靠手工解析得到所需Cookie信息。
3、上传附件
白云黄鹤和饮水思源的附件上传是类似的,都是通过将附件上传到版面对应的上载区,上传成功后会返回附件的url地址,而用户需要手工将该url地址复制到发帖文章的正文中,这个过程其实对于用户来讲,是极度麻烦的。本软件帮助用户批量上传附件然后自动粘贴url地址到文章正文中。其余三个站点的附件上传相对人性化,附件上传后直接发表文章,附件后自动出现在帖子中,他们基本使用的一个模板,貌似是在KDS的上传模块基础上修改的。
上传模块中值得一说的是附件数据的encode,下面提供相关两函数,国外的一个人写的:
def encode_multipart_formdata(fields, files): """ Fields is a sequence of (name, value) elements for regular form fields. Files is a sequence of (name, filename, value) elements for data to be uploaded as files. Return (content_type, body) ready for httplib.HTTP instance ----------------------------------------------------------- PS: This function was wrritten by Wade Leftwich first and modified by James Jurack URL: http://code.activestate.com/recipes/146306/ """ BOUNDARY = mimetools.choose_boundary() CRLF = '/r/n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key, filename, value) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; / filename="%s"' % (key, filename)) L.append('Content-Type: %s' % get_content_type(filename)) L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body def get_content_type(filename): """ Return the content type of file. ----------------------------------- PS: This function was wrritten by Wade Leftwich first and modified by James Jurack URL: http://code.activestate.com/recipes/146306/ """ return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
4、发表帖子
这个模块基本没啥好说的,干的事情很简单,就是将文本正文、标题等发送出去即可。
PS:
程序最后用py2exe打包的时候遇到点麻烦,最初的版本里,我用到了python httplib2模块里面的东西,然后打包后凡是使用了httplib2的功能都不好使了,google了一把,有人遇到过同样的问题,而且基本锁定就是py2exe的问题,但是没有找到solution。后来自己就想办法在代码实现上完全绕开httplb2,使用具有差不多功能的模块或函数来代替,总算是解决问题了。
-------------------------------------------------------------------
本来也准备打包个linux版本的,没想到最后用cxfreeze打包后总大小100多M,哎,还是算了吧。