课后作业命令行翻译软件 | 青训营

70 阅读3分钟

今天GO基础课上老师用彩云翻译为例子实现了一个命令行词典的演示demo,还留了个作业就是为这个命令行词典添加另外一种翻译引擎的支持,老师在课上提了可以用字节的火山翻译才做这个作业,我就打算用火山翻译来写这个小Demo。

1.整体代码:


import (
	"bufio"
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
)
type HuoshanResponse struct {
	Details []struct {
		Detail string `json:"detail"`
		Extra string `json:"extra"`
	} `json:"details"`
	BaseResp struct {
		StatusCode int `json:"status_code"`
		StatusMessage string `json:"status_message"`
	} `json:"base_resp"`
}
type HuoshanDictRequest struct{
	Source string `json:"source"`
	Words []string `json:"words"`
	SourceLanguage string `json:"source_language"`
	TargetLanguage string `json:"target_language"`

}
func huoshanquery(word string){
	client := &http.Client{}
	request := HuoshanDictRequest{ Source: "youdao",Words: []string{word},SourceLanguage: "en",TargetLanguage: "zh"}
	buf, err := json.Marshal(request)
	if err != nil {
		log.Fatal(err)
	}
	var data = bytes.NewReader(buf)
	req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/detail/v1/?msToken=&X-Bogus=DFSzswVLQDGcFyCWSZUOfGoB6lBt&_signature=_02B4Z6wo00001i2HznAAAIDDPdkrSx1W1C4th8rAAOiwlFIk-hy0pcOtY6jjbbX7KRsdnC3qCuzjJTJc.7WvVnqgQuS9O2vkchPbmcXRT9fKOz3Yd4qrbanLtiQPQwvNIYnY40ojCXIGaY1Wb3", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("authority", "translate.volcengine.com")
	req.Header.Set("accept", "application/json, text/plain, */*")
	req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
	req.Header.Set("content-type", "application/json")
	req.Header.Set("cookie", "x-jupiter-uuid=16737676287636246; i18next=zh-CN; s_v_web_id=verify_lcx214c6_bE7wDboo_yMsE_4OdX_BUpz_idZD74R2d7Sa; ttcid=ef9bbd23728740caa5bd35f414d6ce2e56; tt_scid=NdZmFEkYXl.Og48L13ge7xK4K1JwkSKjcWlCdhTtzbwtyiF2PvM7GTUMhT.CqnDgb2bb")
	req.Header.Set("origin", "https://translate.volcengine.com")
	req.Header.Set("referer", "https://translate.volcengine.com/?category=&home_language=zh&source_language=detect&target_language=zh&text=have%20a%20nice%20day")
	req.Header.Set("sec-ch-ua", `"Not_A Brand";v="99", "Microsoft Edge";v="109", "Chromium";v="109"`)
	req.Header.Set("sec-ch-ua-mobile", "?0")
	req.Header.Set("sec-ch-ua-platform", `"Windows"`)
	req.Header.Set("sec-fetch-dest", "empty")
	req.Header.Set("sec-fetch-mode", "cors")
	req.Header.Set("sec-fetch-site", "same-origin")
	req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.52")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	if resp.StatusCode!=200{
		log.Fatal("bad StatusCode:",resp.StatusCode,"body",string(bodyText))
	}
	var huoshanresponse HuoshanResponse
	err = json.Unmarshal(bodyText,&huoshanresponse)
	if err != nil{
		log.Fatal(err)
	}
	out := huoshanresponse.Details[0].Extra
	fmt.Println(out[12:len(out)-2])

}
func main() {
	fmt.Print("请输入待翻译句子:\n")
	reader := bufio.NewReader(os.Stdin)
	word,_,err := reader.ReadLine()
	if err!=nil{
		panic(err)
	}
	huoshanquery(string(word))
}

  1. huoshanquery 函数:

该函数用于向火山翻译API发送翻译请求,并处理翻译结果。首先,它创建了一个http.Client对象,并构建了一个 POST 请求,将待翻译的单词以 JSON 格式传递给火山翻译API。

接着,它发送请求并从响应中读取数据。如果请求不成功(状态码不为200),它会记录错误并终止程序。然后,它将从响应中解析出翻译结果,并打印在控制台上。

  1. main 函数:

该函数是程序的入口。它会提示用户输入待翻译的英文句子,并调用 huoshanquery 函数来进行翻译。

整个程序的实现核心是通过 HTTP POST 请求将待翻译的单词传递给火山翻译API,并解析响应中的结果以获取翻译后的中文文本。需要注意的是,该程序使用了一些特定的请求头信息,这些信息可能与特定的火山翻译API版本或权限有关。 4. 翻译输出:

翻译后的文本在huoshanquery函数内打印到控制台,此过程涉及解析来自API的响应。

  1. 可能的错误处理:

在这段代码中,程序使用log.Fatal(err)来处理可能出现的错误。log.Fatal将错误消息打印到控制台并终止程序。这种处理方式对于这样简单的程序可能是适用的,但在更复杂的应用程序中,应实现适当的错误处理和恢复机制。