2013-4-21

  近日偶然看到js页面文字选中后分享到新浪微博实现,发现原来竟然只要一句话就可以实现获取划词。便萌生自己写个划词翻译的东东,方便自己看文档。

 

  我首先想到了之前看到的油猴插件,最早是在看优酷去广告插件的原理时知道这个东西。感觉其原理是在 server 发的 response 页面上嵌入了自己写的js脚本,以达到邪恶的目的。

  注:Chrome的脚本叫,Tampermonkey,或者可以用网上写的不用插件的方法。 

  实现思路是,获取划词,然后建一个iframe,内嵌网页为有道词典的网页版http://dict.youdao.com/   组查询链接比如 http://dict.youdao.com/search?le=eng&q=zzzzz  表示查询zzzzz。

  效果:

  

  实现代码:

 1 var di;
 2 var div_id = \'translate_word\';
 3 di = document.getElementById(div_id);
 4 
 5 // make di
 6 if(!di){
 7     di = document.createElement("DIV");
 8 }
 9 di.id = div_id;
10 di.style.position = \'absolute\';
11 di.style.backgroundColor=\'white\';
12 document.body.appendChild(di);
13 
14 var get_selected_word = function(){
15     var txt = \'\';
16     //not support ie6 (which can not use this script :P)
17     txt = document.getSelection();
18     return txt.toString();
19 }
20 var ifr = document.createElement(\'iframe\'); 
21 ifr.id = \'yd_translat_ifr\';
22 document.onmouseup = function(e){
23     //alert("asdf");
24     var txt = get_selected_word();
25     sh = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
26     var left = (e.clientX - 40 < 0) ? e.clientX + 20 : e.clientX - 40;
27     var top = (e.clientY - 40 < 0) ? e.clientY + sh + 20 : e.clientY + sh - 40;
28     if(txt){
29         top = top + 80;
30         di.style.top = top + "px";
31         ifr.src = "http://dict.youdao.com/search?le=eng&q=" + get_selected_word();
32         ifr.height = 300;
33         ifr.width = 1000;    
34         document.getElementById(di.id).appendChild(ifr);
35     }else{
36         if(document.getElementById(di.id).firstChild){
37             document.getElementById(di.id).removeChild(document.getElementById(di.id).firstChild);
38         }   
39     }
40 }

  

2013-5-7

  分析有道划词插件

  我猜想既然如此简单,有道肯定有自己的划词翻译,根据我的猜测,他的插件肯定得调用他的查询接口。通过chrome查看请求应该能获取能得到他的公共接口。(注:其实有道有提供公共api,不过得注册,oauth验证等,比较麻烦。)

  

  由图可见,划词时client只得到了第一条test.开头的flash,鼠标每次移在声音按钮上后便向server请求此词的声音。

  最重要的翻译结果在哪里?。。。

  手贱 , 意外发现:

   

  话说看到这个我的心情小小的激动了下,chrome就是好啊,开源就是好。。。

  然后发现了youdao的公用webservice(xml格式的)

  比如查询abc

  js组的 查询请求:

1         var url = \'http://dict.youdao.com/fsearch?client=deskdict&keyfrom=chrome.extension&q=\'+encodeURIComponent(word)+\'&pos=-1&doctype=xml&xmlVersion=3.2&dogVersion=1.0&vendor=unknown&appVer=3.1.17.4208&le=eng\'
2         xhr.open(\'GET\', url, true);
3         xhr.send();

  用ajax实现,其实 http://dict.youdao.com/fsearch?q=abc 就行了,个人使用就用这个webservice把,免费的,不验身份,无限调用的。

  client 字段,keyfrom等,我猜测可能是youdao用来统计,各个产品的调用数量吧。。

 

  我觉得其实chrome的插件就是个新的网页(不然会存在跨域问题),激活插件就=在后台开了个页面。

  可是为什么我在xxx页面划词,会得到查询结果呢?

  通过查看源码,惊讶的发现此为options.js的代码仅仅是插件的popup的查询模块代码,与划词翻译没有关系。囧。

  看代码时顺便看出个代码错误。

  document.getElementsByName(\’word\’).focus();   囧~

 

  意外发现中文版chrome插件文档(感谢360攻城狮)http://open.chrome.360.cn/extension_dev/overview.html

   

  

 

 

 

 

版权声明:本文为Lelpuchcr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Lelpuchcr/archive/2013/05/07/3065024.html