基於PyQt開發的第二個小程式:高校BBS發帖輔助軟體(CampusBBSAssistant)

來源:互聯網
上載者:User

該小軟體旨在輔助高校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,哎,還是算了吧。

 

   

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.