小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Snaker開發筆記(1)-實現插件

          Posted on 2012-01-20 15:27 小明 閱讀(1984) 評論(2)  編輯  收藏 所屬分類: 開發日志
          程序員的核心價值是創造有用的軟件。
                                   ----------小明

          背景
          我有時會去特定的網站去下載一些資料,比如去englishpod.com去下載英語聽力資料,或者去某論壇下載美女貼圖:-),但是通用的爬蟲無法滿足需求,一來很多網站需要登錄才能下載,另外我也不想下載不需要的東西,只想下載特定的內容,所以我只能寫一些小程序來去下載。這樣的小程序寫了幾個,重復的部分很多,所以能不能寫一個通用的平臺,讓寫類似的程序更簡單?于是有了現在這個開源項目Snaker:http://code.google.com/p/ssnaker/

          插件設計
          我的目標之一,是讓寫特定的爬蟲更簡單,一個想法是做成插件式的。有幾個需求:
          1. 很容易添加插件
          2. 很容易修改插件,不需要重啟程序
          3. 特定網站的邏輯都應該在插件中,framework只包含通用部分。

          所以插件最好是用一種腳本語言來書寫。平臺層我使用Java來開發,插件腳本我決定用javascript來編寫。為什么用javascript?主要是受到nodejs和greasemonkey的啟發,尤其是greasemonkey那種javascript插件的方式,我覺得非常不錯。

          Java和JavaScript的互動

          我選擇了mozilla的rhino庫來實現腳本的執行。
          Java調用Javascript腳本比較簡單:

          Context cx = Context.enter();
                  
          try {
                      Scriptable scope = cx.initStandardObjects();
           
                     Script script = cx.compileString(sourceCode, engine.getName(), 1null);
                      script.exec(cx, scope);
                  } 
          finally {
                      Context.exit();
                  }

          因為javascript本身并沒有網絡下載的功能,所以我要定義一些方法,讓javascript可以調用java的方法來實現下載,這稱為Host object。具體的方法請參見rhino的官方文檔,我這里貼出一小段code。

          下面這個類定義了一個sleep的方法。
          Java:
          public class JsHelper extends NativeObject {
              
          public JsHelper() {
              }

              @Override
              
          public String getClassName() {
                  
          return "JsHelper";
              }

              
          public void jsFunction_sleep(int millis) {
                  
          try {
                      Thread.sleep(millis);
                  } 
          catch (InterruptedException e) {
                      logger.error(
          "interrupted",e);
                  }
              }
          }

          Scriptable tx = cx.newObject(scope, "JsHelper");
          scope.put("$", scope, tx);


          這樣就可以在javascript中調用了:

          $.sleep(1000);

          更多的Snaker API設計請參考:

          評論

          # re: Snaker開發筆記(1)-實現插件  回復  更多評論   

          2012-01-20 21:36 by nkjava
          程序挺好,只是注釋寫得不多

          # re: Snaker開發筆記(1)-實現插件  回復  更多評論   

          2012-01-23 23:13 by tb
          挺好的
          主站蜘蛛池模板: 甘南县| 桂阳县| 天峻县| 分宜县| 抚远县| 玉树县| 都江堰市| 双江| 师宗县| 太原市| 高陵县| 武义县| 平阳县| 新丰县| 大埔县| 义马市| 渝北区| 武义县| 海兴县| 台中县| 富民县| 泉州市| 新竹县| 松滋市| 洮南市| 正宁县| 海林市| 廉江市| 绥中县| 若尔盖县| 绥化市| 独山县| 读书| 桐乡市| 孟津县| 杂多县| SHOW| 平山县| 汾阳市| 阜新市| 新密市|