青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-145  評論-173  文章-70  trackbacks-0
最近準備把博客整體遷移到GitHub上面,但是由于本博客的內容較多,因此想找個辦法進行遷移,無奈雖然C++博客提供了備份的功能,但是保存的XML文件不是標準的Wordpress的XML格式,因此還是得自己進行手動遷移,無奈過去記錄的水文較多,棄之可惜,因此就想著如何進行博客遷移,如何抓取博客內容等一系列的問題。

正好,在網上搜索的時候,發現CSDN等網站提供MetaWeblog的標準接口用于第三方程序的接入,書寫博客,發布,刪除等一系列操作,而C++正好提供了相關接口,只需要登錄到你的賬戶,在選項--配置中,選擇允許Web Service以及MetaWeblog,并訪問下面提供的MetaWeblog接口即可。

為此,好好研讀了一下C++博客提供的接口,基本功能都已經提供了API接口說明,如writePost,getPost等等,對于其中用到的結構體,如Post等,也定義了相關的成員變量的組成,類型等等,因此,實際上是比較好做的。為此,我就開始動手,編寫自己的博客遷移工具了。

首先確定使用的平臺和技術,經過研究,決定使用Apache XML-RPC庫,并使用Java實現。
其次,編寫對應的函數和功能,初期開發講究前期驗證,為此先凌亂的寫了幾個基本函數,寫死一些變量和定義,以及所需要的Key,然后利用自己博客的一篇文章進行驗證,證明能夠獲取到對應的信息,最后才保存到HTML文件中,打開后發現所需要的基本內容都完好保存,因此可以進行后續工作。
后續,主要進行擴展功能的展開,包括對其他接口的使用,如獲取近期所有博客,獲取分類信息,獲取博客信息等等,另外,經過重構后,將相關的工具函數都轉移到一個類中實現,并盡量做到代碼復用,這個過程經歷了幾次,漸漸發現最初的代碼慘不忍睹,而重構之后,將不變的如標記字段,服務商提供地址等等,都固定在某個類中,一旦需要應用到其他平臺,如CSDN博客,只需要做最小的修改即可,方便代碼復用。
最后,進行了簡單測試,并發布到Github中進行版本管理和備份,填寫相關log,后續可能會繼續做二次開發。

上面只是簡單介紹使用的技術和開發流程,至于具體的細節實現,下面就幾個重點來講解:
1. 如何發起網絡連接,并從服務器那邊獲取到所需要的博客信息?
利用Apache的XML-RPC庫實現,非常簡單,只需要進行簡單配置即可,代碼如下:
config =  new XmlRpcClientConfigImpl();
client = new XmlRpcClient();
config.setServerURL(new URL(url));
client.setConfig(config); 
這樣,就完成了客戶端的初始化和配置工作,此后,就可以直接利用此客戶端來發現連接請求,獲取對應的信息了。
List params = new ArrayList();
params.add("test");
params.add(USER_NAME);
params.add(USER_PASSWORD);
// 必須使用Object數組,List或者其他數組不行
Object[] arr = (Object[])client.execute(GET_BLOGS_METHOD, params);
發起一次請求時,只需要先配置好參數,根據每一個API文檔定義的函數參數,放入到一個數組中,然后執行對應的函數,函數名使用GET_BLOGS_METHOD之類的保存下來,即可獲得對應的結果。

2. 如何處理獲得的結果?
由于類型都是由API文檔中定義的,比如一篇博文的信息定義為一個Post對象,而這個對象是它定義的類,包含有標題,時間等成員,成員的類型還可能不同,比如大部分是String類型,但是也有如Date時間這樣的類型。如何獲取呢?
對于一個Post對象,獲得其實就是一個個鍵值對,比如Key為“title”,value為對應的值“我的博客文章”等等,因此,可以使用Java中的Map來保存一個個鍵值對,但是這里我們會遇到一個疑問,Post對象既然是按照一個個鍵值對來保存,如
{
 "title", "我的博客標題"
 "description", "我的博客正文"
 "date", "博客發布時間"
}
那么,可否就直接用Map<String, String>來保存每一個鍵值,然后根據鍵來分別讀取信息呢?答案是否定的,因此并非所有的類型都是統一的,Key當然都是String類型,因為文檔中已經定義好了,但是Value卻可能不同,如Date對應的值是一個Date類型,而title對應的值是String類型,而他們都是隸屬于Post對象的,如何來處理呢?
這里,我使用的是Map<String, Object>來存放每一個鍵值對,然后根據類型獲取信息,代碼如下:
        String title = getPostTitle(result);
        if (title != null){
            System.out.println(title);
            saveString += title + "<br/>"; // 文章標題,并以HTML形式存放
        }

        Date date = getPostDate(result);
        if (date != null) {
            String dateString = getPostTime(date);
            System.out.println(dateString);
            saveString += dateString + "<br/>";
        }

        String article = getPostArticle(result);
        if (article != null) {
            System.out.println(article);
            saveString += article + "<br/>";
        }
當然,這里用到了子函數實現,但實際的效果就是,根據API文檔中的類型,在獲得value的時候,將Object類型強制轉換成需要的類型,比如,key為title的時候,知道值應該是String,因此就將值轉換成String類型。Key位datedTime的時候,值的類型應該是Date類型,就將它轉換成Date類型。這樣,最終就可以完全讀取出所有信息了。
而對于返回值為結構體數組的,同樣用Object數組存放,然后讀取每一個數組成員,強制轉化成Map<String, Object>類型,保存一個結構體的所有鍵值對,然后根據結構體定義來逐個讀取對應的值,當然,如果結構體全部都是String類型,就可以直接使用Map<String, String>來保存并讀取了。

基本上來說,上面應該是這些程序中的主要難點了,解決之后,大部分問題也都可以完成,至于寫博客啥的,原理都是相同的,既然所有的信息都能夠讀取,就只需要賦值相關的語句,執行一個對應的函數而已了。
當然,在寫代碼的過程中,發現重構非常重要,雖然代碼量不大,但是從歷史上來看,變化還是非常大,后期的代碼以及比前面的耦合度要低很多,而且對于固定不變的內容等都放在類成員中,便于繼承以及代碼復用,有興趣的朋友可以試試CSDN等博客的相關功能。

附上最終實現的輸出結構:
4765
http://www.shnenglu.com/deercoder/
我的編程樂園
Category Description: ACM
Category HTML Url: http://www.shnenglu.com/deercoder/Category/17069.aspx
Category RSS Url: http://www.shnenglu.com/deercoder/rss.aspx?catid=17069
Category Title: ACM
Category ID: 17069

Category Description: Android
Category HTML Url: http://www.shnenglu.com/deercoder/Category/17867.aspx
Category RSS Url: http://www.shnenglu.com/deercoder/rss.aspx?catid=17867
Category Title: Android
Category ID: 17867

Category Description: C++
Category HTML Url: http://www.shnenglu.com/deercoder/Category/13117.aspx
Category RSS Url: http://www.shnenglu.com/deercoder/rss.aspx?catid=13117
Category Title: C++
Category ID: 13117

Category Description: CTeX和LateX
Category HTML Url: http://www.shnenglu.com/deercoder/Category/13991.aspx
Category RSS Url: http://www.shnenglu.com/deercoder/rss.aspx?catid=13991
Category Title: CTeX和LateX
Category ID: 13991

Category Description: Git
Category HTML Url: http://www.shnenglu.com/deercoder/Category/18145.aspx
Category RSS Url: http://www.shnenglu.com/deercoder/rss.aspx?catid=18145
Category Title: Git
Category ID: 18145

博客文章等保存為HTML文件,貼出HTML源碼太大,就不帖了。

以上,就是基于MetaWeblog的博客信息讀取和遷移工作的前期工作,也是最基本的工作,后期,主要將這些函數整合并利用,就可以實現所有信息的本地備份,批量寫博,批量刪除,批量導入等工作了。

最后,說說目前本工程的實現功能情況:
1. 根據一篇文章的博客ID,抓取對應的內容,標題和發布時間等信息(其余信息可自行添加,采用類似 的辦法,因本人只對這寫信息感興趣) 
2. 獲取所有的分類信息和Rss訂閱信息
3. 獲取博客信息
4. 獲取指定數量的近期發布文章
5. 保存為HTML頁面
基本上,抓取博客所提供的API函數功能都已經實現,接下來要做的是,利用這些函數,實現循環的遍歷所有的博客ID,然后全部讀取出來,并保存,這些工作應該就是一些功能的組合和接口設計了。

該工程已經發布到Github中,地址為:
https://github.com/deercoder/blogMover,歡迎大家拍磚,指導。


posted on 2012-06-10 00:07 deercoder 閱讀(1954) 評論(0)  編輯 收藏 引用 所屬分類: Java
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            看欧美日韩国产| 翔田千里一区二区| 欧美日韩1区| 99re热这里只有精品免费视频| 玖玖精品视频| 欧美精品一区二区精品网| 亚洲精品一区二区三区蜜桃久 | 99re热这里只有精品免费视频| 亚洲欧洲综合| 欧美色图一区二区三区| 午夜精品久久久久久久久久久 | 91久久精品美女高潮| 欧美精品久久久久久| 亚洲一区欧美二区| 久久激情网站| 一区二区av在线| 亚洲午夜精品久久| 伊人久久大香线蕉综合热线| 亚洲国产精品小视频| 国产精品久久久久久影视| 久久夜色精品国产欧美乱极品| 麻豆精品91| 午夜在线视频观看日韩17c| 欧美亚洲视频在线看网址| 亚洲精品1区2区| 亚洲视频精选| 亚洲日本成人在线观看| 亚洲一区二区在线| 91久久久久久久久久久久久| 亚洲一区二区少妇| 亚洲东热激情| 性欧美videos另类喷潮| 在线亚洲精品| 久久夜色精品| 久久www免费人成看片高清| 欧美成人国产一区二区| 香蕉久久夜色精品国产| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲电影免费观看高清| 夜夜精品视频一区二区| 亚洲电影在线观看| 先锋资源久久| 午夜精品久久久| 欧美日韩国产色综合一二三四| 久久综合一区| 国产亚洲精品7777| 亚洲视频 欧洲视频| 亚洲精品一区在线| 久久久国产成人精品| 亚洲欧美综合网| 欧美日韩免费高清| 亚洲日本中文字幕| 亚洲免费播放| 欧美激情一区二区三级高清视频| 毛片基地黄久久久久久天堂| 国产视频自拍一区| 亚洲免费网站| 欧美在线亚洲一区| 国产精品一区一区三区| 亚洲天堂网站在线观看视频| 在线视频精品一区| 欧美日韩中文在线观看| 日韩午夜精品| 亚洲一区二区三区精品在线观看| 欧美精品在欧美一区二区少妇| 亚洲第一偷拍| 亚洲日本va午夜在线影院| 狂野欧美激情性xxxx欧美| 久久婷婷综合激情| 亚洲国产高潮在线观看| 牛牛国产精品| 亚洲精品日韩在线| 亚洲欧美视频在线观看| 国产精品最新自拍| 欧美在线免费看| 免费成人性网站| 亚洲精品一区二区三区不| 欧美日韩国产另类不卡| 制服丝袜激情欧洲亚洲| 欧美专区在线观看一区| 韩国一区二区三区在线观看| 麻豆精品在线观看| 99精品热视频| 久久久久久免费| 亚洲欧洲在线一区| 欧美日韩直播| 久久精品国产清自在天天线| 欧美激情精品久久久六区热门| 99精品久久| 国产日韩欧美高清免费| 免费视频一区| 一区二区三区视频免费在线观看 | 亚洲第一精品电影| 欧美日韩另类国产亚洲欧美一级| 亚洲自拍偷拍视频| 欧美va亚洲va香蕉在线| 一区二区国产在线观看| 国产一区激情| 欧美国产日韩在线| 午夜精品福利视频| 亚洲精品裸体| 久久米奇亚洲| 亚洲一区激情| 亚洲精品在线观看视频| 久久久久久久波多野高潮日日| 亚洲丝袜av一区| 在线电影国产精品| 欧美日韩小视频| 久久天堂国产精品| 一区二区三区四区蜜桃| 你懂的视频一区二区| 亚洲综合电影一区二区三区| 亚洲国产综合视频在线观看| 国产精品日韩精品| 欧美日韩国产成人在线| 久久久欧美精品sm网站| 亚洲男女自偷自拍图片另类| 亚洲日本理论电影| 免播放器亚洲| 久久久久久久成人| 午夜精品一区二区三区电影天堂| 亚洲国产va精品久久久不卡综合| 国产精品夜夜夜| 欧美先锋影音| 欧美三日本三级少妇三99| 欧美大秀在线观看| 久久午夜av| 久久婷婷国产综合精品青草| 亚洲欧美日韩一区二区三区在线| 亚洲美女av网站| 亚洲日本欧美| 亚洲欧洲美洲综合色网| 欧美国产日韩视频| 免费欧美网站| 欧美大片在线观看一区| 久久久久9999亚洲精品| 久久激情一区| 久久久91精品国产| 欧美在线精品一区| 久久se精品一区二区| 午夜一区二区三区在线观看 | 亚洲承认在线| 亚洲国产精品一区| 亚洲高清在线播放| 亚洲二区精品| 日韩视频在线免费观看| 亚洲精品影视| 一区二区高清在线观看| 亚洲线精品一区二区三区八戒| 一区二区三区视频在线播放| 亚洲调教视频在线观看| 亚洲欧美日韩高清| 欧美一级在线视频| 久久久久欧美精品| 另类图片综合电影| 亚洲国产精品成人精品| 亚洲精品一区二区三区樱花 | 99re热这里只有精品视频| 日韩视频免费观看高清完整版| 亚洲免费av片| 亚洲欧美日韩天堂一区二区| 久久精视频免费在线久久完整在线看| 久久久精品999| 欧美国产亚洲另类动漫| 欧美午夜精品理论片a级按摩| 国产精品推荐精品| 在线看视频不卡| 一区二区三区久久| 欧美在线观看一区二区| 欧美黄免费看| 亚洲视频大全| 久久蜜桃av一区精品变态类天堂| 欧美国产专区| 国产精品一区二区男女羞羞无遮挡 | 欧美一级在线亚洲天堂| 欧美国产精品日韩| 国产婷婷精品| 99精品欧美一区二区蜜桃免费| 久久免费视频在线观看| 欧美黄污视频| 国产片一区二区| 亚洲精品乱码久久久久久| 亚洲欧美久久| 欧美成人情趣视频| 亚洲伊人久久综合| 欧美aⅴ99久久黑人专区| 国产精品久久久久久久久久三级| 在线电影院国产精品| 亚洲性xxxx| 亚洲国产导航| 久久精品人人做人人爽电影蜜月| 国产精品r级在线| 日韩亚洲欧美成人| 久久亚裔精品欧美| 亚洲天堂偷拍| 欧美亚洲成人免费| 9久re热视频在线精品| 蜜桃av一区二区三区| 午夜影院日韩| 国产精品国产三级国产专区53|