GO语言工程实践

134 阅读4分钟

GO语言工程实践课后作业

实现一个词典项目。选取这个项目实现的原因:我一直不太熟悉对网页的抓包、解析json等处理,甚至有一种望而生畏的感觉,希望能通过这次实践对此祛魅。

预期目标:实现输入单词,后台能调用网页的函数来查找含义。

1 实现步骤

1.1 选取有道翻译(有道翻译_文本、文档、网页、在线即时翻译 (youdao.com))作为需要操作的网页,找到开发人员工具。

1.2 输入一个单词,点击翻译。网页发送一个请求。在开发人员工具里面找到这个请求。此请求名称为webtranslate

image-20230827121414059

因有道翻译的响应为乱码,故改用搜狗翻译(搜狗翻译 - 我的贴身智能翻译专家 (sogou.com)

输入hello,网页发送请求。名称为suggV3。

image-20230827121909524

点击预览,可以看到翻译内容,字段为sugg。

image-20230827121953697

点击右键,复制为cURL,可以得到:

curl "https://fanyi.sogou.com/reventondc/suggV3" ^
  -H "Accept: application/json" ^
  -H "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6" ^
  -H "Connection: keep-alive" ^
  -H "Content-Type: application/x-www-form-urlencoded" ^
  -H "Cookie: SMYUV=1637487712942034; SUV=1637487712931721; ssuid=8936153556; SUID=44B0AC3B6555A00A000000006359026A; ABTEST=0^|1693109818^|v17; SNUID=C1E1EA23565155898E1F715757BDA4E1; wuid=1693109818309; FQV=3317036ffa4a19bd8eba808cc51a49ee; translate.sess=bc0e2a18-8d35-4a01-bb5a-8a8b24b2dcfe; SGINPUT_UPSCREEN=1693109821906" ^
  -H "Origin: https://fanyi.sogou.com" ^
  -H "Referer: https://fanyi.sogou.com/text" ^
  -H "Sec-Fetch-Dest: empty" ^
  -H "Sec-Fetch-Mode: cors" ^
  -H "Sec-Fetch-Site: same-origin" ^
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.54" ^
  -H "sec-ch-ua: ^^"Chromium^^";v=^^"116^^", ^^"Not)A;Brand^^";v=^^"24^^", ^^"Microsoft Edge^^";v=^^"116^^"" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H "sec-ch-ua-platform: ^^"Windows^^"" ^
  --data-raw "from=auto&to=zh-CHS&client=web&text=hello&uuid=c1224b50-99e8-4265-8d83-74cad087122f&pid=sogou-dict-vr&addSugg=on" ^
  --compressed

1.3 打开网站Convert curl commands to Go (curlconverter.com),将复制到的curl转换为所需的代码。

此时网站报错:Error: command should begin with "curl" but instead begins with "-H"

解决方案,复制为curl时选择bash而不是cmd。

转换后可得到如下代码(仅展示部分):

image-20230827123141430

将代码复制到自己的文件中,运行得到以下结果:

{"zly":"zly","message":"success","code":0,"uuid":"c1224b50-99e8-4265-8d83-74cad087122f","sugg":[{"k":"hello","v":"excl.哈罗;喂;嘿"},{"k":"hellos","v":"n.“喂”的打招呼声;打招呼;(hello的复数)"},{"k":"hello, stranger!","v":"嘿,稀客!"},{"k":"hello kitty","v":"凯蒂猫"}],"direction":"en#zh-CHS"}

1.4 为方便查看,将json反序列化。

打开网站JSON转Golang Struct - 在线工具 - OKTools,可将json直接转换为go的结构体。

image-20230827134122535

import "encoding/json"包,然后调用Unmarshal()方法,反序列化json。

var response TranslateResponse
err = json.Unmarshal(bodyText, &response)

1.5 从上面的json可以看出,需要的内容存在Sugg[]中,遍历Sugg[]。运行结果如下:

image-20230827134946124

1.6 对程序进行升级,使得不止可以翻译hello,还可以翻译终端输入的单词。

改变程序如下部分:

//读取输入单词
    fmt.Println("please input:")
    reader := bufio.NewReader(os.Stdin)
​
    for {
        input, err := reader.ReadString('\n') //读取一行if err != nil {
            fmt.Println("error:", err)
            return
        }
​
        input = strings.TrimSuffix(input, "\n") //去掉换行符
        input = strings.TrimSuffix(input, "\r") //去掉回车
        string := `from=auto&to=zh-CHS&client=web&text=` + input + `&uuid=c1224b50-99e8-4265-8d83-74cad087122f&pid=sogou-dict-vr&addSugg=on`
        var data = strings.NewReader(string)

终端运行命令行go run dict.go,输入nice,结果如下:

image-20230827135910692

运行成功。

2 总结

对网站进行抓包的步骤总结:

1)确定所需网站,打开开发人员工具,找到需要抓取的部分。

2)将需要抓取的部分复制为curl(bash)。

3)打开转换网站,将curl转换为需要的语言。

4)运行测试。

5)打开json转换网站,将json转换为所需语言的结构体。

6)遍历结构体中存储所需信息的变量。

7)再对代码进行修改测试,直至得到预期结果。