金山词霸提供了API接口可以让我们方便使用,金山词霸也只能作中英互译(中文貌似不能翻译成英文,不知道是怎么回事),金山词霸提供的接口不仅仅只有翻译功能还有每是一句接口,相对于翻译API来说第日一句功能不需要申请key就可以使用,同时金山词霸还提供了浏览器划译的功能,该功能是一个javascript,将它保存到浏览器中的收藏栏中,在想使用该功能的时候点击该标签(启动划译)然后再使用鼠标在浏览器中选中就会进行翻译(原来有这种东西,我之前一直都不知道),本文主要讲使用翻译API接口做简单地翻译(为什么最近总是写关于翻译相关的文章,好吧,其实我准备使用这些API【金山词霸、有道、百度、必应】做一个简单的翻译软件,这些文章都是探路的。。。)
金山词霸翻译API也需要使用KEY,KEY的申请目的地是
open.iciba.com/?c=api
在词霸查词哪里填写相应内容,然后会给你的邮件中发送一封邮件,该邮件中有key,所以邮件千万别乱填,收到key后好好保管(原来目前金山词霸API的查词功能是不作限制的)
查词的接口也非常简单,使用HTTP的GET方式,接口地址是
http://dict-co.iciba.com/api/dictionary.php?w=go&key=******** w为要翻译的字/词
key为你申请的key
而返回数据的格式是XML的,只有XML,其实我还是比较喜欢json的。为什么?因为我对XML不太了解,所以赶鸭子上架,网上找了一个使用libxml2写的解析xml的程序看了一遍,然后自己简单地做了测试就这样使用libxml2进行解析了。发送GET请求还是使用curl,这次接收数据的方法我使用了保存到文件的方法(libxml2貌似只有从文件读取xml数据的方法= =)
下面放代码
#include "mysock/mysock.h"
#include <libxml/parser.h>
#include <curl/curl.h>
#define KEY "你的key"
size_t save_file(char *ptr,size_t size,size_t nmemb,void *userdata)
{
return fwrite(ptr,size,nmemb,(FILE *)userdata);
}
void parse_xml(char *name) //解析xml数据
{
xmlDocPtr doc;
xmlNodePtr root;
xmlChar *str;
doc=xmlParseFile(name);
root=xmlDocGetRootElement(doc);
root=root->children;
printf("翻译:\n\n");
while(root)
{
if(!xmlStrcmp(root->name,"pos"))
{
str=xmlNodeGetContent(root);
printf("%s",str);
xmlFree(str);
}
if(!xmlStrcmp(root->name,"acceptation"))
{
str=xmlNodeGetContent(root);
printf("%s",str);
xmlFree(str);
}
if(!xmlStrcmp(root->name,"sent"))
break;
root=root->next;
}
printf("\n\n例句:\n\n");
while(root)
{
if(!xmlStrcmp(root->name,"sent"))
{
str=xmlNodeGetContent(root);
printf("%s",str);
xmlFree(str);
}
root=root->next;
}
xmlFreeDoc(doc);
}
int main(int argc,char **argv)
{
CURL *curl;
CURLcode code;
char *url;
char *name;
FILE *fp;
url=string_add("http://dict-co.iciba.com/api/dictionary.php?w=%s&key=%s",argv[1],KEY);
name=tempnam(NULL,NULL); //生成一个临时文件用来保存xml数据
if((fp=fopen(name,"wb")) == NULL)
error_quit(name);
curl=curl_easy_init();
curl_easy_setopt(curl,CURLOPT_URL,url);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,save_file);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);
code=curl_easy_perform(curl);
free(url);
fclose(fp);
curl_easy_cleanup(curl);
parse_xml(name);
remove(name); //删除临时文件
return 0;
}