写在开头:本篇笔记实际上会需要网络中的部分工具
题目分析
在课程当中,在课程的讲述之下,我们已经实现了对于一个翻译引擎-彩云小译,在输入单词之后能及时的返回对应的释义,那么,课后作业中所要求的是另外一种翻译引擎的实现,那么其实我们可以采取同样的方法来实现另外一种翻译引擎,那么接下来则是作者针对于彩云翻译进行解析以及合适的翻译引擎进行寻找以及转换的过程
彩云翻译引擎在go中的实现
课程案例复现
在课程当中,我们所使用的翻译引擎为“彩云小译”那么我们再进行一次翻译并予以监听来对熟悉类似的结构
打开翻译页面并启动开发者工具-网络对于翻译的结果进行监听,在dict请求中,我们可以得到如下图所示的对应结构
那么仔细的检查之后,我们便可以发现在经历dict的请求之后,我们便可以得到对应的释义以及相关的翻译结果 那么我们便可以将这个请求通过一定的手段植入到对应的go语言程序当中。
将请求转换为代码
那么在获取到请求之后,我们需要将对应的请求通过一些在线工具转换为对应的go代码,那么接下来将演示如何提取出我们所获得的curl请求
还是定位到刚刚的请求,选中这个对应的请求,然后右键点击在弹出的选项中选中复制再选中以curl(bash)元素复制如下图所示
至于所提取的请求,我们可以使用一些在线工具,在这里我贴出对应的工具链接,可点击跳转 点击跳转: Convert [curl] commands to Python, JavaScript and more
在提取出对应的请求代码之后,我们可以进入对应的页面将请求转换为相关的代码如下图所示
而在下方页面的代码显示出后,我们便可以保存代码以便后续的操作
将生成的代码做移植到我们自己所书写的程序中
在将课程相关的代码进行程序的转换之后,我们便可以将所转换出的代码移植进入go语言程序中进行查看
而在对于程序进行简单的查看之后,我们就可发现,如果想真正的实现一个程序的书写,我们只需要在data的请求头做出简单的修改和输出的方法进行简单的处理就可以达到对应的实现效果
那么向上看,我们只需要对应的修改data中的source属性就可以
那么在这里我们就简单的定义变量,将所需要翻译的词语在先前进行输入,然后仿照的发送相关的请求,就可以实现向主体的服务器发送对应的文章请求,那么我们做出对应的修改如下图:
实际上这张图仅仅只是对于对应的文字做出简单的修改,就可以达到实际上的操作的效果。
而为了使得我们的请求能输出我们想要的结果,我们还需要对于所返回的结构做对应的数据解析,从而保证我们的输出不会乱码,而这里,我们可以使用在线的相关的工具来实现对应的返回操作,而对应的工具连接我们也可以点击跳转。 点击跳转到相关的工具:# 在线JSON转Golang Struct
**
而为了将结构体正确的进行解析,我们需要到原来的网页中将相关的请求头进行复制如下图所示:
注:就是在原来的对应的请求页面中地点击响应,随后将对应的请求出的数据进行复制,随后再进行粘贴即可
在这里我们需要注意的是,在转嵌套的过程当中,我们还是需要点击“转嵌套进行操作”
随后我们将转换好的嵌套复制到程序当中并同时定义一个变量,使用刚刚所定义的结构并使用json中的unmarshal方法将这个json数据进行解体,并赋值到对应的数据中(别忘记对于错误的处理!!!)
而在完成上述的操作之后,我们便可以书写对应的输出语句,从而达到输出的目的
双翻译的实现
而对于双引擎的翻译,实际上我们可以将一个翻译引擎封装为一个函数,这样我们便可以得到两个函数,而将需要翻译的内容在主函数中进行输入,然后调用相关的函数即可实现双翻译的引擎,实际上和上方的复现几乎一致,为了不过于赘述,下方将对应的输出相关的程序以及输出贴在下方了,可以参照性的进行参考
package main
//实例项目,字典,通过对于json数据的转义并通过调用api将对应请求对应的字典释义并将对应的字典释义并予以输出
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
)
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"user_id"`
}
type JSONData struct {
Rc int `json:"rc"`
Wiki struct {
} `json:"wiki"`
Dictionary struct {
Prons struct {
EnUs string `json:"en-us"`
En string `json:"en"`
} `json:"prons"`
Explanations []string `json:"explanations"`
Synonym []interface{} `json:"synonym"`
Antonym []interface{} `json:"antonym"`
WqxExample []interface{} `json:"wqx_example"`
Entry string `json:"entry"`
Type string `json:"type"`
Related []interface{} `json:"related"`
Source string `json:"source"`
} `json:"dictionary"`
}
func main() {
fmt.Println("Please type word")
var word string
fmt.Scanln(&word)
if len(os.Args) != 1 {
fmt.Fprintf(os.Stderr, "Usages:Simple Dict Word Example:simpleDict hello")
os.Exit(1)
}
querya(word)
queryb(word)
}
func querya(word string) {
client := &http.Client{}
request := DictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request)
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh")
req.Header.Set("app-name", "xiaoyi")
req.Header.Set("authorization", "bearer")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "1d6b4628b178145e4d2a6539269b7598")
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", `"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"`)
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/123.0.0.0 Safari/537.36")
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)
}
var dictResp JSONData
err = json.Unmarshal(bodyText, &dictResp)
if err != nil {
log.Fatal(err)
}
fmt.Println("彩云翻译结果")
fmt.Printf("\tUS: %s, UK: %s\n", dictResp.Dictionary.Prons.EnUs, dictResp.Dictionary.Prons.En) //注意这个是printf的函数列的操作符
for _, item := range dictResp.Dictionary.Explanations {
fmt.Println("\t\t" + item)
}
}
type JSONDataa struct {
Errno int `json:"errno"`
Data []struct {
K string `json:"k"`
V string `json:"v"`
} `json:"data"`
Logid int `json:"logid"`
}
func queryb(word string) {
client := &http.Client{}
buf := word
var data = strings.NewReader("kw=" + buf)
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Accept", "*/*")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Cookie", `BAIDU_WISE_UID=wapp_1719050141191_202; ZFY=vV:BbLlntC2STIyAD:B4GmlkHpMeJWPlJL3HKyfuOIiQ8:C; MAWEBCUID=web_GXxjbDbYEajrqtPGggrFRwRtaXXnKWugyFqoEUaNZaowizMhks; __bid_n=1903fd20d8b8048f000844; BAIDUID=35AF4F499C20273A19CB31E90118B128:FG=1; BAIDUID_BFESS=35AF4F499C20273A19CB31E90118B128:FG=1; jsdk-uuid=41ec324b-cd81-4d44-a14d-8bfedcbe18a3; ppfuid=FOCoIC3q5fKa8fgJnwzbE67EJ49BGJeplOzf+4l4EOvDuu2RXBRv6R3A1AZMa49I27C0gDDLrJyxcIIeAeEhD8JYsoLTpBiaCXhLqvzbzmvy3SeAW17tKgNq/Xx+RgOdb8TWCFe62MVrDTY6lMf2GrfqL8c87KLF2qFER3obJGmPhhuM9ZopjXGt7c8jzm8FGEimjy3MrXEpSuItnI4KD+wgCL4GMXc1ktqPSg1lx7ljU6SlS005ReAMbnkin1hGfaz5zrMtDVze4t3aUqbDkhJsVwXkGdF24AsEQ3K5XBbh9EHAWDOg2T1ejpq0s2eFy9ar/j566XqWDobGoNNfmfpaEhZpob9le2b5QIEdiQfJoRasGKIZpz9IPNud00ryFCMUN0p4SXVVUMsKNJv2Twf3kvwvNr6RI6q3unUwuiQt6cYpWyqHjM9ohi141qpDzkWOdjFiy1eD/0R8HcRWYlNwh+8Tcxj3F1xiQ6fFGkOp+HBavJhpxl858h16cMtKQmxzisHOxsE/KMoDNYYE7ucLE22Bi0Ojbor7y6SXfVj7+B4iuZO+f7FUDWABtt/WWQqHKVfXMaw5WUmKnfSR5wwQa+N01amx6X+p+x97kkGmoNOSwxWgGvuezNFuiJQdt51yrWaL9Re9fZveXFsIu/gzGjL50VLcWv2NICayyI8BE9m62pdBPySuv4pVqQ9Sl1uTC//wIcO7QL9nm+0N6JgtCkSAWOZCh7Lr0XP6QztjlyD3bkwYJ4FTiNanaDaDPcUo2zQwHed/AzKYeNm2/ZPb5PCfhAQxJSR4QO4/C16CDGs5W7c/hENVGS7RCsohSGk66HDxtjKMU4HPNa0dthF7UsHf7NW9eE+gwuTQSa7GLWfOy9+ap4iFBQsmjpefgOF89jAHLbnVUejtrqqvdVSQ/4gzJOb0DGzeEZ5GeyMzgLkehXgk0UZz/MyefUOQXlV3f0HZXSpuSxTnDK9hXLZEuBHhU0MbbED5DF65/h/gBRkDPTwtXjYtgzmW74m0fDU2MZaxpBZZF8YurfocYcmDdcxFKeoIFQmVqAoAU+3YcXQt2xKThZZyV1v3sCvnzidUZtKM9cRRUfRWBtQSb50APM+gs/408xg7KHCB8AOKpZpfIpPhQ0RJhew8GR0aQSrA+avoKMisIiuIyvlqUS1+J9aSd42+X78fDIZgkPh3epzLLvwRmnAbs5z/V+jlqWKQfmWDj8hssOuNQLZRDkrP5BJ9pIpGHx3DDk75b77H51sME2rFTZ3jdyvvlWzJCXF3uh6VhrHzLZDx1I4JIw==; ab_sr=1.0.1_MjhjYjUyMzFjZmFjYjQ4YzcwOGNhYjQzYjZjMmUwYjQ2Mjk2YWZiNDRmMTEwMzg0MmE4NTg4NTVjYjRhMTA0YmM3ZDA1YmMzOGEwMzY5OTI1YTA0MmQ3MjY5ODk1MjdiMzRkZWY3ZmQ2Mjg2NGMwMTE2ZGUwODAyNjhhMWQyZTZjNWQ5M2Q4NTA4NGU3ZjJiNTgyNDdkZjU2MTI0NTcxZA==; RT="z=1&dm=baidu.com&si=5f82bd40-b312-4034-b951-7e5072f8279a&ss=m303t9i5&sl=8&tt=oqz&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=1f969"`)
req.Header.Set("Origin", "https://fanyi.baidu.com")
req.Header.Set("Referer", "https://fanyi.baidu.com/mtpe-individual/multimodal?query=bett&lang=en2zh")
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/123.0.0.0 Safari/537.36")
req.Header.Set("sec-ch-ua", `"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
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)
}
var dictResp JSONDataa
err = json.Unmarshal(bodyText, &dictResp)
if err != nil {
log.Fatal(err)
}
fmt.Println("\n下面是百度翻译所返回的结果,按照相似度来进行翻译")
for _, item := range dictResp.Data {
fmt.Println("\t单词:" + item.K)
fmt.Println("\t\t对应释义: " + item.V)
}
}