分享

使用有道翻译API做翻译(c语言实现)

 战神之家 2014-05-18

使用有道翻译API做翻译(c语言实现)  

2014-01-14 23:37:53|  分类: 计算机语言相关 |举报 |字号 订阅

有道提供了一个翻译API接口,使用该接口我们可以做语言的翻译,不过只能做中英互译,这点相对百度和必应来说要弱了点,不过有道翻译API官网也提供了在网页中加入有道划词翻译的功能,还算不错,这里只使用API接口做一个简单的翻译程序而不说明网页划词的功能。

使用有道翻译API需要一个KEY,该KEY可以从fanyi.youdao.com/openapi?path=data-mode处申请,填写相应数据后会给你的邮件发送一封邮件,该邮件中有keyform和key,这个很重要,所以在填写邮件的时候千万别乱填。

有道的接口是
http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1.1&q=要翻译的文本

参数说明:

 type - 返回结果的类型,固定为data

 doctype - 返回结果的数据格式,xml或json或jsonp

 version - 版本,当前最新版本为1.1

 q - 要翻译的文本,不能超过200个字符,需要使用utf-8编码

errorCode:

 0 - 正常

 20 - 要翻译的文本过长

 30 - 无法进行有效的翻译

 40 - 不支持的语言类型

 50 - 无效的key


我的程序里使用了json格式,并用json-glib做解析,使用curl做get请求,这时有一个问题,那就是curl接收数据的时候是使用回调函数的方式,也就是说我们需要在得到接收到的数据中费点心思,有如下几个方案

1、将数据保存到文件中,然后再从文件中读取数据

2、创建一个比较大的字符数组作为参数传递给回调函数来得到数据

3、使用一个“全局”变量用来存储数据

4、创建一个字符指针传递给回调函数,在回调函数中动态开辟内存保存数据


我使用的方法是第4种,其实第一种方法也是可行的,下面放程序


#include <stdio.h>
#include <json-glib/json-glib.h>
#include <curl/curl.h>
#include "mysock/mysock.h"

#define KEYFROM "你的keyform"
#define KEY "你的key"

typedef struct
{
    char *data;
}DATA; //我们传递给回调函数的数据

size_t get_data(char *ptr,size_t size,size_t nmemb,DATA *userdata)
{
    if(userdata->data) //如果指针非空则动态增加内存
    {
        char *temp;
        int len;

        len=strlen(userdata->data);
        temp=malloc(len+1);
        strncpy(temp,userdata->data,len);
        free(userdata->data);

        userdata->data=malloc(len+nmemb+1);
        strncpy(userdata->data,temp,len);
        free(temp);
        strncat(userdata->data,ptr,nmemb);
        userdata->data[len+nmemb]='\0';
    }
    else
    {
        userdata->data=malloc(nmemb+1);
        strncpy(userdata->data,ptr,nmemb);
        userdata->data[nmemb]='\0';
    }

    return nmemb;
}

void parser_json(char *data) //解析json数据
{
    JsonParser *parser;
    JsonReader *reader;

    g_type_init();
    parser=json_parser_new();
    json_parser_load_from_data(parser,data,-1,NULL);
    reader=json_reader_new(json_parser_get_root(parser));

    if(json_reader_read_member(reader,"query"))
    {
        printf("%s\n",json_reader_get_string_value(reader));
        json_reader_end_member(reader);
    }

    if(json_reader_read_member(reader,"translation"))
    {
        int count;
        int i;

        count=json_reader_count_elements(reader);
        for(i=0;i != count;++i)
        {
            json_reader_read_element(reader,i);
            printf("%s\n",json_reader_get_string_value(reader));

            json_reader_end_element(reader);
        }

        json_reader_end_member(reader);
    }

    if(json_reader_read_member(reader,"basic"))
    {
        int count;
        int i;

        printf("\n简单翻译:\n");
        if(json_reader_read_member(reader,"phonetic"))
        {
            printf("%s\n",json_reader_get_string_value(reader));
            json_reader_end_member(reader);
        }
        else
        {
            json_reader_end_member(reader);
            json_reader_read_member(reader,"basic");
        }

        json_reader_read_member(reader,"explains");
        count=json_reader_count_elements(reader);

        for(i=0;i != count;++i)
        {
            json_reader_read_element(reader,i);
            printf("%s\n",json_reader_get_string_value(reader));

            json_reader_end_element(reader);
        }

        json_reader_end_member(reader);
        json_reader_end_member(reader);
    }

    if(json_reader_read_member(reader,"web"))
    {
        int count;
        int i;
        int j;
        int n;

        printf("\n网络翻译:\n");
        count=json_reader_count_elements(reader);

        for(i=0;i != count;++i)
        {
            json_reader_read_element(reader,i);

            json_reader_read_member(reader,"key");
            printf("%s\n",json_reader_get_string_value(reader));
            json_reader_end_member(reader);

            json_reader_read_member(reader,"value");
            n=json_reader_count_elements(reader);

            for(j=0;j != n;++j)
            {
                json_reader_read_element(reader,j);
                printf("%s\n",json_reader_get_string_value(reader));
                json_reader_end_element(reader);
            }

            json_reader_end_member(reader);
            json_reader_end_element(reader);
            printf("\n");
        }

        json_reader_end_member(reader);
    }
}

int main(int argc,char **argv)
{
    CURL *curl;
    char *url;
    DATA data;

    url=string_add("http://fanyi.youdao.com/openapi.do?keyfrom=%s&key=%s&type=data&doctype=json&version=1.1&q=%s",KEYFROM,KEY,argv[1]);
    curl=curl_easy_init();
    data.data=NULL;

    curl_easy_setopt(curl,CURLOPT_URL,url);
    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,get_data);
    curl_easy_setopt(curl,CURLOPT_WRITEDATA,&data); //传递接收数据的指针

    curl_easy_perform(curl);

    free(url);
    curl_easy_cleanup(curl);

    parser_json(data.data);
    free(data.data);

    return 0;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约