首页 > 上网技巧 > 电脑小技巧 > 基于QQ云输入法用python实现的输入法

基于QQ云输入法用python实现的输入法

时间:2017-08-07 10:45 作者:QQ地带 我要评论

#!/bin/env python  
# -*- coding:utf-8 -*-   
# 基于QQ输入法,用python实现的输入法 (demo版)  
# by jinxing 2011-12-25   
  
""" 
QQ云输入法调用说明 
1.获取一个 key 
URL:  
    http://ime.qq.com/fcgi-bin/getkey?cb=PIME.keyback 将返回如下内容: 
参数说明:  
    cb=PIME.keyback 回调函数名 
 
返回内容: 
    PIME.keyback({"key":"9850f1051db25a1528883048c58cbe0c","ret":"suc"}) 
 
    key 用于以后的输入法请求中 
    ret suc,成功 
     
 
2.利用开放接口解析输入 
URL(五笔输入法):  
    http://ime.qq.com/fcgi-bin/gwb?key=9850f1051db25a1528883048c58cbe0c&cb=window.QQWebIME.callback885&q=w&p=1&pg=5 
参数说明: 
    key 之前获取到的key 
    cb  回调函数 
    q   查询的字符串 
    p   当前为查询字符口串的第几页候选字,可不设置,默认为1 
    pg  每页显示多少候选字,可不设置,默认为5,且仅支持 5、9 两个值,其他值按5处理 
 
返回内容: 
    window.QQWebIME.callback885({"is_end":"0","md":"1","p":"1","pg":"5","q":"w","ret":"suc","rs":["人","八","但","你","从","个","会","他","他们","公司"],"rsc":["","","jg","q","w","h","f","b","bwu","cng"],"rscnt":"10"}) 
 
    is_end    是否为最后一页 
    md    (只有五笔输入法有些值返回,md=1,表示是使用五笔输入法?) 
    p    第几页(同请求中的参数) 
    pg    一页应该显示多少个候选字(同请求中的参数) 
    q    查询的字符串(同请求中的参数) 
    ret    suc,成功 
    rs    返回的候选字列表,如果pg为5,该值一般会是10,如果pg为9,该值一般为9 
    rsc    对应 rs 中要输出某个候选字还应输入的字符(如:要直接输出"但",对比发现你还应该输入jg(五笔输入法)) 
    rscnt    返回的rs的数量 
 
URL(拼音输入法): 
    http://ime.qq.com/fcgi-bin/getword?key=9850f1051db25a1528883048c58cbe0c&cb=window.QQWebIME.callback885&q=c 
参数说明: 
    同五笔输入法 
返回内容: 
    window.QQWebIME.callback885({"is_end":"0","p":"1","pg":"5","q":"c","ret":"suc","rs":["才","错","次","从","草","菜","猜","擦","踩","惨","存","村","操","此","词","层","催","藏","凑","粗"],"rscnt":"20","rsn":["1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"]}) 
"""  
#"""  
#import urllib,urllib2  
from urllib2 import urlopen  
import sys,os  
  
class PIME(object):  
    @staticmethod  
    def keyback(kw):  
        if kw.get('ret',None) != 'suc':  
            raise '获取 key 出错:' + str(kw)  
        else :  
            return kw.get('key',None)  
    @staticmethod  
    def queryback(kw): ## 查询回调函数,只负责返回字典对象交由 parse_ret 处理  
        return kw  
  
    #IME 输入法,wb 五笔,py 拼音   
    # pg,一页显示多少字  
    # callback 回调函数名  
    def __init__(self,IME='wb',pg=5,callback='PIME.queryback'):  
        self.pg=pg      
        self.callback=callback  
        self.key=self.getKey()  
        if IME == 'wb':  
            self.URLpre='http://ime.qq.com/fcgi-bin/gwb?' + self.key  
        else :  
            self.URLpre='http://ime.qq.com/fcgi-bin/getword?' + self.key  
  
    # 获取 key  
    def getKey(self):  
        fb=urlopen('http://ime.qq.com/fcgi-bin/getkey?cb=PIME.keyback')  
        return eval(fb.read())  
  
    # p,查询第几页  
    def sQuery(self,q=None,p=1):  
        if not q:  
            return None  
        #elif self.retJSON.get('q',None) == q and int(self.retJSON['rscnt']) >= (pg * p):  
            #print int(self.retJSON['rscnt']) , (pg*p)  
            #print '############ got it' ## #debug  
            #self.retJSON['p']=p  
        #    return self.parse_ret(self.retJSON)  
        else :  
            qurl=[]  
            ## self.URLpre='http://ime.qq.com/fcgi-bin/gwb?key=9850f1051db25a1528883048c58cbe0c'  
            qurl.append(self.URLpre)  
            qurl.append('cb='+str(self.callback))  
            qurl.append('pg='+str(self.pg))  
            qurl.append('p='+str(p))  
            qurl.append('q='+str(q))  
            qurl='&'.join(qurl)  
  
            try:  
                fb=urlopen(qurl)  
                self.retJSON=eval(fb.read())  
            except:  
                import traceback  
                traceback.print_exc()  
                return  None  
            #print self.retJSON ## #debug  
            return self.parse_ret(self.retJSON)  
  
    def parse_ret(self,kw):  
        if kw.get('ret',None) != 'suc':  
            return '查询出错:' + str(kw.get('ret',None))  
  
        is_end=int(kw.get('is_end',0))  
  
        p=int(kw.get('p',0))  
        pg=int(kw.get('pg',0))  
  
        rscnt=int(kw.get('rscnt',0))  
        md=int(kw.get('md',0))  
  
        rs=kw.get('rs','')  
        rsc=kw.get('rsc','')  
  
        #for index,val in enumerate(rs):  
        retList=[]  
        if md == 1: ## 五笔输入法  
            for index in xrange(0, pg):  
                if index >= rscnt : break  
                retList.append((rs[index],rsc[index]))  
        else:  
            for index in xrange(0, pg):  
                if index >= rscnt : break  
                retList.append((rs[index],''))  
        return retList  
          
def lPrint(list):  
    if type(list) != type([]):  
        return None  
    for val in list:  
        print val[0]+','+val[1],  
    print ',',  
  
def main():  
    wubi = PIME('py')  
    #lPrint(wubi.sQuery('jkr'))  
    #lPrint(wubi.sQuery('jkr',3))  
    while True:  
        qs=sys.stdin.readline()  
        qs=qs.strip('\n')  
        if qs == '/exit':  
            break  
        for i in xrange(1,3):  
            lPrint(wubi.sQuery(qs,i))  
        print ''  
  
if __name__ =='__main__':  
    main()  
 
执行效果:
 

标签: Python
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告