利用火山翻译:我对命令行词典的拙劣模仿 | 青训营笔记

274 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第1天
今天第一节GO基础课上老师用彩云翻译实现了命令行词典的demo,还留了个作业就是为命令行词典添加另外一种翻译引擎的支持,老师提了可以用字节的火山翻译,我就打算用火山翻译来写。
打开火山翻译,照着老师的方法打开检查开始找请求,好家伙给我一通找,最后可算找到了。

屏幕截图 2023-01-15 212354.png

赶紧看一看请求负载吧,这个source:"youdao",哈哈原来用的是有道词典的翻译引擎。
后面就是照着老师的操作来写程序了:

package main

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))
}

这个火山翻译输入得是包着string的slice,然后输出相比于彩云翻译较少,就一个翻译,下面就是这个demo的实际效果

屏幕截图 2023-01-15 213054.png 顺便也祝大家新年快乐!