Sunday, 15 April 2012

Grab products from Amazon aStores

Grab products from Amazon aStores
This task use javascript sandbox with jsoup support to grab products from Amazon aStores.
Grab products from Amazon aStores
  1. Create javascript sandbox with jsoup support
  2. Create javascript as following
javascript
function main(env, args) {
  var astore = 'paesia';
  var node = '100';
  var maxpage = 2;
  try {
    var products = grabProduct(astore, node, maxpage, env);
    var links = args.get('links');
    for (var i = 0; i < products.size(); i++) {
      links.add(products.get(i));
    }
  } catch (e) {
    env.error(e);
  }
}

function grabProduct(astore, node, maxpage, env) {
  var tag = env.newArrayList();
  for (var no = 1; no <= maxpage; no++) {
    try {
      var alink = env.newURL('http://astore.amazon.com/' + astore + '-20?node=' + node + '&page=' + no);
      var doc = env.newJsoup().parse(alink, 60000);
      var elements = doc.select('#featuredProducts .textrow a');
      var map = env.newHashMap();
      for (var i = 0; i < elements.size(); i++) {
        var element = elements.get(i);
        var title = element.text();
        var url = element.attr('href');
        var pos = url.lastIndexOf('/detail/');
        if (pos < 0) continue;
        var code = url.substring(pos + 8);
        var url = env.newURL(alink, url) + '';
        var item = env.newHashMap();
        item.put('code', code);
        item.put('title', title);
        item.put('url', url);
        map.put(code, item);
      }
      elements = doc.select('#featuredProducts .imagerow a');
      for (var i = 0; i < elements.size(); i++) {
        var element = elements.get(i);
        var url = element.attr('href');
        var pos = url.lastIndexOf('/detail/');
        if (pos < 0) continue;
        var code = url.substring(pos + 8);
        var item = map.get(code);
        if (item == null) continue;
        var child = element.select('img').first();
        if (child == null) continue;
        var title = child.attr('alt');
        var smimg = child.attr('src');
        if (title.length() > 0) {
          item.put('title', title);
        }
        item.put('small-image', smimg);
      }

      var keys = env.getKeys(map);
      for (var i = 0; i < keys.size(); i++) {
        try {
          var item = map.get(keys.get(i));
          alink = env.newURL(item.get('url'));
          doc = env.newJsoup().parse(alink, 60000);
          var element = doc.select('#detailImage img').first();
          if (element != null) {
            item.put('large-image', element.attr('src'));
          }
          element = doc.select('#productDescription').first();
          if (element != null) {
            var desc = element.html();
            var pattern = '<h2>Product Description</h2>';
            var pos = desc.indexOf(pattern);
            if (pos >= 0) {
              desc = desc.substring(pos + pattern.length);
            }
            var bdoc = env.newJsoup().parse(desc, item.get('url'));
            buildURL(bdoc, item.get('url'), env);
            desc = bdoc.select('body').first().html();
            if (desc.indexOf('<html') < 0) {
              item.put('description', desc);
            }
          }
          element = doc.select('#productDetails').first();
          if (element != null) {
            var desc = element.html();
            var pattern = '<h2>Product Details</h2>';
            var pos = desc.indexOf(pattern);
            if (pos >= 0) {
              desc = desc.substring(pos + pattern.length);
            }
            var bdoc = env.newJsoup().parse(desc, item.get('url'));
            buildURL(bdoc, item.get('url'), env);
            desc = bdoc.select('body').first().html();
            if (desc.indexOf('<html') < 0) {
              item.put('details', desc);
            }
          }
          element = doc.select('#editorialReviews').first();
          if (element != null) {
            var desc = element.html();
            var bdoc = env.newJsoup().parse(desc, item.get('url') + '');
            buildURL(bdoc, item.get('url'), env);
            desc = bdoc.select('body').first().html();
            if (desc.indexOf('<html') < 0) {
              item.put('editorial-reviews', desc);
            }
          }
          element = doc.select('#detailListPrice').first();
          if (element != null) {
            item.put('list-price', element.text());
          }
          element = doc.select('#detailOfferPrice').first();
          if (element != null) {
            item.put('offer-price', element.text());
          }
          element = doc.select('#addToCartForm a').first();
          if (element != null) {
            item.put('buy-url', element.attr('href'));
          }
        } catch (e) {
          env.error(e);
        }
      }

      for (var i = 0; i < keys.size(); i++) {
        tag.add(map.get(keys.get(i)));
      }
    } catch (e) {
      env.error(e);
    }
  }
  return tag;
}

function buildURL(doc, baseUrl, env) {
  baseUrl = env.newURL(baseUrl);
  var elements = doc.select('a');
  for (var i = 0; i < elements.size(); i++) {
    var element = elements.get(i);
    var url = env.newURL(baseUrl, element.attr('href'));
    element.attr('href', url + '');
  }
  elements = doc.select('img');
  for (var i = 0; i < elements.size(); i++) {
    var element = elements.get(i);
    var url = env.newURL(baseUrl, element.attr('src'));
    element.attr('src', url + '');
  }
}
    

  Protected by Copyscape Online Copyright Protection

Grab categories from Amazon aStores

Grab categories from Amazon aStores
This task use javascript sandbox with jsoup support to grab categories from Amazon aStores.
Grab categories from Amazon aStores
  1. Create javascript sandbox with jsoup support
  2. Create javascript as following
javascript
function main(env, args) {
  var astore = 'paesia';
  try {
    var categories = grabCategory(astore, env);
    var map = env.newHashMap();
    for (var i = 0; i < categories.size(); i++) {
      var cat = categories.get(i);
      map.put(cat.get('node'), cat);
    }
    for (var i = 0; i < categories.size(); i++) {
      var cat = categories.get(i);
      var node = cat.get('node');
      var title = cat.get('title');
      var parentNode = cat.get('parent');
      var parentCat = map.get(parentNode);
      var parentTitle = '';
      if (parentCat != null) {
        parentTitle = parentCat.get('title');
      }
      var line = '';
      line += '\r\nTitle: ' + title;
      line += '\r\nNode: ' + node;
      line += '\r\nParent: ' + parentNode;
      line += '\r\nParent Title: ' + parentTitle;
      env.info(line);
    }
  } catch (e) {
    env.error(e);
  }
}

function grabCategory(astore, env) {
  var tag = env.newArrayList();
  try {
    var nodelist = env.newArrayList();
    var alink = env.newURL('http://astore.amazon.com/' + astore + '-20');
    var doc = env.newJsoup().parse(alink, 60000);
    var elements = doc.select('#searchbrowse a');
    for (var i = 0; i < elements.size(); i++) {
      var element = elements.get(i);
      var title = element.text();
      var url = element.attr('href');
      var pos = url.lastIndexOf('node=');
      if (pos < 0) continue;
      var node = url.substring(pos + 5);
      pos = node.indexOf('&');
      if (pos >= 0) {
        node = node.substring(0, pos);
      }
      var item = env.newHashMap();
      item.put('title', title);
      item.put('node', node);
      item.put('parent', '');
      tag.add(item);
      nodelist.add(node);
    }
    var no = 0;
    while (no < nodelist.size()) {
      alink = env.newURL('http://astore.amazon.com/' + astore + '-20?node=' + nodelist.get(no));
      doc = env.newJsoup().parse(alink, 60000);
      elements = doc.select('#searchbrowse .indent a');
      for (var i = 0; i < elements.size(); i++) {
        var element = elements.get(i);
        var title = element.text();
        var url = element.attr('href');
        var pos = url.lastIndexOf('node=');
        if (pos < 0) continue;
        var node = url.substring(pos + 5);
        pos = node.indexOf('&');
        if (pos >= 0) {
          node = node.substring(0, pos);
        }
        if (nodelist.indexOf(node) >= 0) continue;
        var item = env.newHashMap();
        item.put('title', title);
        item.put('node', node);
        item.put('parent', nodelist.get(no));
        tag.add(item);
        nodelist.add(node);
      }
      no++;
    }
  } catch (e) {
    env.error(e);
  }
  return tag;
}
    

  Protected by Copyscape Online Copyright Protection

Saturday, 14 April 2012

Grab google search results

Grab google search results
This task use javascript sandbox with jsoup support to grab google search results.
Grab google search results
  1. Create javascript sandbox with jsoup support
  2. Create javascript as following
javascript
function main(env, args) {
  var query = 'lucene';
  var max = 50;
  searchGoogle(query, max, env, args);
}

function searchGoogle(query, max, env, args) {
  var links = args.get('links');
  var start = 0;
  while (start < max) {
    var count = searchGooglePage(query, start, env, args);
    if (count == 0) break;
    start += count;
  }
  for (var i = start - 1; i >= max; i--) {
    links.remove(i);
  }
}

function searchGooglePage(query, start, env, args) {
  var links = args.get('links');
  var count = 0;
  try {
    var url = env.newURL('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&safe=active&q=' + env.encodeURL(query, 'UTF-8') + 'lucene&start=' + start);
    var conn = env.newJsoup().connect(url).timeout(60000);
    var html = conn.execute().body();
    var root = env.newJSONObject().fromObject(html);
    var resp = root.getJSONObject('responseData');
    var results = resp.getJSONArray('results');
    for (var i = 0; i < results.size(); i++) {
      var resItem = results.getJSONObject(i);
      var url = unescape(resItem.getString('url'), env);
      var title = resItem.getString('title');
      var titleNoFormatting = resItem.getString('titleNoFormatting');
      var visibleUrl = resItem.getString('visibleUrl');
      var content = unescape(resItem.getString('content'), env);
      var cacheUrl = unescape(resItem.getString('cacheUrl'), env);
      var item = env.newHashMap();
      item.put('url', url);
      item.put('title', title);
      item.put('titleNoFormatting', titleNoFormatting);
      item.put('visibleUrl', visibleUrl);
      item.put('content', content);
      item.put('cacheUrl', cacheUrl);
      links.add(item);
      count++;
    }
  } catch (e) {
    env.error(e);
  }
  return count;
}

function unescape(src, env) {
  var tag = env.newString(src);
  tag = tag.replaceAll('\u003c', '<');
  tag = tag.replaceAll('\u003e', '>');
  tag = tag.replaceAll('\u003d', '=');
  return tag + '';
}
    

  Protected by Copyscape Online Copyright Protection

Friday, 13 April 2012

Add JSON support to javascript sandbox

Add JSON support to javascript sandbox
This task use JSON-lib to add JSON support to javascript sandbox.
Add JSON support to javascript sandbox
  1. Create javascript sandbox with jsoup support
  2. Modify com.paesia.schema.script.Machine class as following
  3. Create javascript as following
Modify com.paesia.schema.script.Machine class
public class Machine {

    private Handler handler;
 
    public static void run(Machine env, String js, Map args) throws Exception {
        try {
            Context cx = Context.enter();
            cx.setClassShutter(new ClassShutter() {
                public boolean visibleToScripts(String className) {  
...........

                    if (className.startsWith("com.paesia.schema.script.safe.")) return true;
                    if ("org.jsoup.helper.HttpConnection$Response".equals(className)) return true;

                    if ("net.sf.json.JSONArray".equals(className)) return true;
                    if ("net.sf.json.JSONObject".equals(className)) return true;

                    return false;
                }
            });   

...........

        } catch (Exception e) {
            throw e;
        } finally {
            Context.exit();   
        }
    }
 
    public JSONArray newJSONArray() {
        return new JSONArray();
    }
 
    public JSONObject newJSONObject() {
        return new JSONObject();
    }

...........

}
    
javascript
function main(env, args) {
  var links = args.get('links');
  try {
    var json = env.newJsoup().connect(env.newURL('https://www.odesk.com/api/profiles/v1/search/jobs.json?page=0;50&sort=date_posted;D')).execute().body();
    var root = env.newJSONObject().fromObject(json);
    var jobs = root.getJSONObject('jobs').getJSONArray('job');
    for (var i = 0; i < jobs.size(); i++) {
      var job = jobs.getJSONObject(i);
      var desc = job.getString('op_description');
      var title = job.getString('op_title');
      var url = 'https://www.odesk.com/jobs/' + job.getString('ciphertext');
      var item = env.newHashMap();
      item.put('title', title);
      item.put('desc', desc);
      item.put('url', url);
      links.add(item);
    }
  } catch (e) {
    env.error(e);
  }
}
    

  Protected by Copyscape Online Copyright Protection

Grab vBulletin pages in logged-in mode

Grab vBulletin pages in logged-in mode
This task use javascript sandbox with jsoup support to grab vBulletin pages in logged-in mode.
Grab vBulletin pages in logged-in mode
  1. Create javascript sandbox with jsoup support
  2. Create javascript as following
javascript
function main(env, args) {
  var links = args.get('links');
  var username = '';
  var password = '';
  var conn;
  try {
    conn = env.newJsoup().connect('http://www.sitepoint.com/forums/login.php?do=login');
    conn.userAgent('Mozilla/5.0 (Windows NT x.y; rv:10.0.1) Gecko/20100101 Firefox/10.0.1');
    conn.data('do', 'login');
    conn.data('vb_login_username', username);
    conn.data('vb_login_password', password);
    conn.data('vb_login_md5password', hex_md5(str_to_ent(trim(password))));
    conn.data('securitytoken', 'guest');
    conn.data('cookieuser', '1');
    var doc = conn.post();
    var ele = doc.select('.standard_error .restore').first();
    if (ele == null) {
      env.error('Cannot login!');
      return;
    }
    if (!ele.text().startsWith('Thank you for logging in')) {
      env.error('Cannot login!');
      return;
    }
    var cookies = conn.getCookies();

    var url = env.newURL('http://www.sitepoint.com/forums/subscription.php');
    conn = env.newJsoup().connect(url);
    conn.userAgent('Mozilla/5.0 (Windows NT x.y; rv:10.0.1) Gecko/20100101 Firefox/10.0.1');
    conn.cookies(cookies);
    doc = conn.get();

    var elements = doc.select('#threads .threadbit');
    for (var i = 0; i < elements.size(); i++) {
      var element = elements.get(i);
      var item = env.newHashMap();
      var child = element.select('.threadtitle .title').first();
      item.put('title', child.text());
      var href = env.newURL(url, child.attr('href'));
      item.put('link', href + '');
      links.add(item);
    }

  } catch (e) {
    env.error(e);
  }
}

var hexcase=0;
var b64pad="";
var chrsz=8;
function hex_md5(A){
  return binl2hex(core_md5(str2binl(A),A.length*chrsz))
}
function b64_md5(A){
  return binl2b64(core_md5(str2binl(A),A.length*chrsz))
}
function str_md5(A){
  return binl2str(core_md5(str2binl(A),A.length*chrsz))
}
function hex_hmac_md5(A,B){
  return binl2hex(core_hmac_md5(A,B))
}
function b64_hmac_md5(A,B){
  return binl2b64(core_hmac_md5(A,B))
}
function str_hmac_md5(A,B){
  return binl2str(core_hmac_md5(A,B))
}
function core_md5(K,F){
  K[F>>5]|=128<<((F)%32);
  K[(((F+64)>>>9)<<4)+14]=F;
  var J=1732584193;
  var I=-271733879;
  var H=-1732584194;
  var G=271733878;
  for(var C=0;C<K.length;C+=16){
    var E=J;
    var D=I;
    var B=H;
    var A=G;
    J=md5_ff(J,I,H,G,K[C+0],7,-680876936);
    G=md5_ff(G,J,I,H,K[C+1],12,-389564586);
    H=md5_ff(H,G,J,I,K[C+2],17,606105819);
    I=md5_ff(I,H,G,J,K[C+3],22,-1044525330);
    J=md5_ff(J,I,H,G,K[C+4],7,-176418897);
    G=md5_ff(G,J,I,H,K[C+5],12,1200080426);
    H=md5_ff(H,G,J,I,K[C+6],17,-1473231341);
    I=md5_ff(I,H,G,J,K[C+7],22,-45705983);
    J=md5_ff(J,I,H,G,K[C+8],7,1770035416);
    G=md5_ff(G,J,I,H,K[C+9],12,-1958414417);
    H=md5_ff(H,G,J,I,K[C+10],17,-42063);
    I=md5_ff(I,H,G,J,K[C+11],22,-1990404162);
    J=md5_ff(J,I,H,G,K[C+12],7,1804603682);
    G=md5_ff(G,J,I,H,K[C+13],12,-40341101);
    H=md5_ff(H,G,J,I,K[C+14],17,-1502002290);
    I=md5_ff(I,H,G,J,K[C+15],22,1236535329);
    J=md5_gg(J,I,H,G,K[C+1],5,-165796510);
    G=md5_gg(G,J,I,H,K[C+6],9,-1069501632);
    H=md5_gg(H,G,J,I,K[C+11],14,643717713);
    I=md5_gg(I,H,G,J,K[C+0],20,-373897302);
    J=md5_gg(J,I,H,G,K[C+5],5,-701558691);
    G=md5_gg(G,J,I,H,K[C+10],9,38016083);
    H=md5_gg(H,G,J,I,K[C+15],14,-660478335);
    I=md5_gg(I,H,G,J,K[C+4],20,-405537848);
    J=md5_gg(J,I,H,G,K[C+9],5,568446438);
    G=md5_gg(G,J,I,H,K[C+14],9,-1019803690);
    H=md5_gg(H,G,J,I,K[C+3],14,-187363961);
    I=md5_gg(I,H,G,J,K[C+8],20,1163531501);
    J=md5_gg(J,I,H,G,K[C+13],5,-1444681467);
    G=md5_gg(G,J,I,H,K[C+2],9,-51403784);
    H=md5_gg(H,G,J,I,K[C+7],14,1735328473);
    I=md5_gg(I,H,G,J,K[C+12],20,-1926607734);
    J=md5_hh(J,I,H,G,K[C+5],4,-378558);
    G=md5_hh(G,J,I,H,K[C+8],11,-2022574463);
    H=md5_hh(H,G,J,I,K[C+11],16,1839030562);
    I=md5_hh(I,H,G,J,K[C+14],23,-35309556);
    J=md5_hh(J,I,H,G,K[C+1],4,-1530992060);
    G=md5_hh(G,J,I,H,K[C+4],11,1272893353);
    H=md5_hh(H,G,J,I,K[C+7],16,-155497632);
    I=md5_hh(I,H,G,J,K[C+10],23,-1094730640);
    J=md5_hh(J,I,H,G,K[C+13],4,681279174);
    G=md5_hh(G,J,I,H,K[C+0],11,-358537222);
    H=md5_hh(H,G,J,I,K[C+3],16,-722521979);
    I=md5_hh(I,H,G,J,K[C+6],23,76029189);
    J=md5_hh(J,I,H,G,K[C+9],4,-640364487);
    G=md5_hh(G,J,I,H,K[C+12],11,-421815835);
    H=md5_hh(H,G,J,I,K[C+15],16,530742520);
    I=md5_hh(I,H,G,J,K[C+2],23,-995338651);
    J=md5_ii(J,I,H,G,K[C+0],6,-198630844);
    G=md5_ii(G,J,I,H,K[C+7],10,1126891415);
    H=md5_ii(H,G,J,I,K[C+14],15,-1416354905);
    I=md5_ii(I,H,G,J,K[C+5],21,-57434055);
    J=md5_ii(J,I,H,G,K[C+12],6,1700485571);
    G=md5_ii(G,J,I,H,K[C+3],10,-1894986606);
    H=md5_ii(H,G,J,I,K[C+10],15,-1051523);
    I=md5_ii(I,H,G,J,K[C+1],21,-2054922799);
    J=md5_ii(J,I,H,G,K[C+8],6,1873313359);
    G=md5_ii(G,J,I,H,K[C+15],10,-30611744);
    H=md5_ii(H,G,J,I,K[C+6],15,-1560198380);
    I=md5_ii(I,H,G,J,K[C+13],21,1309151649);
    J=md5_ii(J,I,H,G,K[C+4],6,-145523070);
    G=md5_ii(G,J,I,H,K[C+11],10,-1120210379);
    H=md5_ii(H,G,J,I,K[C+2],15,718787259);
    I=md5_ii(I,H,G,J,K[C+9],21,-343485551);
    J=safe_add(J,E);
    I=safe_add(I,D);
    H=safe_add(H,B);
    G=safe_add(G,A)
  }
  return Array(J,I,H,G)
}
function md5_cmn(F,C,B,A,E,D){
  return safe_add(bit_rol(safe_add(safe_add(C,F),safe_add(A,D)),E),B)
}
function md5_ff(C,B,G,F,A,E,D){
  return md5_cmn((B&G)|((~B)&F),C,B,A,E,D)
}
function md5_gg(C,B,G,F,A,E,D){
  return md5_cmn((B&F)|(G&(~F)),C,B,A,E,D)
}
function md5_hh(C,B,G,F,A,E,D){
  return md5_cmn(B^G^F,C,B,A,E,D)
}
function md5_ii(C,B,G,F,A,E,D){
  return md5_cmn(G^(B|(~F)),C,B,A,E,D)
}
function core_hmac_md5(C,F){
  var E=str2binl(C);
  if(E.length>16){
    E=core_md5(E,C.length*chrsz)
  }
  var A=Array(16),D=Array(16);
  for(var B=0;B<16;B++){
    A[B]=E[B]^909522486;D[B]=E[B]^1549556828
  }
  var G=core_md5(A.concat(str2binl(F)),512+F.length*chrsz);
  return core_md5(D.concat(G),512+128)
}
function safe_add(A,D){
  var C=(A&65535)+(D&65535);
  var B=(A>>16)+(D>>16)+(C>>16);
  return(B<<16)|(C&65535)
}
function bit_rol(A,B){
  return(A<<B)|(A>>>(32-B))
}
function str2binl(D){
  var C=new Array();
  var A=(1<<chrsz)-1;
  for(var B=0;B<D.length*chrsz;B+=chrsz){
    C[B>>5]|=(D.charCodeAt(B/chrsz)&A)<<(B%32)
  }
  return C
}
function binl2str(C){
  var D="";
  var A=(1<<chrsz)-1;
  for(var B=0;B<C.length*32;B+=chrsz){
    D+=String.fromCharCode((C[B>>5]>>>(B%32))&A)
  }
  return D
}
function binl2hex(C){
  var B=hexcase?"0123456789ABCDEF":"0123456789abcdef";
  var D="";
  for(var A=0;A<C.length*4;A++){
    D+=B.charAt((C[A>>2]>>((A%4)*8+4))&15)+B.charAt((C[A>>2]>>((A%4)*8))&15)
  }
  return D
}
function binl2b64(D){
  var C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var F="";
  for(var B=0;B<D.length*4;B+=3){
    var E=(((D[B>>2]>>8*(B%4))&255)<<16)|(((D[B+1>>2]>>8*((B+1)%4))&255)<<8)|((D[B+2>>2]>>8*((B+2)%4))&255);
    for(var A=0;A<4;A++){
      if(B*8+A*6>D.length*32){
        F+=b64pad
      }else{
        F+=C.charAt((E>>6*(3-A))&63)
      }
    }
  }
  return F
}
function str_to_ent(D){
  var A="";
  var C;
  for(C=0;C<D.length;C++){
    var E=D.charCodeAt(C);
    var B="";
    if(E>255){
      while(E>=1){
        B="0123456789".charAt(E%10)+B;E=E/10
      }
      if(B==""){B="0"}
      B="#"+B;
      B="&"+B;B=B+";";
      A+=B
    }else{
      A+=D.charAt(C)
    }
  }
  return A
}
function trim(A){
  while(A.substring(0,1)==" "){
    A=A.substring(1,A.length)
  }
  while(A.substring(A.length-1,A.length)==" "){
    A=A.substring(0,A.length-1)
  }
  return A
}
    

  Protected by Copyscape Online Copyright Protection

Create javascript sandbox with jsoup support

Create javascript sandbox with jsoup support
This task use java and Rhino to create javascript sandbox with jsoup support.
Create javascript sandbox with jsoup support
  1. Create com.paesia.schema.script.Machine class as following
  2. Create com.paesia.schema.script.safe.jsoup.SJsoup class as following
  3. Create com.paesia.schema.script.safe.jsoup.SConnection class as following
  4. Create DataHandler class as following
  5. Create javascript as following
  6. Call Machine.run() method as following
Call Machine.run() method
String js = loadJS();
Map args = new HashMap();
List links = new ArrayList();
args.put("links", links);

Machine env = new Machine(new DataHandler());
Machine.run(env, js, args);
      
for (int i = 0; i < links.size(); i++) {
    Map item = (Map)links.get(i);
    String line = "";
    for (Object key : item.keySet()) {
        line += "\r\n" + key + " : " + item.get(key);
    }
    logger.info("\r\n--------------------------------\r\n" + line + "\r\n");
}
    
com.paesia.schema.script.Machine class
package com.paesia.schema.script;

import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mozilla.javascript.ClassShutter;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;

import com.paesia.schema.script.safe.jsoup.SJsoup;

import java.util.UUID;
import java.util.Random;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.mail.internet.MimeUtility;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Set;

import java.util.Locale;
import java.util.TimeZone;
import java.util.SimpleTimeZone;
import java.util.Calendar;

public class Machine {

    private Handler handler;
 
    public static void run(Machine env, String js, Map args) throws Exception {
        try {
            Context cx = Context.enter();
            cx.setClassShutter(new ClassShutter() {
                public boolean visibleToScripts(String className) {  
                    if ("com.paesia.schema.script.Machine".equals(className)) return true;
                    if ("java.lang.String".equals(className)) return true;
                    if ("java.lang.Object".equals(className)) return true;
                    if ("java.util.HashMap".equals(className)) return true;
                    if ("java.util.ArrayList".equals(className)) return true;
                    if ("java.lang.Byte".equals(className)) return true;
                    if ("java.lang.Short".equals(className)) return true;
                    if ("java.lang.Integer".equals(className)) return true;
                    if ("java.lang.Long".equals(className)) return true;
                    if ("java.lang.Float".equals(className)) return true;
                    if ("java.lang.Double".equals(className)) return true;
                    if ("java.lang.Boolean".equals(className)) return true;
                    if ("java.lang.Character".equals(className)) return true;
                    if ("java.util.Collection".equals(className)) return true;
                    if ("java.util.List".equals(className)) return true;
                    if ("java.util.Map".equals(className)) return true;
                    if ("java.util.LinkedHashMap".equals(className)) return true;
                    if ("java.util.Iterator".equals(className)) return true;
                    if ("java.util.ListIterator".equals(className)) return true;
                    if ("java.lang.Iterable".equals(className)) return true;
                    if ("java.net.URL".equals(className)) return true;
                    if (className.startsWith("org.jsoup.nodes.")) return true;
                    if (className.startsWith("org.jsoup.select.")) return true;
                    if (className.startsWith("org.jsoup.safety.")) return true;
                    if (className.startsWith("org.jsoup.parser.")) return true;
                    if (className.startsWith("com.paesia.schema.script.safe.")) return true;
                    if ("org.jsoup.helper.HttpConnection$Response".equals(className)) return true;
                    if ("java.util.Date".equals(className)) return true;
                    if ("java.text.SimpleDateFormat".equals(className)) return true;
                    if (className.startsWith("java.util.Collections")) return true;
                    if ("java.util.LinkedHashSet".equals(className)) return true;
                    if ("java.util.Locale".equals(className)) return true;
                    if ("java.util.TimeZone".equals(className)) return true;
                    if ("java.util.SimpleTimeZone".equals(className)) return true;
                    if ("java.util.Calendar".equals(className)) return true;
                    if ("java.util.GregorianCalendar".equals(className)) return true;
                    return false;
                }
            });   
            Scriptable scope = cx.initStandardObjects();
            Object result = cx.evaluateString(scope, js, "<js>", 1, null);
            Object fObj = scope.get("main", scope);
            if (!(fObj instanceof Function)) {
                throw new Exception("main() is undefined or not a function.");
            } else {
                Object functionArgs[] = { env, args };
                Function f = (Function)fObj;
                result = f.call(cx, scope, scope, functionArgs);
            }   
        } catch (Exception e) {
            throw e;
        } finally {
            Context.exit();   
        }
    }
 
    public String newString(String src) {
        return src;
    }
 
    public String newString(byte[] src, String charset) throws Exception {
        return new String(src, charset);
    }
 
    public HashMap newHashMap() {
        return new HashMap();
    }
 
    public ArrayList newArrayList() {
        return new ArrayList();
    }
 
    public Byte newByte(byte src) {
        return (Byte)src;
    }
 
    public Short newShort(short src) {
        return (Short)src;
    }
 
    public Integer newInteger(int src) {
        return (Integer)src;
    }
 
    public Long newLong(long src) {
        return (Long)src;
    }
 
    public Float newFloat(float src) {
        return (Float)src;
    }
 
    public Double newDouble(double src) {
        return (Double)src;
    }
 
    public Boolean newBoolean(boolean src) {
        return (Boolean)src;
    }
 
    public Character newCharacter(char src) {
        return (Character)src;
    }
 
    public List getKeys(Map src) {
        List tag = new ArrayList();
        for (Object key : src.keySet()) {
            tag.add(key);
        }
        return tag;
    }
 
    public URL newURL(String protocol, String host, int port, String file) throws Exception {
        return new URL(protocol, host, port, file);
    }

    public URL newURL(String protocol, String host, String file) throws Exception {
        return new URL(protocol, host, file);
    }
 
    public URL newURL(String spec) throws Exception {
        return new URL(spec);
    }
 
    public URL newURL(URL context, String spec) throws Exception {
        return new URL(context, spec);
    }
 
    public SJsoup newJsoup() {
        return new SJsoup();
    }
 
    public String encodeURL(String src, String charset) {
        try {
            return URLEncoder.encode(src, charset);
        } catch (Exception e) {
            return "";
        }
    }

    public String decodeURL(String src, String charset) {
        try {
            return URLDecoder.decode(src, charset);
        } catch (Exception e) {
            return "";
        }
    }

    public String uniqid() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
    
    public String suniqid() {
        Random random = new Random();
        return Long.toString(Math.abs(random.nextLong()), 36);
    }
    
    public Date newDate() {
        return new Date();
    }

    public Date newDate(long time) {
        return new Date(time);
    }
    
    public SimpleDateFormat newDateFormat(String format) {
        return new SimpleDateFormat(format);
    }
    
    public byte[] decodeBase64(byte[] b) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream(b);
        InputStream b64is = MimeUtility.decode(bais, "base64");
        byte[] tmp = new byte[b.length];
        int n = b64is.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return res;
    }      

    public byte[] encodeBase64(byte[] b) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream b64os = MimeUtility.encode(baos, "base64");
        b64os.write(b);
        b64os.close();
        return baos.toByteArray();
    }

    public List<Object> setToList(Set src) {
        List<Object> tag = new ArrayList<Object>();
        for (Object item : src) {
            tag.add(item);
        }
        return tag;
    }

    public Locale newLocale(String language) {
        return new Locale(language);
    }

    public Locale newLocale(String language, String country) {
        return new Locale(language, country);
    }

    public Locale newLocale(String language, String country, String variant) {
        return new Locale(language, country, variant);
    }
    
    public TimeZone newTimeZone(int rawOffset, String ID) {
        return new SimpleTimeZone(rawOffset, ID);
    }

    public TimeZone newTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime) {
        return new SimpleTimeZone(rawOffset, ID, startMonth, startDay, startDayOfWeek, startTime, endMonth, endDay, endDayOfWeek, endTime);
    }

    public TimeZone newTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime, int dstSavings) {
        return new SimpleTimeZone(rawOffset, ID, startMonth, startDay, startDayOfWeek, startTime, endMonth, endDay, endDayOfWeek, endTime, dstSavings);
    }

    public TimeZone newTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int startTimeMode, int endMonth, int endDay, int endDayOfWeek, int endTime, int endTimeMode, int dstSavings) {
        return new SimpleTimeZone(rawOffset, ID, startMonth, startDay, startDayOfWeek, startTime, startTimeMode, endMonth, endDay, endDayOfWeek, endTime, endTimeMode, dstSavings);
    }
    
    public Calendar newCalendar() {
        return Calendar.getInstance();
    }

    public Calendar newCalendar(Locale aLocale) {
        return Calendar.getInstance(aLocale);
    }

    public Calendar newCalendar(TimeZone zone) {
        return Calendar.getInstance(zone);
    }

    public Calendar newCalendar(TimeZone zone, Locale aLocale) {
        return Calendar.getInstance(zone, aLocale);
    }

    public Machine(Handler handler) {
        this.handler = handler;
    }
 
    public void debug(String message) { 
        if (handler != null) {
            handler.debug(message);
        }
    }
 
    public void error(String message) { 
        if (handler != null) {
            handler.error(message);
        }
    }
 
    public void fatal(String message) { 
        if (handler != null) {
            handler.fatal(message);
        }
    }
 
    public void info(String message) { 
        if (handler != null) {
            handler.info(message);
        }
    }
 
    public static class Handler {
  
        public void debug(String message) { }
        public void error(String message) { }
        public void fatal(String message) { }
        public void info(String message) { }
  
    }
 
}
    
com.paesia.schema.script.safe.jsoup.SJsoup class
package com.paesia.schema.script.safe.jsoup;

import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;

public class SJsoup {

    public static Document parse(String html, String baseUri) {
        return Jsoup.parse(html, baseUri);
    }

    public static Document parse(String html) {
        return Jsoup.parse(html);
    }
 
    public static Document parse(URL url, int timeoutMillis) throws Exception {
        if (!"http".equals(url.getProtocol()) && !"https".equals(url.getProtocol())) throw new Exception("Protocol is not supported!");
        return Jsoup.parse(url, timeoutMillis);
    }

    public static Document parseBodyFragment(String bodyHtml) {
        return Jsoup.parseBodyFragment(bodyHtml);
    }
 
    public static Document parseBodyFragment(String bodyHtml, String baseUri) {
        return Jsoup.parseBodyFragment(bodyHtml, baseUri);
    }
 
    public static String clean(String bodyHtml, String baseUri, Whitelist whitelist) {
        return Jsoup.clean(bodyHtml, baseUri, whitelist);
    }
 
    public static String clean(String bodyHtml, Whitelist whitelist) {
        return Jsoup.clean(bodyHtml, whitelist);
    }
 
    public static boolean isValid(String bodyHtml, Whitelist whitelist) {
        return Jsoup.isValid(bodyHtml, whitelist);
    }
 
    public static SConnection connect(String url) throws Exception {
        return connect(new URL(url));
    }

    public static SConnection connect(URL url) throws Exception {
        if (!"http".equals(url.getProtocol()) && !"https".equals(url.getProtocol())) throw new Exception("Protocol is not supported!");
        return new SConnection(Jsoup.connect(url.toString()));
    }
 
}
    
com.paesia.schema.script.safe.jsoup.SConnection class
package com.paesia.schema.script.safe.jsoup;

import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.nodes.Document;

public class SConnection {

    private Connection data;
 
    public SConnection(Connection data) {
        this.data = data;
    }
 
    public SConnection method(String src) {
        if ("get".equalsIgnoreCase(src)) {
            this.data.method(Method.GET);
        }
        if ("post".equalsIgnoreCase(src)) {
            this.data.method(Method.POST);
        }
        return this;
    }
 
    public Response execute() throws Exception {
        return this.data.execute();
    }

    public SConnection cookie(String name, String value) {
        this.data.cookie(name, value);
        return this;
    }
 
    public SConnection cookies(Map cookies) {
        for (Object key : cookies.keySet()) {
            cookie(key + "", cookies.get(key) + "");
        }
        return this;
    }
 
    public SConnection data(Map src) {
        Map<String, String> tag = new HashMap<String, String>();
        for (Object key : src.keySet()) {
            tag.put(key + "", src.get(key) + "");
        }
        this.data.data(tag);
        return this;
    }
 
    public SConnection data(String... keyvals) {
        this.data.data(keyvals);
        return this;
    }

    public Document get() throws Exception {
        return this.data.get();
    }
 
    public SConnection header(String name, String value) {
        this.data.header(name, value);
        return this;
    }

    public Document post() throws Exception {
        return this.data.post();
    }
 
    public Map getCookies() {
        return this.data.response().cookies();
    }
 
    public SConnection referrer(String referrer) {
        this.data.referrer(referrer);
        return this;
    }
 
    public SConnection timeout(int millis) {
        this.data.timeout(millis);
        return this;
    }
 
    public SConnection url(URL url) throws Exception {
        if (!"http".equals(url.getProtocol()) && !"https".equals(url.getProtocol())) throw new Exception("Protocol is not supported!");
        this.data.url(url);
        return this;
    }

    public SConnection url(String url) throws Exception {
        return url(new URL(url));
    }
 
    public SConnection userAgent(String userAgent) {
        this.data.userAgent(userAgent);
        return this;
    }
 
}
    
DataHandler class
public static class DataHandler extends Machine.Handler {
     
    public void debug(String message) { 
        logger.debug(message);
    }
  
    public void error(String message) { 
        logger.error(message);
    }
  
    public void fatal(String message) { 
        logger.fatal(message);
    }
  
    public void info(String message) { 
        logger.info(message);
    }
     
}
    
javascript
function main(env, args) {
    var links = args.get('links');
    try {
        var url = env.newURL('http://yahoo.com');
        var doc = env.newJsoup().parse(url, 60000);
        var elements = doc.select('a');
        for (var i = 0; i < elements.size(); i++) {
            var element = elements.get(i);
            var item = env.newHashMap();
            item.put('title', element.text());
            var href = env.newURL(url, element.attr('href'));
            item.put('link', href + '');
            links.add(item);
        }
    } catch (e) {
        env.error(e);
    }
}
    

  Protected by Copyscape Online Copyright Protection

Thursday, 12 April 2012

Run javascript in sandbox

Run javascript in sandbox
This task use java and Rhino to run javascript in sandbox.
Run javascript in sandbox
  1. Create Machine class as following
  2. Create DataHandler class as following
  3. Create javascript as following
  4. Call Machine.run() method as following
Call Machine.run() method
String js = loadJS();
Map args = new HashMap();
List links = new ArrayList();
args.put("links", links);
links.add("Input link 1");
links.add("Input link 2");

Machine env = new Machine(new DataHandler());
Machine.run(env, js, args);
      
for (int i = 0; i < links.size(); i++) {
    logger.info(links.get(i));
}
    
Machine class
public class Machine {

    private Handler handler;
 
    public static void run(Machine env, String js, Map args) throws Exception {
        try {
            Context cx = Context.enter();
            cx.setClassShutter(new ClassShutter() {
                public boolean visibleToScripts(String className) {  
                    if ("com.paesia.schema.script.Machine".equals(className)) return true;
                    if ("java.lang.String".equals(className)) return true;
                    if ("java.lang.Object".equals(className)) return true;
                    if ("java.util.HashMap".equals(className)) return true;
                    if ("java.util.ArrayList".equals(className)) return true;
                    if ("java.lang.Byte".equals(className)) return true;
                    if ("java.lang.Short".equals(className)) return true;
                    if ("java.lang.Integer".equals(className)) return true;
                    if ("java.lang.Long".equals(className)) return true;
                    if ("java.lang.Float".equals(className)) return true;
                    if ("java.lang.Double".equals(className)) return true;
                    if ("java.lang.Boolean".equals(className)) return true;
                    if ("java.lang.Character".equals(className)) return true;
                    if (className.startsWith("com.paesia.schema.script.safe.")) return true;
                    return false;
                }
            });   
            Scriptable scope = cx.initStandardObjects();
            Object result = cx.evaluateString(scope, js, "<js>", 1, null);
            Object fObj = scope.get("main", scope);
            if (!(fObj instanceof Function)) {
                throw new Exception("main() is undefined or not a function.");
            } else {
                Object functionArgs[] = { env, args };
                Function f = (Function)fObj;
                result = f.call(cx, scope, scope, functionArgs);
            }   
        } catch (Exception e) {
            throw e;
        } finally {
            Context.exit();   
        }
    }
 
    public String newString(String src) {
        return src;
    }
 
    public String newString(byte[] src, String charset) throws Exception {
        return new String(src, charset);
    }
 
    public HashMap newHashMap() {
        return new HashMap();
    }
 
    public ArrayList newArrayList() {
        return new ArrayList();
    }
 
    public Byte newByte(byte src) {
        return (Byte)src;
    }
 
    public Short newShort(short src) {
        return (Short)src;
    }
 
    public Integer newInteger(int src) {
        return (Integer)src;
    }
 
    public Long newLong(long src) {
        return (Long)src;
    }
 
    public Float newFloat(float src) {
        return (Float)src;
    }
 
    public Double newDouble(double src) {
        return (Double)src;
    }
 
    public Boolean newBoolean(boolean src) {
        return (Boolean)src;
    }
 
    public Character newCharacter(char src) {
        return (Character)src;
    }
 
    public Machine(Handler handler) {
        this.handler = handler;
    }
 
    public void debug(String message) { 
        if (handler != null) {
            handler.debug(message);
        }
    }
 
    public void error(String message) { 
        if (handler != null) {
            handler.error(message);
        }
    }
 
    public void fatal(String message) { 
        if (handler != null) {
            handler.fatal(message);
        }
    }
 
    public void info(String message) { 
        if (handler != null) {
            handler.info(message);
        }
    }
 
    public static class Handler {
  
        public void debug(String message) { }
        public void error(String message) { }
        public void fatal(String message) { }
        public void info(String message) { }
  
    }
 
}
    
DataHandler class
public static class DataHandler extends Machine.Handler {
     
    public void debug(String message) { 
        logger.debug(message);
    }
  
    public void error(String message) { 
        logger.error(message);
    }
  
    public void fatal(String message) { 
        logger.fatal(message);
    }
  
    public void info(String message) { 
        logger.info(message);
    }
     
}
    
javascript
function main(env, args) {
  var links = args.get('links');
  for (var i = 0; i < links.size(); i++) {
    env.info(links.get(i));
  }
  links.clear();
  links.add('Output link 1');
  links.add('Output link 2');
}
    

  Protected by Copyscape Online Copyright Protection