Stata调用百度翻译接口&翻译工具搜罗

Stata调用百度翻译接口&翻译工具搜罗

这个想法在一年前我第一次接触Stata编程的时候就有了。但是主要没办法解决的MD5算法的问题。我甚至看不懂MD5算法是怎么加密的。所以不得不搁置下来。终于昨天晚上我解决了这个问题······

百度翻译接口的使用

百度翻译API文档可以在这个网址上找到:通用翻译API技术文档

例如:将apple从英文翻译成中文,请求参数:

  • q=apple
  • from=en
  • to=zh
  • appid=2015063000000001
  • salt=1435660288
  • 平台分配的密钥: 12345678
  • 生成sign:
    • 拼接字符串1:拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678
    • 得到字符串1 =2015063000000001apple143566028812345678
  • 计算签名sign(对字符串1做md5加密,注意计算md5之前,串1必须为UTF-8编码)
    • sign=md5(2015063000000001apple143566028812345678)
    • sign=f89f9594663708c1605f3d736d01d2d4

完整请求为:

http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

然后会返回一个json:

1
{"from":"en","to":"zh","trans_result":[{"src":"apple","dst":"\u82f9\u679c"}]}

所以如果想在Stata里面实现这个过程,首先需要解决的问题就是md5加密字符串了。昨天晚上我发现了这个网站的这个功能:
文字加密解密
。事实上之前我也尝试找过一些这种网站,但是都没搞懂怎么做到的。但是这个网站很有趣。分析它的请求非常简单:

这个ajax返回的就是md5加密后的字符串。然后用curl就可以模拟了。简单分析了这个请求过程之后,发现下面的代码就可以得到“你好”的MD5加密字符串了:

1
curl 'https://tool.lu/encdec/ajax.html' --data 'code=你好&operate=md5' --compressed -o temp.txt

temp.txt的内容为:

1
{"status":true,"message":"","text":"4da0b76354a771a139259dcf4c6249ba"}

MD5字符串加密

所以可以首先写一个encryption.ado,这个命令可以把一个字符串加密然后将加密结果保存在返回值中:
ado文件下载:encryption.ado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
*! 字符串加密
*! 程振兴 2018年9月12日
*! 该命令是使用 https://tool.lu/ 网站提供的借口进行字符串加密和解密的。
*! 【用法】:
*! encryption string, [PATtern(string)]
*! string是要加密的字符串。
*! 【选项】:
*! pattern:选择加密模式,默认为md5,除此之外还可以选择:
*! + base64_encode
*! + base64_decode
*! + urlencode
*! + urldecode
*! + addslashes
*! + stripslashes
*! + md5
*! 【返回值】:
*! 加密得到的字符串会被存入返回值中,运行ret list可以看到。
*! 【示例】
*! * 默认使用MD5加密
*! encryption 你好
*! * base64_encode
*! encryption 你好, pat(base64_encode)
*! * base64_decode,注意返回的是unicode码
*! encryption 5L2g5aW9, pat(base64_decode)
*! * urlencode
*! encryption 你好, pat(urlencode)
*! * urldecode,注意返回的是unicode码
*! encryption %E4%BD%A0%E5%A5%BD, pat(urldecode)
*! * addslashes
*! encryption 你好, pat(addslashes)
*! * stripslashes
*! encryption 你好, pat(stripslashes)
*! * MD5:默认值
*! encryption 你好, pat(md5)
cap prog drop encryption
prog def encryption, rclass
syntax anything [, PATtern(string)]
cap preserve
qui{
if "`pattern'" == "" local pattern = "md5"
!curl 'https://tool.lu/encdec/ajax.html' --data 'code=`anything'&operate=`pattern'' --compressed -o temp.txt
infix strL v 1-20000 using temp.txt, clear
erase temp.txt
gen encryption = ustrregexs(1) if ustrregexm(v, `""text":"(.*)""')
if index(encryption, "\u") replace encryption = ustrunescape(encryption)
}
di in green "`pattern':" in yellow "`=encryption[1]'"
ret local encryption = encryption[1]
end

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
* 默认使用MD5加密
encryption 你好
md5:7eca689f0d3389d9dea66ae112e5cfd7

* base64_encode
encryption 你好, pat(base64_encode)
base64_encode:5L2g5aW9

* base64_decode
encryption 5L2g5aW9, pat(base64_decode)
base64_decode:你好

* urlencode
encryption 你好, pat(urlencode)
urlencode:%E4%BD%A0%E5%A5%BD

* urldecode
encryption %E4%BD%A0%E5%A5%BD, pat(urldecode)
urldecode:你好

* addslashes
encryption 你好, pat(addslashes)
addslashes:你好

* stripslashes
encryption 你好, pat(stripslashes)
stripslashes:你好

* MD5:默认值
encryption 你好, pat(md5)
md5:7eca689f0d3389d9dea66ae112e5cfd7

这样我们就完成了第一步。

在进行下面一步之前我们需要先解决Unicode字符转中文的问题。

Unicode字符转中文

这个直接使用Stata的ustrunescape()函数就能完成了(上面的ado代码里面也就是使用这个函数解决的这个问题),例如:

1
2
. di ustrunescape("\u4f60\u597d")
你好

调用百度翻译接口

至此,我已经把所有的问题解决了!然后就开始写这个翻译命令吧!再来看看这个示例接口:

1
2
3
4
5
6
7
http://api.fanyi.baidu.com/api/trans/vip/translate
?q=apple
&from=en
&to=zh
&appid=2015063000000001
&salt=1435660288
&sign=f89f9594663708c1605f3d736d01d2d4

为了方便,可以设定fromto参数的默认值为auto,appid我已经申请好了,我的appid是:20171205000102469,大家不要乱用哈。salt是一个随机数,我们可以用string(int(runiform()*1000000))输入。然后就是sign了,它由appid+q+salt+密钥四部分加密组成,密钥我也早就申请好了,我的密钥是:8PHPDzkGMr_kWd5rIhRc。接下来就简单了,我把这个命令取名为bdtrans。bdtrans.ado的代码如下,下载:bdtrans.ado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
*! Stata调用百度API
*! 程振兴 2018年9月12日
*! APPID和key可以从在百度翻译开放平台申请,网址:http://api.fanyi.baidu.com/api/trans/product/index
*! 【用法】:
*! bdtrans string, [From(string) To(string) APPID(string) KEY(string)]
*! 【选项】:
*! From: 翻译源语言,默认为auto
*! to: 译文语言,默认为auto
*! APPID: APP ID,默认为我自己的
*! KEY: 百度密钥,默认为我自己的
*! 【示例】:
*! bdtrans 你好
*! bdtrans 你好 苹果
cap prog drop bdtrans
prog def bdtrans
syntax anything, [From(string) To(string) APPID(string) KEY(string)]
tokenize `anything'
local num = wordcount("`anything'")
cap preserve
qui di "`num'"
forval word = 1/`num'{
local input = "``word''"
qui percentencode `input'
local q = "`r(percentencode)'"
if "`from'" == "" local from = "auto"
if "`to'" == "" local to = "auto"
local salt = "string(int(runiform()*1000000))"
if "`appid'" == "" local appid = "20171205000102469"
if "`key'" == "" local key = "8PHPDzkGMr_kWd5rIhRc"
qui{
encryption `appid'`q'`salt'`key'
local sign = "`r(encryption)'"
di "`sign'"
!curl 'http://api.fanyi.baidu.com/api/trans/vip/translate?q=`q'&from=`from'&to=`to'&appid=`appid'&salt=`salt'&sign=`sign'' --compressed -o temp.txt
infix strL v 1-20000 using temp.txt, clear
gen dst = ustrregexs(1) if ustrregexm(v, `""dst":"(.*)""')
}
qui if index(dst, "\u") replace dst = ustrunescape(dst)
di in green "``word'': " in yellow "`=dst[1]'"
erase temp.txt
}
end

示例:

1
2
3
4
5
6
. bdtrans 你好
你好: Hello

. bdtrans 你好 苹果
你好: Hello
苹果: Apple

终于实现了一年前的想法!

对比测试

之前我还写过一个dict命令,更加强大,是通过爬必应、有道词典实现的。所以就想对比一下两个命令的速度。由于网速变动不定,我会将下面的代码运行6次(后三次交换顺序运行),然后记录每个命令耗时:

1
2
3
4
set rmsg on
dict 你好
bdtrans 你好
set rmsg off
命令 1 2 3 4 5 6 平均
bdtrans 0.63 1.65 1.84 0.45 0.73 1.18 1.08
dict 0.95 1.64 2.61 0.93 7.44 2.82 2.73

虽然网络状况的偶然性很大,但是还是可以看出,bdtrans效率较高,但是同时却没有dict强大:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
. set rmsg on
r; t=0.00 17:28:20

. bdtrans 你好
你好: Hello
r; t=1.61 17:28:21

. dict 你好
【词语】:你好
【拼音】:nǐ hǎo
【英语】:
na.: hello; 〈正式,口〉how do you do?;
net.: Hello; Hi; How do you do
----------------------------------------------------------
r; t=3.35 17:28:25

. set rmsg off

另外再对比一下句子的翻译:

1
2
3
4
set rmsg on
bdtrans 床前明月光
dict 床前明月光, s
set rmsg off

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

. set rmsg on
r; t=0.00 17:32:44

. bdtrans 床前明月光
床前明月光: Abed, I see a silver light
r; t=1.73 17:32:46

. dict 床前明月光, s
【原文】:床前明月光
【译文】:
----------------------------------------------------------
r; t=1.11 17:32:47

. set rmsg off

dict 虽然很快,但是它没翻译。再换个句子:

1
2
3
4
set rmsg on
bdtrans 半江瑟瑟半江红
dict 半江瑟瑟半江红, s
set rmsg off

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
. set rmsg on
r; t=0.00 17:34:12

. bdtrans 半江瑟瑟半江红
半江瑟瑟半江红: Half River and half river red
r; t=2.48 17:34:14

. dict 半江瑟瑟半江红, s
【原文】:半江瑟瑟半江红
【译文】:Half river ruther and half river red
----------------------------------------------------------
r; t=1.37 17:34:16

. set rmsg off

最后再介绍一些我搜罗的可以翻译的效率工具。

fanyi

这个工具的地址是:afc163/fanyi。是一个python写的,可以在终端运行命令:

安装:

1
sudo cnpm install fanyi -g

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ fanyi love
love [ lʌv ] ~ fanyi.youdao.com

- n. 恋爱;亲爱的;酷爱;喜爱的事物;爱情,爱意;疼爱;热爱;爱人,所爱之物
- v. 爱,热爱;爱戴;赞美,称赞;喜爱;喜好;喜欢;爱慕
- n. (英)洛夫(人名)

1. Love
爱,爱情,恋爱
2. Endless Love
无尽的爱,不了情,蓝色生死恋
3. puppy love
早恋,青春期恋爱,初恋

love [ lʌv ] [ lʌv ] ~ iciba.com

- vt.&vi. 爱,热爱;爱戴;喜欢;赞美,称赞;
- vt. 喜爱;喜好;喜欢;爱慕;
- n. 爱情,爱意;疼爱;热爱;爱人,所爱之物;

1. They happily reflect the desire for a fusional love that inspired the legendary LOVE bracelet Cartier.
快乐地反映出为富有传奇色彩的卡地亚LOVE手镯所赋予的水乳交融之爱恋情愫。
2. Love is the radical of lovely, loveliness, and loving.
Love是lovely,loveliness及loving的词根。
3. She rhymes"love"with"dove".
她将"love"与"dove"两字押韵。
4. In sports, love means nil.
体育中,love的意思是零。
5. Ludde Omholt with his son, Love, in S?derma a bohemian and culturally rich district in Stockholm.
LuddeOmholt和他的儿子Love在南城——斯德哥尔摩市的一个充满波西米亚风情的文化富饶区散步。

也可以简写为fy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$ fy love

love [ lʌv ] ~ fanyi.youdao.com

- n. 恋爱;亲爱的;酷爱;喜爱的事物
- vt. 喜欢;热爱;爱慕
- vi. 爱
- n. (Love)人名;(英)洛夫

1. Love
爱情,爱,爱
2. Endless Love
无尽的爱,蓝色生死恋,不了情
3. puppy love
早恋,青春期恋爱,初恋

--------

love 英[ lʌv ] 美[ lʌv ] ~ iciba.com

- vt.& vi. 爱,热爱;爱戴;喜欢;赞美,称赞;
- vt. 喜爱;喜好;喜欢;爱慕;
- n. 爱情,爱意;疼爱;热爱;爱人,所爱之物;

1. They happily reflect the desire for a fusional love that inspired the legendary LOVE bracelet Cartier.
快乐地反映出为富有传奇色彩的卡地亚LOVE手镯所赋予的水乳交融之爱恋情愫.
2. Love is the radical of lovely , loveliness , and loving.
Love是lovely, loveliness 及loving的词根.
3. She rhymes " love " with " dove ".
她将 " love " 与 " dove " 两字押韵.
4. In sports, love means nil.
体育中, love的意思是零.
5. Ludde Omholt with his son, Love, in S ? derma a bohemian and culturally rich district in Stockholm.
LuddeOmholt和他的儿子Love在南城 —— 斯德哥尔摩市 的一个充满波西米亚风情的文化富饶区散步.

--------

love ~ dictionaryapi.com

- strong affection for another arising out of kinship or personal ties
- attraction based on sexual desire :affection and tenderness felt by
- affection based on admiration, , or common interests
- an assurance of affection
- warm , enthusiasm, or devotion
- the object of attachment, devotion, or admiration
- a beloved person
- unselfish loyal and benevolent concern for the good of another: as
- the fatherly concern of God for humankind
- brotherly concern for others
- a person's adoration of God
- a god or of love
- an episode
- the sexual embrace
- a score of zero (as in tennis)
- to hold dear
- to feel a lover's passion, devotion, or tenderness for
- to fondle
- to copulate with
- to like or desire actively :take pleasure in
- to in
- to feel affection or experience desire

--------

Alfred工具——bt

这是一个Alfred的workflows,Github地址为:diegozeng/Alfred-workflow-baidu-translate

安装使用之后的效果:

wd

这个也是Python写的命令行工具,Github地址为:chenjiandongx/youdao-wd

安装:

1
pip install youdao-wd

或者下载源码安装:

1
2
3
4
git clone https://github.com/chenjiandongx/youdao-wd.git
cd youdao-wd
pip install -r requirements.txt
python setup.py install

使用方法是:

1
2
3
4
5
6
7
8
9
10
11
$ wd -h
用法: wd [-h] [-v] [QUERY [QUERY ...]]

在命令行查单词

参数:
QUERY 需要翻译的单词

可选参数:
-h, --help 显示帮助文档
-v, --version 显示版本

例如:

1
2
3
4
5
6
7
8
9
$ wd python
>> python: python

n. 巨蟒;大蟒
n. (法)皮东(人名)

python['蟒蛇', 'Python', '蟒属']
Burmese Python['缅甸蟒', '缅甸蟒', '黄金蟒']
Python regius['球蟒', '球蟒']

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了658.8k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×