1. 准备,先在使用python一步一步搭建微信公众平台(一)中基本实现自动回复的功能后,接着在有道词典上申请一个key,http://fanyi.youdao.com/openapi?path=data-mode
2.根据有道的api使用说明
数据接口
http:
/
/
fanyi.youdao.com
/
openapi.do?keyfrom
=
<keyfrom>&key
=
<key>&
type
=
data&doctype
=
<doctype>&version
=
1.1
&q
=
要翻译的文本
版本:
1.1
,请求方式:get,编码方式:utf
-
8
主要功能:中英互译,同时获得有道翻译结果和有道词典结果(可能没有)
参数说明:
type
-
返回结果的类型,固定为data
doctype
-
返回结果的数据格式,xml或json或jsonp
version
-
版本,当前最新版本为
1.1
q
-
要翻译的文本,不能超过
200
个字符,需要使用utf
-
8
编码
errorCode:
0
-
正常
20
-
要翻译的文本过长
30
-
无法进行有效的翻译
40
-
不支持的语言类型
50
-
无效的key
|
3.知道怎么调用后后面的就简单了,加上你的要查询的词,可以是中文,也可以是英文,我建议返回格式doctype是json的,因为和xml相比使用更简单,更容易理解,关于如何使用json解析,可以看我以前写的博文,python解析json,我们来查看一下有道翻译返回的json的基本格式
成功返回翻译结果都会有一个叫basic的key的,于是我们接下来写一个fanyi的函数,之前在头部记得import json
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def
youdao(word):
qword
=
urllib2.quote(word)
baseurl
=
r
'http://fanyi.youdao.com/openapi.do?keyfrom=yourAppName&key=yourAppKey&type=data&doctype=json&version=1.1&q='
url
=
baseurl
+
qword
resp
=
urllib2.urlopen(url)
fanyi
=
json.loads(resp.read())
##根据json是否返回一个叫“basic”的key来判断是否翻译成功
if
'basic'
in
fanyi.keys():
##下面是你自已来组织格式
trans
=
u
'%s:\n%s\n%s\n网络释义:\n%s'
%
(fanyi[
'query'
],'
'.join(fanyi['
translation
']),'
'.join(fanyi['
basic
']['
explains
']),'
'.join(fanyi['
web
'][0]['
value']))
return
trans
else
:
return
u
'对不起,您输入的单词%s无法翻译,请检查拼写'
%
word
|
4.我们将之前得到的content进行翻译操作
1
2
|
Nword
=
youdao(content)
return
self
.render.reply_text(fromUser,toUser,
int
(time.time()),Nword)
|
5.将之前的鹦鹉学舌的return删除掉,下面在微信给你的公众账号发几个词看看能不能得到翻译结果
6.兴奋了一把之后,发现只有英文可以翻译成中文,但中文却不能翻译成英文,初步推测是破编码搞的,因为这个我搁浅了一段时间,今天终于搞定了,将得到的content进行一下是否是unicode的判断,如果是unicode则对其进行utf-8转码
1
2
3
4
5
|
if
type
(content).__name__
=
=
"unicode"
:
content
=
content.encode(
'UTF-8'
)
Nword
=
youdao(content)
return
self
.render.reply_text(fromUser,toUser,
int
(time.time()),Nword)
|
关于python中的各种编码的头疼问题可以google,推荐几篇文章
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
7.以后继续更加好玩的功能
1月23日更新,有网友反馈,说只判断basic是否在key中,会导致很多有道本来是翻译成功了,但我的程序没有返回值,其实查看有道翻译的api,它是根据errorCode来判断是否返回成功的,如果是0则是返回正常,还有一些返回值,那么我将我的程序进行改进,选判断errorCode,然后再判断translation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def
youdao(word):
qword
=
urllib2.quote(word)
baseurl
=
r
'http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=json&version=1.1&q='
url
=
baseurl
+
qword
resp
=
urllib2.urlopen(url)
fanyi
=
json.loads(resp.read())
if
fanyi[
'errorCode'
]
=
=
0
:
if
'basic'
in
fanyi.keys():
trans
=
u
'%s:\n%s\n%s\n网络释义:\n%s'
%
(fanyi[
'query'
],'
'.join(fanyi['
translation
']),'
'.join(fanyi['
basic
']['
explains
']),'
'.join(fanyi['
web
'][0]['
value']))
return
trans
else
:
trans
=
u
'%s:\n基本翻译:%s\n'
%
(fanyi[
'query'
],'
'.join(fanyi['
translation']))
return
trans
elif
fanyi[
'errorCode'
]
=
=
20
:
return
u
'对不起,要翻译的文本过长'
elif
fanyi[
'errorCode'
]
=
=
30
:
return
u
'对不起,无法进行有效的翻译'
elif
fanyi[
'errorCode'
]
=
=
40
:
return
u
'对不起,不支持的语言类型'
else
:
return
u
'对不起,您输入的单词%s无法翻译,请检查拼写'
%
word
|
这样可以翻译一些不长的句子,而且还可以翻译韩语,日语等,但问题也出来了,即使输入乱七八糟的内容lkajfladfaldfladkf也会给你返回个相同的内容,内容过长的话,有道和微信的定义貌似不一样,有道可以翻译,但是微信不一定可以返回内容,另外一个问题是有引号“'”会转码'望网友大神共同讨论解决