01.1 Go语言工程实践-在线翻译器(多版本) | 青训营

157 阅读3分钟

CQ CQ CQ, DE B4/BG6HXJ


1 项目简介

本文是基于之前课程内提到的“在线翻译”程序的改进版,当前添加了对腾讯翻译君的支持。

2 项目安排

在这个项目中,我们在基于彩云翻译API的基础上再添加了一个翻译引擎,即腾讯翻译君。

3 项目步骤

3.1 项目重构

由于先前的代码中没有单独对翻译引擎的请求作命名,为避免重复我们首先将相关变量进行重构操作。重命名后的相关变量如下图。

image.png

原版的程序需要通过命令行执行,在命令行中输入要查询的单词,不便于我们调试,因此我将其改写为程序开始执行后再输入单词,具体的代码如下:

func main() {  
  
	var word string  
	fmt.Printf("Please input a single word: ")  
	fmt.Scanf("%s", &word)  
	fmt.Println("彩云翻译结果:")
	queryCaiYun(word)  
  
}

3.2 抓包

抓取腾讯翻译君的翻译结果的方式与抓取彩云翻译的方式类似,详细方式如下:

  1. 打开翻译页面,按 F12 进入开发者工具
  2. 打开网络选项卡,在左侧的输入框随意输入一个单词(这里输入了next),等待返回结果
  3. 网络面板中会出现一系列的内容,我们找到红框中的内容,确认其中包含翻译结果

具体的内容如下图,翻译结果如箭头所指。

image.png

3.3 请求代码生成

找到翻译结果后,我们使用代码生成工具来生成请求代码,具体步骤如下:

  1. 找到对应的项后,右键选择“复制-复制为cURL(bash)” image.png
  2. 打开curlconverter工具,选择Go语言,将代码粘贴到输入框中 image.png
  3. 复制输出结果到IDE中,并对函数进行重命名操作,方便辨认修改

3.4 解析 response body

在控制台页面,选择sessionUuid内的内容,如下图,复制并粘贴到JSON转Golang Struct网站中,选择转换-嵌套,再将生成的结果复制粘贴到IDE中。

image.png

注意: 这里一定要选择嵌套方式,可以减少不必要的查错工作,同时方便后续调用

生成的代码中有许多我们不需要的返回值,因此我们需要对其进行简化,简化后的结果如下:

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)

运行后的输出结果如下图:

image.png

4 当前存在的问题

在解析翻译君的 response body 时,代码粘贴到IDE中测试运行时,返回的结果中DictSuggest这两个结构体返回的一定是空值,暂未发现解决办法。


DE B4/BG6HXJ. VY 73