該小軟體旨在輔助高校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):<br /> """<br /> Fields is a sequence of (name, value) elements for regular<br /> form fields. Files is a sequence of (name, filename, value)<br /> elements for data to be uploaded as files.<br /> Return (content_type, body) ready for httplib.HTTP instance<br /> -----------------------------------------------------------<br /> PS: This function was wrritten by Wade Leftwich first<br /> and modified by James Jurack<br /> URL: http://code.activestate.com/recipes/146306/<br /> """<br /> BOUNDARY = mimetools.choose_boundary()<br /> CRLF = '/r/n'<br /> L = []<br /> for (key, value) in fields:<br /> L.append('--' + BOUNDARY)<br /> L.append('Content-Disposition: form-data; name="%s"' % key)<br /> L.append('')<br /> L.append(value)<br /> for (key, filename, value) in files:<br /> L.append('--' + BOUNDARY)<br /> L.append('Content-Disposition: form-data; name="%s"; /<br /> filename="%s"' % (key, filename))<br /> L.append('Content-Type: %s' % get_content_type(filename))<br /> L.append('')<br /> L.append(value)<br /> L.append('--' + BOUNDARY + '--')<br /> L.append('')<br /> body = CRLF.join(L)<br /> content_type = 'multipart/form-data; boundary=%s' % BOUNDARY</p><p> return content_type, body</p><p>def get_content_type(filename):<br /> """<br /> Return the content type of file.<br /> -----------------------------------<br /> PS: This function was wrritten by Wade Leftwich first<br /> and modified by James Jurack<br /> URL: http://code.activestate.com/recipes/146306/<br /> """<br /> return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
4、發表文章
這個模組基本沒啥好說的,乾的事情很簡單,就是將文本本文、標題等發送出去即可。
PS:
程式最後用py2exe打包的時候遇到點麻煩,最初的版本裡,我用到了python httplib2模組裡面的東西,然後打包後凡是使用了httplib2的功能都不好使了,google了一把,有人遇到過同樣的問題,而且基本鎖定就是py2exe的問題,但是沒有找到solution。後來自己就想辦法在代碼實現上完全繞開httplb2,使用具有差不多功能的模組或函數來代替,總算是解決問題了。
-------------------------------------------------------------------
本來也準備打包個linux版本的,沒想到最後用cxfreeze打包後總大小100多M,哎,還是算了吧。