围观腾讯云输入法如何回发用户输入

  太久没有写博客了,这个懒惰的惯性实在是太强大。这两天不说说360和QQ的事情,就显得很out了,但是说来说去却又很鸡毛。另外我怎么没有看到什么弹窗呢,听说好不热闹啊,TM/MSN和MSE用户艰难的表示鸭梨很大。腾讯云输入法回传用户输入数据,在这个节骨眼上被逮到,还真算给力。

 

  大家可以去“腾讯软件中心”试试这个云输入法,http://py.qq.com/web/。但是注意不要输入什么敏感内容,免的有被跨省的风险。百度也有类似的输入法,只是好像没有咋呼叫作云输入法,而且百度还支持手写。谁有兴趣,可以查一下哪家先出的这种输入法?

 

  说正经的,QQ云输入法是怎么工作的呢?很简单,给任意一个网页导入一个脚本文件就可以了。 

< script  type ="text/javascript"  language ="JavaScript"  src ="http://ime.qq.com/fcgi-bin/getjs" ></ script >

   相当简单。然后呢,取回一个大约42k的文件,叫ime.js。文件是压缩过的,版本号:rev.632(这个很重要,待会儿他们一加班,就拿不到了)

 

  脚本启动后,会后先向服务器报告一下客户端环境,这些从浏览器里获取的参数,不是什么隐私,就是user-agent都比这丰富。

http://ime.qq.com/fcgi-bin/reportfirst? key=d02e5d08310c90ac54d37089fbf3d8ed &version =632 &sp =1 &sw =1920 &sh =1080 &dw =1920 &dh =512 &t =1289458673612

   但是惊喜还是有的,这个报告中包含了一个唯一的key,作用就相当于浏览器session_id。接下来的所有和腾讯服务器的交互,都会带着这个key。

 

  在英文输入状态下,任何字符输入会被云输入法脚本截获,然后向服务器回发如下请求:

http://ime.qq.com/fcgi-bin/getword?key=d02e5d08310c90ac54d37089fbf3d8ed &cb =window.QQWebIME.callback612 &q =qq

   注意key!cb是ime.js运行后注册的回调函数,蓝色的qq是我的输入。服务器响因为:

window.QQWebIME.callback612({ " is_end " : " 0 " , " p " : " 1 " , " pg " : " 5 " , " q " : " qq " , " ret " : " suc " , " rs " :[ " QQ " , " 亲戚 " , " 亲亲 " , " 悄悄 " , " 轻轻 " , " 强求 " , " 求求 " , " 缺钱 " , " 请求 " , " 亲切 " , " 圈圈 " , " 前期 " , " 瞧瞧 " , " 亲情 " , " 全球 " , " 气球 " , " 齐全 " , " 取钱 " , " 情趣 " , " 千千 " ], " rscnt " : " 20 " , " rsn " :[ " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " , " 2 " ]})

   这时你可以像普通输入法一样进行选词,而且很自然的是,选词后没有服务器请求发生。也就是你的输入内容,都是在浏览器本地完成的,腾讯除了知道你请求了什么候选词列表外,不知道你到底输入了什么。似乎这一切都很美好,也就应该是这么美好才对,是吧?

 

  但是这不是360在隐私问题上掐QQ吗,本来我一直认为腾讯这么大一个上市公司,做事还是该有点底线的。但是360让大家看到了腾讯是没有底线的,真流氓揭露了伪君子。于是我就怀着最大的恶意想,这输入法因该还是有问题的。于是继续使用,突然发现一个异常的服务器请求,如下: 

http://ime.qq.com/fcgi-bin/reportword?key=d02e5d08310c90ac54d37089fbf3d8ed &num =11 &xl =danshi,%E4%BD%86%E6%98%AF,0,0,1,0|zhe,%E8%BF%99,0,0,1,0|bushi,%E4%B8%8D%E6%98%AF,0,0,1,0|zaihe,%E5%9C%A8%E5%92%8C,0,0,1,0|tengxun,%E8%85%BE%E8%AE%AF,0,0,1,0|zuoweiyige,%E4%BD%9C%E4%B8%BA%E4%B8%80%E4%B8%AA,0,0,1,0|shangshi,%E4%B8%8A%E5%B8%82,0,0,1,0|gongsi,%E5%85%AC%E5%8F%B8,0,0,1,0|zuoshihaishiyinggai,%E5%81%9A%E4%BA%8B%E8%BF%98%E6%98%AF%E5%BA%94%E8%AF%A5,0,0,1,0|you,%E6%9C%89,0,0,1,0|dixian,%E5%BA%95%E7%BA%BF,0,0,1,0

   把这堆编码过的字符转回来,是: 

http://ime.qq.com/fcgi-bin/reportword?key=d02e5d08310c90ac54d37089fbf3d8ed &num =11 &xl =danshi,但是,0,0,1,0|zhe,这,0,0,1,0|bushi,不是,0,0,1,0|zaihe,在和,0,0,1,0|tengxun,腾讯,0,0,1,0|zuoweiyige,作为一个,0,0,1,0|shangshi,上市,0,0,1,0|gongsi,公司,0,0,1,0|zuoshihaishiyinggai,做事还是应该,0,0,1,0|you,有,0,0,1,0|dixian,底线,0,0,1,0

  你这时是不是只想向狗日的企鹅竖起中指呢?

 

  这是不是我没看清楚了,把ime.js仔细看了一下,tmd居然是混淆过的,看得我好累。谜底就在这里了:

ha  =   function  () {
    
var  e  =  [], a  =   new  Image( 1 1 ), b  =   false ,
    j 
=   function  () {
        a.onload 
=  a.onerror  =   null ;
        b 
=   false ;
        J 
&&  CollectGarbage()
    },
    r 
=   function  (w) {
        b 
&&  j();
        a.src 
=  w;
        a.onload 
=  a.onerror  =  j;
        a.complete 
&&  j();
        b 
=   true
    },
    s 
=   "" , n  =   "" ,
    v 
=   function  () {
        
return  s  +   " &num= "   +  e.length  +   " &xl= "   +  e.join( " | " )
    };
    
return  {
        a:
        
function  () {
            
var  w;
            w 
=  c.c();
            w 
=  o.b( " cgiPrx " +   " reportfirst?key= "   +  o.b( " prvKey " +   " &version=632&sp= "   +  o.b( " lnchr " +   " &sw= "
                
+  screen.width  +   " &sh= "   +  screen.height  +   " &dw= "   +  w[ 0 +   " &dh= "   +  w[ 1 +   " &t= "   +  Ba;
            r(w);
            s 
=  o.b( " cgiPrx " +   " reportword?key= "   +  o.b( " prvKey " )
        },
        b:
        
function  (w) {
            
if  (S  !==  w) {
                
var  l  =  w.length;
                
if  ( 0   !==  l) {
                    
for  ( var  h  =   "" , m  =   "" , g  =   0 ; g  <  l; g ++ ) {
                        
var  x  =  w[g],
                        k 
=  encodeURIComponent(x.kanji);
                        e.push(x.spell 
+   " , "   +  k  +   " , "   +  n);
                        h 
+=  x.spell;
                        m 
+=  k
                    }
                    
1   <  l  &&  e.push(h  +   " , "   +  m  +   " , "   +  n);
                    
if  ( 10   <  e.length) {
                        r(v()); e 
=  []
                    }
                }
            }
        },
        j:
        
function  (w) {
            w 
=  o.b( " cgiPrx " +   " re?key= "   +  o.b( " prvKey " +   " &ec= "   +  w  +   " &py= "   +  B.o()  +   " &t= "
                
+  ( + new  Date).toString().slice( 0 - 3 +   " &v=632 " ;
            r(w)
        },
        k:
        
function  () {
            
if  ( 0   !==  e.length) {
                r(v());
                e 
=  []
            }
        },
        l:
        
function  () {
            
var  w  =   1   ===  o.b( " iptMode " );
            n 
=  [ " 0 " , o.b( " iptMode " -   1 , w  ?  o.b( " pyMode " ) :  " 0 " , w  &&   1   !==  o.b( " pyMode " ?  o.b( " spType " ) :  " 0 " ].join( " , " )
        }
    }
} ()

  多贴点code,表示这是技术贴,不是5毛贴咯(听说涨7毛了,通胀太厉害了)。答案就在这个ha伪类的函数b里,这个b函数是用来记录输入历史的,但是在这个方法最后,做了一个判断:if (10 < e.length) { r(v()); e = [] }。e是存放输入历史的数组,方法r和v是负责组装和回发数据的,发完后清空了e。

 

  难道收集用户输入内容成了中国国情了?微软拼音2010还真的有这个功能,不过它会明确提示用户,并且只是发回那些用户纠正输入推荐,而且回发的内容也是用户可以很容易看到和编辑的。另外同样是web ime的百度输入法,回发服务器的信息是:

http://olime.baidu.com/py?py=baidu &rn =0 &pn =20 &t =1289460415974

  注意,这里没有key信息,这不是说百度就不能identify你,因为还有浏览器session_id,但是百度的输入法没有回发用户实际选词,所以是无法在服务期上还原用户输入的。

 

  虽然这是篇技术文章,但是肯定掺杂了莫名的立场,那我现在的立场就是:胁迫用户者不得好死!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值