搜狗云输入法移植到linux平台的想法

时间:2014-04-29 13:23:20   收藏:0   阅读:584

 在ubuntu9.04的时代,自带的输入法一直认为不够好用,看到了搜狗的云输入法,故产生了移植的想法。

通过chrome的inspect Element功能,我发现了搜狗、百度、QQ云输入法的接口。公布一下,供大家参考。

百度http://olime.baidu.com/py?py=bit&rn=0&pn=5

搜狗http://web.pinyin.sogou.com/api/py?key=938cdfe9e1e39f8dd5da428b1a6a69cb&query=bit

QQhttp://ime.qq.com/fcgi-bin/getword?key=f56b884eebd87625cb4f87fcf125b0db&cb=window.QQWebIME.callback238&q=y

写了一段百度的测试了一下,之后只用正则表达式就好了,因为后来看到google code上面有人开发了基于ibus的搜狗的云输入法,故决定停止开发吧。

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <errno.h> 
  4. #include <string.h> 
  5. #include <netdb.h> 
  6. #include <unistd.h> 
  7. #include <fcntl.h> 
  8. #include <fcntl.h> 
  9. #include <sys/time.h> 
  10. #include <sys/types.h> 
  11. #include <netinet/in.h> 
  12. #include <sys/socket.h> 
  13. #include<iconv.h> 
  14. #define MaxRecvLen  255 
  15.  
  16. //定义网站结构 
  17. struct DOMAIN 
  18.     char url[255];      //完整网址 
  19.     char host[20];      //主机地址 
  20.     int  port;       //sock 联接的端口号 
  21. }; 
  22. typedef struct DOMAIN domain; 
  23.  
  24. //*********************gb2312toutf-8**************** 
  25. int gb2312toutf8(char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen) 
  26.     iconv_t cd; 
  27.     if( (cd = iconv_open("utf-8","gb2312")) ==0 ) 
  28.         return -1; 
  29.     memset(destbuf,0,destlen); 
  30.     char **source = &sourcebuf; 
  31.     char **dest = &destbuf; 
  32.  
  33.     if(-1 == iconv(cd,source,&sourcelen,dest,&destlen)) 
  34.         return -1; 
  35.     iconv_close(cd); 
  36.     return 0; 
  37.  
  38.  
  39. //***********************百度云输入法************************** 
  40. char* Getword(domain web_domain) 
  41.  
  42. //******************* 有关 sock 的变量 ************************* 
  43.  
  44.     int sock_id;       //sock 联接句柄 
  45.  
  46.     struct hostent *hostbyname;    //主机的信息 结构 
  47.     struct sockaddr_in remote_addr;   //包含远端主机IP地址和端口号的结构 
  48.  
  49.  
  50. //******************* 有关 无阻塞 select 所用到 的变量 ************* 
  51.  
  52.     struct timeval timeout;     //用于无阻塞 select 调用 的时间变量 
  53.     fd_set sockid_readable;     //sock 类似联接句柄 传递给 select 有效的连接 
  54.  
  55.  
  56.  
  57.     char send_str[255];      //保存要发送的字符串 
  58.     char temp[2048]; 
  59.     char result[512]; 
  60.     char word[2048]; 
  61.     char *recBuf;     //临时字串,接收到的字串指针 
  62.  
  63.     int recv_numb;       //保存远端返回的字串大小 
  64.  
  65.     timeout.tv_sec = 10;      //设置几秒钟超时 
  66.     timeout.tv_usec = 5000;    //设置几微秒超时 
  67.  
  68. //******************* 处理命令行的参数 ************************* 
  69.  
  70.  
  71.  
  72.     hostbyname = gethostbyname(web_domain.host);  //将基本名字和地址转换 
  73.     if((sock_id=socket(PF_INET,SOCK_STREAM,0))==-1) 
  74.     { 
  75.         perror("socket"); 
  76.         exit(1); 
  77.     } 
  78.  
  79. //初始化远端要传递的socket 
  80.     remote_addr.sin_family=AF_INET;      //地址族 
  81.     remote_addr.sin_port=htons(web_domain.port);  //端口号 
  82.     remote_addr.sin_addr=*((struct in_addr *)hostbyname->h_addr);  //IP地址 
  83.     bzero(&(remote_addr.sin_zero),8);     //填充0 以保持与struct sockaddr同样大小 
  84.  
  85. //和服务器建立连接 
  86.     if(connect(sock_id,(struct sockaddr *)&remote_addr,sizeof(remote_addr))==-1) 
  87.     { 
  88.         perror("connect"); 
  89.         exit(1); 
  90.     } 
  91.     //printf("\n\nconnected %s:%d ok!\n\n",web_domain.host,web_domain.port); 
  92.  
  93. //创建要发送给远端的字串 
  94.     sprintf(send_str,"GET %s HTTP/1.1\nAccept: */*\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\nHost: %s\n\n",web_domain.url,web_domain.host); 
  95.     //printf("%s\n\n",send_str); 
  96. //开始向服务器发送数据 
  97.     if(send(sock_id,send_str,strlen(send_str),0)==-1) 
  98.     { 
  99.         perror("send"); 
  100.         exit(1); 
  101.     } 
  102.     recBuf=(char *)malloc(MaxRecvLen);  //为储存远端返回的字串的变量申请空间 
  103.  
  104.     while(1) 
  105.     { 
  106.  
  107. //设置无堵塞模式 
  108.         FD_ZERO(&sockid_readable); 
  109.         FD_SET(sock_id,&sockid_readable); 
  110.         select(sock_id+1, &sockid_readable, NULL, NULL, &timeout); 
  111.         if (!FD_ISSET(sock_id, &sockid_readable)) 
  112.         { 
  113.             printf("Timed out.\n"); 
  114.             //break; 
  115.         } 
  116.         recv_numb = recv(sock_id,recBuf,MaxRecvLen,0); //得到远端返回的字串 
  117.         recBuf[recv_numb]=‘\0‘
  118.  
  119.  
  120.         gb2312toutf8(recBuf,strlen(recBuf),result,512); 
  121.  
  122.         strcat(temp,result); 
  123.         if(recv_numb<1)  //返回的长度不够退出循环 
  124.         { 
  125.             break
  126.         } 
  127.     } 
  128.  
  129.     //printf("\n\nrecv  ok!\n\n"); 
  130.     close(sock_id); 
  131.     strcpy(word,temp+190); 
  132.     return word; 
  133.  
  134. int main(int argc,char *argv[]) 
  135.     char tempStr[255],*temp; 
  136.     domain web_domain;      //定义一个 web domain 的结构 
  137.     strcpy(tempStr,"http://olime.baidu.com/py?pn=10&py="); 
  138.     strcat(tempStr,argv[1]); 
  139.     strcat(tempStr,"&rn="); 
  140.     strcat(tempStr,argv[2]); 
  141.     strcpy(web_domain.url,tempStr); 
  142.     strcpy(web_domain.host,web_domain.url+7); 
  143.  
  144. //处理 host 
  145.     if((temp=strstr(web_domain.host,"/"))) 
  146.     { 
  147.         *temp=‘\0‘;         //web_domain.host 里去除:后的东西 
  148.     } 
  149.     if((temp=strstr(web_domain.host,":"))) 
  150.     { 
  151.  
  152.         *temp=‘\0‘;         //Host 里去除:后的东西 
  153.         web_domain.port=atoi(tempStr+1);    //改写端口 
  154.     } 
  155.     else 
  156.     { 
  157.         web_domain.port=80; 
  158.     } 
  159.  
  160.     //printf("%s\n%d\n%s\n",web_domain.host,web_domain.port,web_domain.url); 
  161.     printf("%s\n",Getword(web_domain)); 
  162.     return 0; 

 

本文出自 “天才鸟蛋” 博客,请务必保留此出处http://curley.blog.51cto.com/1627940/449044

搜狗云输入法移植到linux平台的想法,码迷,mamicode.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!