GO语言工程实践课后作业
实现一个词典项目。选取这个项目实现的原因:我一直不太熟悉对网页的抓包、解析json等处理,甚至有一种望而生畏的感觉,希望能通过这次实践对此祛魅。
预期目标:实现输入单词,后台能调用网页的函数来查找含义。
1 实现步骤
1.1 选取有道翻译(有道翻译_文本、文档、网页、在线即时翻译 (youdao.com))作为需要操作的网页,找到开发人员工具。
1.2 输入一个单词,点击翻译。网页发送一个请求。在开发人员工具里面找到这个请求。此请求名称为webtranslate
因有道翻译的响应为乱码,故改用搜狗翻译(搜狗翻译 - 我的贴身智能翻译专家 (sogou.com))
输入hello,网页发送请求。名称为suggV3。
点击预览,可以看到翻译内容,字段为sugg。
点击右键,复制为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。
转换后可得到如下代码(仅展示部分):
将代码复制到自己的文件中,运行得到以下结果:
{"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的结构体。
import "encoding/json"包,然后调用Unmarshal()方法,反序列化json。
var response TranslateResponse
err = json.Unmarshal(bodyText, &response)
1.5 从上面的json可以看出,需要的内容存在Sugg[]中,遍历Sugg[]。运行结果如下:
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,结果如下:
运行成功。
2 总结
对网站进行抓包的步骤总结:
1)确定所需网站,打开开发人员工具,找到需要抓取的部分。
2)将需要抓取的部分复制为curl(bash)。
3)打开转换网站,将curl转换为需要的语言。
4)运行测试。
5)打开json转换网站,将json转换为所需语言的结构体。
6)遍历结构体中存储所需信息的变量。
7)再对代码进行修改测试,直至得到预期结果。