今天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))
}
huoshanquery函数:
该函数用于向火山翻译API发送翻译请求,并处理翻译结果。首先,它创建了一个http.Client对象,并构建了一个 POST 请求,将待翻译的单词以 JSON 格式传递给火山翻译API。
接着,它发送请求并从响应中读取数据。如果请求不成功(状态码不为200),它会记录错误并终止程序。然后,它将从响应中解析出翻译结果,并打印在控制台上。
main函数:
该函数是程序的入口。它会提示用户输入待翻译的英文句子,并调用 huoshanquery 函数来进行翻译。
整个程序的实现核心是通过 HTTP POST 请求将待翻译的单词传递给火山翻译API,并解析响应中的结果以获取翻译后的中文文本。需要注意的是,该程序使用了一些特定的请求头信息,这些信息可能与特定的火山翻译API版本或权限有关。 4. 翻译输出:
翻译后的文本在huoshanquery函数内打印到控制台,此过程涉及解析来自API的响应。
- 可能的错误处理:
在这段代码中,程序使用log.Fatal(err)来处理可能出现的错误。log.Fatal将错误消息打印到控制台并终止程序。这种处理方式对于这样简单的程序可能是适用的,但在更复杂的应用程序中,应实现适当的错误处理和恢复机制。