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=
要翻译的
文本
参数说明:
#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
版权声明:本文标题:翻译和有道翻译API的封装与利用_黄皓 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1710117560a249153.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论