为啥投专栏呢?因为我懒得做视频了。
对程序具体如何实现没兴趣的可以跳过这一节
用python加上googletrans模块自动翻译的专栏已经有人写过了,但是这个模块还是有一些问题的,同时间请求翻译次数太多就会被Google翻译的服务器屏蔽。
当然了,googletrans模块的原理我们可以来看一下下面的代码:
在Translator类初始化时,生成了一个requests.session类用于和服务器交互所以说这个模块我感觉就是把正常的python的requests和json还有几个模块打包了一下,加上了Google翻译的url的参数。
在Translator.translate()函数中,调用了Translator._translate()函数
所以说最后还是一句get请求啊
如果程序抛出了json的异常的话,那就是请求被服务器拒绝了。
把代码贴这边吧:
import time
from googletrans import Translator
def google_trans(source):
trans=Translator(service_urls=["translate.google.cn"])
for i in range(100):
if i%2==0:
src,dest="zh-cn","en"
else:
src,dest="en","zh-cn"
try:
source=trans.translate(source,src=src,dest=dest).text
except Exception as e:
print("{}".format(e))
return "error"
time.sleep(2) #防止同时请求太多
return source
print(google_trans("呐呐呐,此生无悔入东方,来世愿生幻想乡。"))
没错,很草。
然后差不多就是上面的那段代码,加进了群里的QQ机器人插件里,然后在广大群友的调教下,即刻被橄榄了……
所以说这个方法行不通,于是还是决定用腾讯的翻译API(当然谷歌的API也可以,不过我注册不了账号)
就这个网址,然后注册申请app_key
就要马赛克遮住的俩东西
接下来就是写代码了,python环境安装我觉得应该没必要讲了吧,看到这边的应该都会(?)
算了,讲一下吧。
上python官网装一个Python3(https://www.python.org)或者装一个anaconda也可以(https://www.anaconda.com/),然后安装一下必要的组件……我看一下我用了啥组件。
打开cmd输入"pip install requests",如果你安装了anaconda,可以输入"conda install requests",两个效果基本上一样。(hmmm,我建议后者啊,有时候python自己是不带pip的你可能还要自己安装一下pip……网页链接 https://pypi.org/project/pip/,自己看文档学怎么安装吧)
安装环境这种事情啊,总是最头疼的嘛。
然后接下来就是敲代码了,首先应该先敲一下黑板,重点了。
考虑到前面既然在教怎么安装环境,那就顺便教到底吧。
打开一个文件夹(或者在桌面上也可以),右键-新建文本文档,重命名为translation.py,确定,右键编辑,输入下面的代码:
import hashlib
import time
import random
import string
from urllib.parse import quote
import json
import requests
def get_md5(src):
m = hashlib.md5(src.encode())
return m.hexdigest().upper()
def get_params(plus_item):
t=time.time()
time_stamp=str(int(t))
nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10))
app_id="**********" #把这边的内容替换成你的app_id
app_key="**********" #把这边的内容替换成你的app_key
params = { 'app_id':app_id,
'time_stamp':time_stamp,
'nonce_str':nonce_str,
}
for i in plus_item:
params[i]=plus_item[i]
sign_before=""
for key in sorted(params):
sign_before += '{}={}&'.format(key,quote(params[key], safe=' ').replace(" ","+"))
sign_before += 'app_key={}'.format(app_key)
sign = get_md5(sign_before)
params['sign'] = sign
return params
def UrlGet(url,data={}):
try:
count=0
req=""
while count<5:
try:
req=requests.post(url,data=data,timeout=3)
return req.text
except:
count+=1
continue
assert count<5,"超时"
except:
return "Error"
def trans(source):
for i in range(20): #你要翻译多少次,就把括号里面的数字改成多少,翻译50次就改成50,翻译100次就改成100
try:
if i%2==0:
dest="en"
else:
dest="zh"
data=UrlGet("https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate",get_params({"source":"auto","target":dest,"text":source}))
json_dict = json.loads(data)
#time.sleep(1)
if json_dict["ret"]!=0:
source="error"+str(json_dict["ret"])
break
source=json_dict["data"]["target_text"]
except:
print("遭遇了不可名状的错误!")
return
return source
print(trans(input("请输入你要翻译的话:")))
其实效果还是可以的,虽然程序长了一点(
说实话这个翻译其实还是可以的,许多时候还因为过于正确而无法生草……
呐,这也是很有哲理的说如果你对于程序如何实现没兴趣的话,这篇文章到此就结束了。
API的参考文档:https://ai.qq.com/doc/nlptrans.shtml
程序中间的UrlGet()函数就是进行request请求的(其实是我从自己的另外一个程序里面抄来的,百用不厌),遇到超时会进行重试,防止因为网络问题卡住。
get_params函数就是处理请求的参数的,具体的参数列表和解释参见参考文档。
就是这个
麻烦的还是那个接口鉴权,就是要把所有的请求参数按照参数名称排好序拼接起来,最后加上你的app_key,通过md5计算获得hash值。如果请求参数的hash值和服务器那边计算的值不一样的话,你的请求就会被拒绝。
返回的参数相对来说就是比较简单的了:
返回的格式是json
在很久很久之前,我还不知道python有json这个模块,然后手打正则匹配网页返回数据,那个酸爽啊。
这边有一个很大的坑,特别容易踩进去。输入的数据需要经过url编码, 但是正常的quote()编码会把空格编码成%20,鉴权时就会报错,要把空格替换成“+”。
如果调用Google的翻译API的话也是类似的,主要是请求方式和鉴权方式要稍微修改一下。