您的位置:首页 > 编程语言 > Python开发

基于QQ云输入法,用python实现的输入法(demo 版)

2011-12-25 16:58 791 查看
#!/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()


执行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: