在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
写了一段百度的测试了一下,之后只用正则表达式就好了,因为后来看到google code上面有人开发了基于ibus的搜狗的云输入法,故决定停止开发吧。
- #include <stdio.h>
 - #include <stdlib.h>
 - #include <errno.h>
 - #include <string.h>
 - #include <netdb.h>
 - #include <unistd.h>
 - #include <fcntl.h>
 - #include <fcntl.h>
 - #include <sys/time.h>
 - #include <sys/types.h>
 - #include <netinet/in.h>
 - #include <sys/socket.h>
 - #include<iconv.h>
 - #define MaxRecvLen 255
 - //定义网站结构
 - struct DOMAIN
 - {
 - char url[255]; //完整网址
 - char host[20]; //主机地址
 - int port; //sock 联接的端口号
 - };
 - typedef struct DOMAIN domain;
 - //*********************gb2312toutf-8****************
 - int gb2312toutf8(char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)
 - {
 - iconv_t cd;
 - if( (cd = iconv_open("utf-8","gb2312")) ==0 )
 - return -1;
 - memset(destbuf,0,destlen);
 - char **source = &sourcebuf;
 - char **dest = &destbuf;
 - if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
 - return -1;
 - iconv_close(cd);
 - return 0;
 - }
 - //***********************百度云输入法**************************
 - char* Getword(domain web_domain)
 - {
 - //******************* 有关 sock 的变量 *************************
 - int sock_id; //sock 联接句柄
 - struct hostent *hostbyname; //主机的信息 结构
 - struct sockaddr_in remote_addr; //包含远端主机IP地址和端口号的结构
 - //******************* 有关 无阻塞 select 所用到 的变量 *************
 - struct timeval timeout; //用于无阻塞 select 调用 的时间变量
 - fd_set sockid_readable; //sock 类似联接句柄 传递给 select 有效的连接
 - char send_str[255]; //保存要发送的字符串
 - char temp[2048];
 - char result[512];
 - char word[2048];
 - char *recBuf; //临时字串,接收到的字串指针
 - int recv_numb; //保存远端返回的字串大小
 - timeout.tv_sec = 10; //设置几秒钟超时
 - timeout.tv_usec = 5000; //设置几微秒超时
 - //******************* 处理命令行的参数 *************************
 - hostbyname = gethostbyname(web_domain.host); //将基本名字和地址转换
 - if((sock_id=socket(PF_INET,SOCK_STREAM,0))==-1)
 - {
 - perror("socket");
 - exit(1);
 - }
 - //初始化远端要传递的socket
 - remote_addr.sin_family=AF_INET; //地址族
 - remote_addr.sin_port=htons(web_domain.port); //端口号
 - remote_addr.sin_addr=*((struct in_addr *)hostbyname->h_addr); //IP地址
 - bzero(&(remote_addr.sin_zero),8); //填充0 以保持与struct sockaddr同样大小
 - //和服务器建立连接
 - if(connect(sock_id,(struct sockaddr *)&remote_addr,sizeof(remote_addr))==-1)
 - {
 - perror("connect");
 - exit(1);
 - }
 - //printf("\n\nconnected %s:%d ok!\n\n",web_domain.host,web_domain.port);
 - //创建要发送给远端的字串
 - 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);
 - //printf("%s\n\n",send_str);
 - //开始向服务器发送数据
 - if(send(sock_id,send_str,strlen(send_str),0)==-1)
 - {
 - perror("send");
 - exit(1);
 - }
 - recBuf=(char *)malloc(MaxRecvLen); //为储存远端返回的字串的变量申请空间
 - while(1)
 - {
 - //设置无堵塞模式
 - FD_ZERO(&sockid_readable);
 - FD_SET(sock_id,&sockid_readable);
 - select(sock_id+1, &sockid_readable, NULL, NULL, &timeout);
 - if (!FD_ISSET(sock_id, &sockid_readable))
 - {
 - printf("Timed out.\n");
 - //break;
 - }
 - recv_numb = recv(sock_id,recBuf,MaxRecvLen,0); //得到远端返回的字串
 - recBuf[recv_numb]=‘\0‘;
 - gb2312toutf8(recBuf,strlen(recBuf),result,512);
 - strcat(temp,result);
 - if(recv_numb<1) //返回的长度不够退出循环
 - {
 - break;
 - }
 - }
 - //printf("\n\nrecv ok!\n\n");
 - close(sock_id);
 - strcpy(word,temp+190);
 - return word;
 - }
 - int main(int argc,char *argv[])
 - {
 - char tempStr[255],*temp;
 - domain web_domain; //定义一个 web domain 的结构
 - strcpy(tempStr,"http://olime.baidu.com/py?pn=10&py=");
 - strcat(tempStr,argv[1]);
 - strcat(tempStr,"&rn=");
 - strcat(tempStr,argv[2]);
 - strcpy(web_domain.url,tempStr);
 - strcpy(web_domain.host,web_domain.url+7);
 - //处理 host
 - if((temp=strstr(web_domain.host,"/")))
 - {
 - *temp=‘\0‘; //web_domain.host 里去除:后的东西
 - }
 - if((temp=strstr(web_domain.host,":")))
 - {
 - *temp=‘\0‘; //Host 里去除:后的东西
 - web_domain.port=atoi(tempStr+1); //改写端口
 - }
 - else
 - {
 - web_domain.port=80;
 - }
 - //printf("%s\n%d\n%s\n",web_domain.host,web_domain.port,web_domain.url);
 - printf("%s\n",Getword(web_domain));
 - return 0;
 - }
 
本文出自 “天才鸟蛋” 博客,请务必保留此出处http://curley.blog.51cto.com/1627940/449044
搜狗云输入法移植到linux平台的想法,码迷,mamicode.com
原文地址:http://blog.csdn.net/curley/article/details/24692837