admin管理员组

文章数量:1532340

2024年3月11日发(作者:)

DOI:10.16184/.2014.16.048

电脑编程技巧与维护

百度翻译和有道翻译API

的封装与利用

黄皓

中山市广播电视大学,广东中山528400)

要:

国内提供在线翻译服务的公司

主要有百度和有道,两者均提供了互联网应用编程接口。讨论将这两个接口

再封装为一个DLL文件,支持动态链接导出函数和COM两种方式,使得各种编程语言能以更简单、灵活便捷的方

式使用这两个API。

关键词

在线翻译;百度;有道;API编程接口;动态链接库;COM编程接口

Package

andUseBaiduTranslationAPI&YoudaoTranslationAPI

HUANG

Hao

(Zhongshan

Radio&TelevisoinUniversity,GuangdongZhongshan528400,China

Abstract:DomestictoprovideonlinetranslationservicescompaniesmainlyBaiduandYoudao,bothofwhichprovideIn-

ticlediscussesthesetwointerfacesandthenrepackagedasaDLLfile,

whichsupportDLLexportedfunctionsandCOMmethods,sothatavarietyofprogramminglanguagescanbemoresimple,

flexibleandconvenientwaytousethesetwoAPI.

Keywords:onlinetranslation;Baidu;Youdao;APIprogramminginterface;DLL;COMAPIprogramminginterface

在线翻译是机器

翻译发展的重要方向,特别是在科技文

章的翻译方面发挥着越来越重要的作用。国内著名的在线翻

译提供商有百度翻译和有道翻译等。百度翻译是百度公司提

供互联网服务之一,提供多国语言之间的语句翻译。百度公

司从

2010

1

月开始研究机器翻译,翻译服务自

2011

6

月上线

,并得到国家

863

划的支持。有道翻译是网易公司

属下有道搜索提供的互联网服务,通过翻译和查词的数据接

口,用户可以获得一段文本的翻译结果或者查词结果。两者

所采用的自动翻译技术均是利用搜索引擎从互联网中萃取海

量双语资源,自动学习语言翻译模式并从中智能地选择最优

译文。除了在线提交文本和网页地址进行翻译以外,两者还

提供了应用程序编程接口(

API

)。

API

再封装

,提供一种简洁、易用的编程接口就显得十分

必要了。在

Windows

中,

DLL

(动态链接库

)是最基本的一种

编程接口,应用程序通过运行时链接

DLL

文件中的导出函数,

从而实现二进制代码的共享与复用

。绝大部分桌面编程语言,

C

C++

Delphi

VB

等都可以直接调用

DLL

中的

API

数。然而

,脚本编程语言如

ASP

PHP

JavaScript

VBScript

等缺乏直接使用

DLL

能力,必须通过更高级的编程接

——

COM

COM

是组件对象模型的简称,是由微软公司提出的一种

二进制代码共享机制。与

DLL

相比

COM

具有跨语言

、跨平

台、可重用、可扩展等特性,特别是客户端可以在不知道

COM

组件服务接口的情况下,动态查询

、动态调用

COM

组件

服务的接口方法。而

DLL

存在诸如语言限制、动态库的版本

混杂、接口的一致性难以保证等问题。

将百度翻译和有道翻译

API

重新封装

,既提供动态链接库

的导出函数,又提供

COM

对象,满足不同类型编程语言的需求。

1在线翻译API

百度翻译

API

和有道翻译

API

都是互联网服务应用编程

接口,简单地说就是通过

Internet

提供翻译服务

。其本质上属

Web

Service

,但是并没有采用

DCOM

CORBA

SOAP

机制

,而是直接通过

HTTP

协议与客户程序进行通信

。应用程

序按要求准备好相关参数,使用

HTTP

协议调用接口

,接口对

源文数据进行机器翻译,并返回处理的结果。应用程序无需

关心接口处理的细节。接口提供了不同语言、系统甚至平台

之间功能的利用。

API

使得第三方可以利用百度或有道翻译提

供特色服务(如嵌入到浏览器、网站或应用程序中),或使得

翻译更具有灵活性以满足用户个性化的需要。

3百度翻译与有道翻译API

概述

百度翻译

API

与有道翻译

API

的使用方式是相似的。

3.1申请key

不管是百度翻译还是有

道翻译

API

用户,首先都必须

从相应网站获得一个

Key

,作为请求服务的许可

。注册为百度

开发者,然后参照

/wiki/?ti-

tle=

帮助文档首页

/

网站接入

/

入门指南

,在开发者服务管理控

2重新封装在线翻译API

虽然百度

、有道在线翻译

API

简化了编程接口,但

是并

作者简介:

黄皓

1969-

),

男,讲师,硕士,研究方向:计

算机及应用。

非所有的编程语言都可以直接支持互联网功能和

HTTP

协议的

使用,特别是脚本语言。因此,如何在本地对百度、有道翻

收稿日期:2014-05-03

90

2014.

16

NETWORK

ANDCOMMUNICATION

制台中

,创建新的应用,获取相应的

API

Key

。在有道翻译的

页面

/openapi?path=data-mode

入自己

的网站描述(名称、地址、说明)和联系邮箱,提交申请后,

很快就可以得到一个邮件回复,上面有你的

key

网络与通信

符,对普通开发者提供

1000

/

小时限制

,如需扩容,可在百

度开发者中心的管理控制平台中申请更高频次。

有道翻译

API

的待翻译文本长度不能超过

200

字符,

请求频率限制为每小时

1000

次,超过限制会被封禁。如需要

更多的请求次数,必须向有道翻译管理员发邮件申请。

3.2数据接口

百度翻译可以使用

HTTP

get

post

方式发出请求

,有道

4使用PowerBASIC

封装百度、有道翻译API

PowerBASIC

可以生成非常紧凑的机器代码

,速度甚至可

翻译使用

HTTP

get

方式。为方便起见,统一使用

get

方式。

1

)百度翻译的请求方式

以超过

C

编写的程序

,它提供了非常丰富的语句和函数,特

别是具有可以直接调用

Win32API

、嵌入汇编指令等特性

,非

常适宜编写系统级的应用。

/public/2.0/bmt/translate?client_id

=

YourApiKey&from=auto&to=auto&q=

要翻译的文本

参数说明:

4.1输出DLL

在源程序中加入下面的编

译器指令和导出函数定义,即

可编译生成供外部程序调用的动态链接库文件

from

源语言语种

:语言代码或

auto

,英文为

en

to

目标语言语种

:语言代码或

auto

,中文为

zh

client_id

开发者在百度开发者中心注册得到的授权

key

q

翻译内容。该字段必须为

UTF-8

码,需要进行

urlencode

编码

2

)有道翻译的请求方式

/?keyfrom=&key=

&type=data&doctype=&version=1.1&q=

要翻译的

文本

参数说明:

#COMPILE

DLL“fanyi”'指示编译器生成DLL

FUNCTIONbaiduTranslateALIAS"baiduTranslate"

(BYVALsASString)EXPORTASString

'…具体代码…

ENDFUNCTION

4.2提供COM支持

脚本语言如

ASP

VBScript

Javascript

PHP

等大多不能

直接调用

DLL

,微软的

COM

组件提供了更高层次的编程接口

keyfrom

key

type

注册的名称

PowerBASIC

可以通过以下代码方便地生成

COM

服务程序

#COM

NAME"Fanyi",1.0

#COMTLIBON

#RESOURCETYPELIB,1,""

CLASSFanyiASCOM'定义COM类

INTERFACEiFanyi'定义接口

INHERITIDISPATCH'继承自调度接口

METHODbaiduALIAS"Baidu"(sASSTRING)

ASSTRING'定义Baidu方法

METHOD=UCODE$(baiduTranslate(ACODE$(s)))

ENDMETHOD

ENDINTERFACE

ENDCLASS

4.3源程序

#COMPILEDLL"fanyi"

#DIMALL

#COMNAME"Fanyi",1.0

#COMTLIBON

#RESOURCETYPELIB,1,""

#INCLUDE""'使用Windows系统API,

'如字符编码转换

#INCLUDE""'使用API访问互联网

'定义COM类,GUID和CLSID由编译器给定

CLASSFanyiASCOM

INTERFACEiFanyi

INHERITIDISPATCH

METHODbaiduALIAS"Baidu"(sASSTRING)

ASSTRING

METHOD=UCODE$(baiduTranslate(ACODE

$(s)))

ENDMETHOD

METHODyoudaoALIAS"Youdao"(sASSTRING)

2014.16

授权

key

返回结果的类型,固定为

data

返回结果的数据格式,

xml

json

jsonp

版本

,当前最新版本为

1.1

doctype

version

q

要翻译的文本

,必须是

UTF-8

编码

,字符长度不能超

选参数,

dict

表示只获取词典数据,

translate

200

个字符

,需要进行

urlencode

编码

only

示只获取翻译数据,默认为都获取

值得注意的是,词典结果只支持中英互译,翻译结果支

持英日韩法俄西到中文的翻译以及中文到英语的翻译。

3.3返回结果

百度翻译返回的数据为

json

包,翻译正常会返回如下

例中的内容:

{

"from":"en","to":"zh","trans_result":[{"

src":"today","dst":"u4ecau5929"}]}

trans_result

为一

个数组,其中每一个

{}

是一个段落。

译文中的英文、数字符号保持不变,而汉字等字符以

uxxxx

”的形式返回其

UNICODE

如出错

,则在返回的

json

中,包含

err_code

字段

有道翻译返回的数

据可以为

xml

json

jsonp

式,

本文以

json

为例

{"translation":["<译文>"],"query":"<原文>","

errorCode":<错误代码>}

结果为

UTF-8

编码

,如出错则错误代码不为

0

3.4限制

在百度翻译

API

中,待翻译文本的长度不能超过

2K

个字

91

电脑编程技巧与维护

AS

STRING

METHOD=UCODE$(youdaoTranslate(ACODE

$(s)))

ENDMETHOD

ENDINTERFACE

ENDCLASS

'自定义类型用于互联网访问

TYPEtagDownloadInfo

hWndParentASDWORD

wMsgASDWORD

URLPathASASCIIZ*2048'足够的URL长度

ResultASLONG

BytesReadASDWORD

lpBufASSTRINGPTR

ENDTYPE

GLOBALhDlgASDWORD

'函数:访问URL并返回结果

'入口:URL字符串

'出口:字符串

FUNCTIONqurryURL(sASSTRING)ASSTRING

LOCALDownloadInfoAStagDownloadInfo,sBufferAS

ASCIIZ*25000,xASLONG

LOCALhInternetSessionASDWORD,hFileASLONG,

BytesReadASDWORD

h=s

rent=0

=%WM_USER+1001

=VARPTR(sBuffer)

ead=0

=0

DownloadInfo.@lpBuf=SPACE$(4096)'缓冲区大小

hInternetSession=InternetOpen("TranslateSession",

%INTERNET_OPEN_TYPE_PRECONFIG,BYVAL0,BYVAL

0,0)

hFile=InternetOpenUrl(hInternetSession,DownloadIn-

h,_

BYVAL0,BYVAL0,%INTERNET_FLAG_PRAG-

MA_NOCACHEOR_

%INTERNET_FLAG_NO_CACHE_WRITEOR%

INTERNET_FLAG_RELOAD,0)

InternetReadFile(hFile,BYVALSTRPTR(Down-

loadInfo.@lpBuf),4096,BYREFBytesRead)'翻译结果长度

'均有限制,假定结果不超过4096字节

qurryURL=LEFT$(DownLoadInfo.@lpBuf,BytesRead)

InternetCloseHandlehFile:InternetCloseHandlehInternet-

Session

ENDFUNCTION

'百度翻译的导出函数

FUNCTIONbaiduTranslateALIAS"baiduTranslate"

(BYVALsrcASSTRING)EXPORTASSTRING

LOCALs$,a$(),p&,buf?()

s=UCODE$(src)

s=URLEncode(UnicodeToUtf8(STRPTR(s)))

s="/public/2.0/bmt/translate?

client_id=在百度申请得到的Key&from=auto&to=auto&q="&

s'百度翻译API的URL,必须使用你申请得到授权Key

s=qurryURL(s)'访问百度翻译API,返回结果

p=INSTR(1,s,"""trans_result""")

IFp>0THEN'如存在译文结果,则对json中的字符

'串进行处理

s$=MID$(s,p)

p=INSTR(1,s,"""dst"":""")

s=EXTRACT$(MID$(s,p+7),"""}]}")

p=PARSECOUNT(s,"u")

REDIMa(1TOp)

PARSEs,a(),"u"

s=a(1)

FORp=2TOUBOUND(a)

REDIMbuf(1)

DOWHILELEN(a(p))<4

a(p)="0"+a(p)

LOOP

buf(0)=VAL("&h"+MID$(a(p),3,2))

buf(1)=VAL("&h"+LEFT$(a(p),2))

s+=ACODE$(PEEK$(VARPTR(buf(0)),2))

IFLEN(a(p))>4THENs+=MID$(a(p),5):

REPLACE""WITH""INs:REPLACE""WITH"/

"INs

NEXT

FUNCTION=s

ENDIF

ENDFUNCTION

'有道翻译的导出函数

FUNCTIONyoudaoTranslateALIAS"youdaoTranslate"

(BYVALsrcASSTRING)EXPORTASSTRING

LOCALs$,t$,i&,a$()

s=UCODE$(src)

s=URLEncode(UnicodeToUtf8(STRPTR(s)))

s="/?keyfrom=在有道

翻译申请的应用名称&key=从有道获得的授权Key&type=da-

ta&doctype=json&version=1.1&q="&s'有道翻译的URL,

'必须使用你从有道翻译申请得到的授权信息

s=qurryURL(s)'访问有道翻译API,返回结果

IFVAL(REMAIN$(s,"""errorCode"":"))=0THEN

'如果没有错误则处理json中的译文

s=REMAIN$(s,"""translation"":")

s=EXTRACT$(2,s,"],")

s=ACODE$(Utf8ToUnicode(STRPTR(s)))

i=PARSECOUNT(s,""",""")

REDIMa(1TOi)

IFLEFT$(s,1)=""""THENs=MID$(s,2)

IFRIGHT$(s,1)=""""THENs=LEFT$(s,LEN(s)

-1)

PARSEs,a(),""","""

s=""

FORi=1TOUBOUND(a)

s+=$CRLF+a(i)

NEXT

FUNCTION=MID$(s,3)

ENDIF

ENDFUNCTION

'函数:对URL进行编码

92

2014.

16

NETWORK

ANDCOMMUNICATION

FUNCTI

ONURLEncode(strInputASSTRING)AS

STRING

LocalstrOutput$,intAscii%,i%,strTemp$

FORi=1TOLEN(strInput)

intAscii=ASC(MID$(strInput,i,1))

IF((intAscii<58)AND(intAscii>47))OR_

((intAscii<91)AND(intAscii>64))OR_

((intAscii<123)AND(intAscii>96))_

THEN

strOutput=strOutput&CHR$(intAscii)

ELSE

strTemp=TRIM$(HEX$(intAscii))

strOutput=strOutput&"%"&LEFT$(strTemp,2)

ENDIF

NEXT

FUNCTION=strOutput

ENDFUNCTION

'函数:将UTF8编码的字符串转换为UNICODE

FUNCTIONUtf8ToUnicode(BYVALptrStrAS

DWORD)ASSTRING

LOCALlengthASLONG,BufferASDWORD,buf()AS

BYTE

length=MultiByteToWideChar(%CP_UTF8,%NULL,

BYVALptrStr,-1,BYVAL%NULL,0&)

'分配足够大小的内存

REDIMbuf(1TOlength*2-1)

MultiByteToWideChar(%CP_UTF8,0,BYVALptrStr,-

1,BYVALVARPTR(buf(1)),length)

FUNCTION=PEEK$(VARPTR(buf(1)),length*2-1)

ENDFUNCTION

'函数:将UNICODE编码的字符串转换为UTF-8

FUNCTIONUnicodeToUtf8(BYVALptrStrAS

DWORD)ASSTRING

LOCALlengthASLONG

LOCALBufferASDWORD

length=WideCharToMultiByte(%CP_UTF8,%NULL,

BYVALptrStr,-1,BYVAL%NULL,0,BYVAL%NULL,BY-

VAL%NULL)

Buffer=HeapAlloc(GetProcessHeap(),0,length)

IFBufferTHEN

WideCharToMultiByte(%CP_UTF8,0,BYVALptrStr

,-1,BYVALBuffer,length,BYVAL%NULL,BYVAL%NULL)

FUNCTION=PEEK$(Buffer,length-1)

HeapFree(GetProcessHeap(),0,Buffer)

ENDIF

ENDFUNCTION

限于篇幅

,在本程序没有使用

json

的解析,而是直接

对包内文本进行提取;程序也没有对输入字符串长度进行检

测。当翻译服务出现错误时返回空串。

网络与通信

5.1调用DLL进行翻译

先将

文件复制到系统文件夹(如:

c:win-

dowssystem32

,然后打开

Word

,按

ALT+F11

VBA

境,在“工程

”窗口双击

thisDocument

,输入代码:

Private

DeclareFunctionyoudaoTranslateLib""

(ByValsAsString)AsString

Submain()

s="Longlongago,therewasawarbetweenthebirds

nowswhattheyfoughtabout."

s=baiduTranslate(s)

'直接调用DLL中的导出函数

oudaoTranslate(s)'用有道API将中文再

'翻译为英文

EndSub

5.2使用COM进行翻译

下面使用

COM

中的

Fanyi

对象

,调用封装后的方法对一

Word

文档的每一段进行翻译。

首先注册

COM

服务

,在

Windows

中运行

regsvr32

fanyi.

dll

然后如上所述在

Word

VBA

中输入代码

Sub

main()

DimoT,oPAsParagraph,sAsString

SetoT=CreateObject("Fanyi")'创建对象

aphs'对文档中的每一段落

s='取段落文本

'输出原文

(s)'调用Baidu翻译,输出译文

(s)'调用Youdao翻译并输出

Next

EndSub

6结语

在线机器翻译可以大大提高翻译工作的效率

,而在

Win-

dows

平台上对百度翻译

API

和有道翻译

API

再封装

,可以为

不同的程序设计语言提供更快捷、易用的编程接口,方便用

户通过编程使用百度、有道的云翻译服务,使翻译工作更具

有灵活性,可针对不同类型的文档内容,生成更具个性化输

出格式的翻译结果。

参考文献

[1]

潘爱民

.

COM

原理与应用

[M]

.

北京:清华大学出版社

,

1999.

[2]

COMProgrammingIntroduce.

[3]

百度开放云平台

.

[4]

有道翻译

API.

5再封装接口的使用

编译生成

文件后

,用户可以在

VB

C

Delphi

桌面编程语言中,动态或静态地调用

DLL

中的导出函数进行

翻译

,也可以注册为

COM

服务

,用户程序通过创建对象,使

Baidu

Youdao

方法进行翻译

。下面以

Word

中的

VBA

例介绍如何编程使用封装后的接口。

2014.16

93

本文标签: 翻译接口百度