[更新]必应词典第三方API
第一次在专栏发文,看到专栏里还没出现过技术相关文章有点害怕,不知道是不是发到不该发的地方了。
在Bing Developer Center里面,Bing提供了许多供开发者使用的API,包括翻译、地图和声音识别等等。然而,因为必应词典是中国必应所特有的,所以它并没有被包含在必应开发者中心当中,并且它本身也没有对开发者开放API。
尽管在市面上已经有词典提供免费查词API,但它们往往会用一个Key来限制使用量,而在App开发中,多个用户使用时经常会超过限额。以此为背景,我开发了必应词典的第三方API。
API的原理很简单,在接收到用户的请求后,主机向必应词典发送HTTP GET,并分析HTML文档中的内容,截取有用的部分发回给用户。由于每个单词的HTML页面大小为165KB左右,这种做法相比直接在客户端请求必应词典网页,为用户节约了很多流量。同时,在词典中抓取的结果会暂时存放在服务器上,下次再有相同的单词查询时,API会直接提取暂存结果而无须等待页面抓取。所以说, 这是一个用的人越多就越快的API 。( 点此 查看词库中实时词条数)
API的用法也采用了各平台都十分容易适配的方法,只需要向服务器上的BingService.aspx页面发送一个POST请求,带上需要查询的单词,就可以接收JSON格式的结果了。
API地址: http:// xtk.azurewebsites.net/B ingService.aspx
此处应读者要求,加入了Format参数,而为了兼容性,不带此参数并不影响API返回结果。不带此参数默认返回不带Value的JSON格式。
POST请求中所带参数为:
Action: 由于API可能后续添加除查词外其他功能,所以需要这个参数来指示所要执行的动作。在查词下,设置为"search"即可。
Word: 需要查询的单词或词组,不区分大小写,词组也可以直接查询,例如"roll film"。
[ 新增可选参数 ]Format: 此参数可以不带,不带或者带了错误值的参数都会返回默认的不带Value的JSON格式。参数不区分大小写,带上的话有两种选择:span和jsonwv。
API不会返回错误原因,参数缺失或错误直接返回空字符串。
返回的格式视乎Format参数而定:
Format为span时,返回格式是 :
单词或词组本身|美式音标(若有)|美式发音MP3地址|英式音标(若有)|英式发音MP3地址|翻译类型1|翻译内容1|翻译类型2|翻译内容2|...|翻译类型n|翻译内容n|
Format为jsonwv时,返回格式是 :
{ "word" : "单词或词组本身", "amep" : "美式音标(若有)", "ames" : "美式发音MP3地址", "brep" : "英式音标(若有)", "bres" : "英式发音MP3地址", "pos1" = "翻译类型1", "mn1" = "翻译内容1", "pos2" = "翻译类型2", "mn2" = "翻译内容2", ... }
其余情况,返回格式为 :
{ "单词或词组本身", "美式音标(若有)", "美式发音MP3地址", "英式音标(若有)", "英式发音MP3地址", "翻译类型1", "翻译内容1", "翻译类型2", "翻译内容2", ... }
[ 注意返回的单词并不一定与你发送过去的相同 ,例如发送了复数形式的单词bytes,则会返回byte及它的解释]
例如对于单词try:
POST参数为Action=search&Word=try&Format=span
返回的内容如下:
try|traɪ| https://dictionary.blob.core.chinacloudapi.cn/media/audio/tom/ca/60/CA602E3AF0A303976EDDEC7EF65CD955.mp3|tra ɪ| https://dictionary.blob.core.chinacloudapi.cn/media/audio/george/ca/60/CA602E3AF0A303976EDDEC7EF65CD955.mp3|n.| 尝试;努力;试图;在对方球门线后带球触地|v.|试;努力;设法;试图|网络|试验;试一试;试穿|
POST参数为Action=search&Word=try&Format=jsonwv
返回的内容如下:
{ "word" : "try", "amep" : "traɪ", "ames" : " https:// dictionary.blob.core.chinacloudapi.cn /media/audio/tom/ca/60/CA602E3AF0A303976EDDEC7EF65CD955.mp3 ", "brep" : "traɪ", "bres" : " https:// dictionary.blob.core.chinacloudapi.cn /media/audio/george/ca/60/CA602E3AF0A303976EDDEC7EF65CD955.mp3 ", "pos1" : "n.", "mn1" : "尝试;努力;试图;在对方球门线后带球触地", "pos2" : "v.", "mn2" : "试;努力;设法;试图", "pos3" : "网络", "mn3" : "试验;试一试;试穿" }
POST参数为Action=search&Word=try
返回的内容如下:
{ "try", "traɪ", "
https://
dictionary.blob.core.chinacloudapi.cn
/media/audio/tom/ca/60/CA602E3AF0A303976EDDEC7EF65CD955.mp3
", "traɪ", "
https://
dictionary.blob.core.chinacloudapi.cn
/media/audio/george/ca/60/CA602E3AF0A303976EDDEC7EF65CD955.mp3
", "n.", "尝试;努力;试图;在对方球门线后带球触地", "v.", "试;努力;设法;试图", "网络", "试验;试一试;试穿" }
在Windows 10 Universal App中,C#对该API调用如下:
async public Task<string> BingDictionary(string Word)
string Param;
byte[] Bytes;
Param = "Action=search&Word=" + WebUtility.UrlEncode(Word);
Bytes = System.Text.Encoding.ASCII.GetBytes(Param);
HttpWebRequest HWR;
HWR = (HttpWebRequest)HttpWebRequest.Create("http://xtk.azurewebsites.net/BingService.aspx");
HWR.ContinueTimeout = 2000;
HWR.Method = "POST";
HWR.ContentType = "application/x-www-form-urlencoded";
System.IO.Stream HReqs;
HReqs = await HWR.GetRequestStreamAsync();
HReqs.Write(Bytes, 0, Bytes.Length);
HReqs.Dispose();
WebResponse WRe = await HWR.GetResponseAsync();