CQ CQ CQ, DE B4/BG6HXJ
1 项目简介
本文是基于之前课程内提到的“在线翻译”程序的改进版,当前添加了对腾讯翻译君的支持。
2 项目安排
在这个项目中,我们在基于彩云翻译API的基础上再添加了一个翻译引擎,即腾讯翻译君。
3 项目步骤
3.1 项目重构
由于先前的代码中没有单独对翻译引擎的请求作命名,为避免重复我们首先将相关变量进行重构操作。重命名后的相关变量如下图。
原版的程序需要通过命令行执行,在命令行中输入要查询的单词,不便于我们调试,因此我将其改写为程序开始执行后再输入单词,具体的代码如下:
func main() {
var word string
fmt.Printf("Please input a single word: ")
fmt.Scanf("%s", &word)
fmt.Println("彩云翻译结果:")
queryCaiYun(word)
}
3.2 抓包
抓取腾讯翻译君的翻译结果的方式与抓取彩云翻译的方式类似,详细方式如下:
- 打开翻译页面,按 F12 进入开发者工具
- 打开
网络选项卡,在左侧的输入框随意输入一个单词(这里输入了next),等待返回结果 网络面板中会出现一系列的内容,我们找到红框中的内容,确认其中包含翻译结果
具体的内容如下图,翻译结果如箭头所指。
3.3 请求代码生成
找到翻译结果后,我们使用代码生成工具来生成请求代码,具体步骤如下:
- 找到对应的项后,右键选择“复制-复制为cURL(bash)”
- 打开curlconverter工具,选择Go语言,将代码粘贴到输入框中
- 复制输出结果到IDE中,并对函数进行重命名操作,方便辨认修改
3.4 解析 response body
在控制台页面,选择sessionUuid内的内容,如下图,复制并粘贴到JSON转Golang Struct网站中,选择转换-嵌套,再将生成的结果复制粘贴到IDE中。
注意: 这里一定要选择嵌套方式,可以减少不必要的查错工作,同时方便后续调用
生成的代码中有许多我们不需要的返回值,因此我们需要对其进行简化,简化后的结果如下:
type DictResponseFanYiJun struct {
Translate struct {
Records []struct {
SourceText string `json:"sourceText"`
TargetText string `json:"targetText"`
TraceID string `json:"traceId"`
} `json:"records"`
} `json:"translate"`
}
之后,我们对新的请求函数进行修改,使得其满足我们输入单词查询的需要。具体的修改如下:
func queryFanYiJun(word string) {
client := &http.Client{}
var data = strings.NewReader(`source=auto&target=zh&sourceText=` + word + `&qtv=f37161172b4a75c1&qtk=nzTaGrrwyZwaCw4AGQXHcqHfYwcUToowfSdk4G5S5ToOP8m24e1KIiHHOf80vf4O5ZyOJkh26fsBZ7XBObOJmrOLsYZY2Pam3UNcgejPWPjvc5ZbtPPnTu4xkLiWj8xjd8Vz3zK1lYfY6j68UyIXyA%3D%3D&ticket=&randstr=&sessionUuid=translate_uuid1691751710511`)
//其他不变
//…
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
if resp.StatusCode != 200 { //添加返回错误码便于查错
log.Fatal("bad StatusCode: ", resp.StatusCode, " body ", string(bodyText))
}
//解析 response body
var dictResponse DictResponseFanYiJun
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
log.Fatal(err)
}
index := 0 //利用 index 变量实现对内部嵌套的调用
fmt.Println(dictResponse.Translate.Records[index].TargetText)
3.5 输出结果
接下来,我们只需要在main函数添加几行代码,实现新翻译引擎的输出即可。添加的语句如下:
//在彩云翻译的结果后面添加即可
fmt.Println("腾讯翻译君结果:")
queryFanYiJun(word)
运行后的输出结果如下图:
4 当前存在的问题
在解析翻译君的 response body 时,代码粘贴到IDE中测试运行时,返回的结果中Dict和Suggest这两个结构体返回的一定是空值,暂未发现解决办法。
DE B4/BG6HXJ. VY 73