Go的实践(二)| 青训营

123 阅读2分钟

一个在线翻译小词典

要联网哟

我没有进行老师最后一步,得再整合一下

1.首先我们要抓包

先别看起来有很多的代码,大部分都是生成的。 首先我们打开一个彩云小译,我觉的老师选这个是有意图的。可能我水平有限,还不够上道。 随便输入一个单词。再打开发者工具,在上面选择网络,找到dist这个选项,右击复制url,

image.png

2.进行转换成go

把复制的url贴到Convert curl to Go (curlconverter.com)这个网站,就可以生成了,如下代码

package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"strings"
)

func main() {
	client := &http.Client{}
	var data = strings.NewReader(`{"trans_type":"en2zh","source":"go"}`)
	req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("authority", "api.interpreter.caiyunai.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("app-name", "xy")
	req.Header.Set("content-type", "application/json;charset=UTF-8")
	req.Header.Set("device-id", "9a71480180f0fa65ceafeec2b5eb62a9")
	req.Header.Set("origin", "https://fanyi.caiyunapp.com")
	req.Header.Set("os-type", "web")
	req.Header.Set("os-version", "")
	req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
	req.Header.Set("sec-ch-ua", `"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"`)
	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", "cross-site")
	req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188")
	req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
	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)
	}
	fmt.Printf("%s\n", bodyText)
}

在这之后运行,出现了一大串的url样的

之后为了是数据写入,生成了一个结构体

type Dist struct {
	TransType string `json:"trans_type"`
	Source    string `json:"source"`
	User      string `json:"User"`
}

在上面知道传过去的是一个json的数据,所有我们用自带的库,通过结构体在转为json

获得结果

就算有了如上代码,还是得不到想要的结果,得到了一个数组的数据,我们还是要把数据转换,也要有一个结构体,但要定义的东西太多,我们利用JSON转Golang Struct - 在线工具 - OKTools这个网站就可以得到想要的结构体,但我没有成功(复制了结构体)也不知道那出问题,一粘就说出现在1处有]少了这个,在之后就是对数据进行切割

var dictResponse DictResponse
	err = json.Unmarshal(bodyText, &dictResponse)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(request.Source, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
	for _, item := range dictResponse.Dictionary.Explanations {
		fmt.Println(item)
	}

结果如下

image.png

最后

我本来想试试百度翻译,但看那个数据传出,不是json格式,橡一个表单一样,还是太菜了