第二视频练习(抓取搜狗翻译)| 青训营笔记

107 阅读3分钟

第二视频练习(抓取搜狗翻译)| 青训营笔记

搜狗翻译 - 我的贴身智能翻译专家 (sogou.com)

data所需要的数据不是json,而是 URL 编码的字符串。

可以使用 Go 的 net/url 包来将结构体转换为 URL 编码的字符串。

DictRequest 结构体转换为 URL 编码的方法

可以使用 Go 的 net/url 包来将结构体转换为 URL 编码的字符串。

以下是将 DictRequest 结构体转换为 URL 编码的字符串的示例代码:

package main
​
import (
    "fmt"
    "net/url"
)
​
type DictRequest struct {
    From    string `json:"from"`
    To      string `json:"to"`
    Client  string `json:"client"`
    Text    string `json:"text"`
    UUID    string `json:"uuid"`
    PID     string `json:"pid"`
    AddSugg string `json:"addSugg"`
}
​
func main() {
    a := DictRequest{
        From:    "auto",
        To:      "zh-CHS",
        Client:  "web",
        Text:    "hello",
        UUID:    "fdb4d454-cc47-465a-b018-9db29f85ab9b",
        PID:     "sogou-dict-vr",
        AddSugg: "on",
    }
///看这里
    v := url.Values{} //使用 `url.Values` 创建一个空的 URL 值对象
    v.Set("from", a.From) //并使用 `Set` 方法设置每个字段的值
    v.Set("to", a.To)
    v.Set("client", a.Client)
    v.Set("text", a.Text)
    v.Set("uuid", a.UUID)
    v.Set("pid", a.PID)
    v.Set("addSugg", a.AddSugg)//
​
    queryString := v.Encode() //使用 `Encode` 方法将 URL 值对象编码为 URL 编码的字符串。
    fmt.Println(queryString)
    ////
}

结果将输出:from=auto&to=zh-CHS&client=web&text=hello&uuid=fdb4d454-cc47-465a-b018-9db29f85ab9b&pid=sogou-dict-vr&addSugg=on

在这个示例中,我们使用 url.Values 创建一个空的 URL 值对象,并使用 Set 方法设置每个字段的值。然后,使用 Encode 方法将 URL 值对象编码为 URL 编码的字符串。

package main
​
import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
    "strings"
)
​
type DictRequest struct {
    From    string `json:"from"`
    To      string `json:"to"`
    Client  string `json:"client"`
    Text    string `json:"text"`
    UUID    string `json:"uuid"`
    PID     string `json:"pid"`
    AddSugg string `json:"addSugg"`
}
//这个是json的主体部分
type AutoGenerated struct {
    Zly string `json:"zly"`
    Message string `json:"message"`
    Code int `json:"code"`
    UUID string `json:"uuid"`
    Sugg []Sugg `json:"sugg"`
    Direction string `json:"direction"`
}
type Sugg struct {
    K string `json:"k"`
    V string `json:"v"`
}
//获取到post数据
func main() {
    var word string
    fmt.Println("请输入要查询的单词")
    fmt.Scanf("%s",&word)
    client := &http.Client{}
    a := DictRequest{
        From:    "auto",
        To:      "zh-CHS",
        Client:  "web",
        Text:    word,
        UUID:    "fdb4d454-cc47-465a-b018-9db29f85ab9b",
        PID:     "sogou-dict-vr",
        AddSugg: "on",
    }
​
    v := url.Values{}
    v.Set("from", a.From)
    v.Set("to", a.To)
    v.Set("client", a.Client)
    v.Set("text", a.Text)
    v.Set("uuid", a.UUID)
    v.Set("pid", a.PID)
    v.Set("addSugg", a.AddSugg)
​
    queryString := v.Encode()
    //fmt.Println(queryString)
    var data = strings.NewReader(queryString)
    //var data = strings.NewReader(`from=auto&to=zh-CHS&client=web&text=hello&uuid=fdb4d454-cc47-465a-b018-9db29f85ab9b&pid=sogou-dict-vr&addSugg=on`) 
    req, err := http.NewRequest("POST", "https://fanyi.sogou.com/reventondc/suggV3", data)
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Set("Accept", "application/json")
    req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,en-GB;q=0.6")
    req.Header.Set("Cache-Control", "no-cache")
    req.Header.Set("Connection", "keep-alive")
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Cookie", "ssuid=940679152; SUID=D23AE7781F49910A00000000639ACC7E; cuid=AAH+mBAFRgAAAAqHS07gkAEANgg=; SUV=1689238283241317; LSTMV=86%2C532; LCLKINT=2153763; ABTEST=2|1690344667|v17; SNUID=D34E49EEE0D9E1BCE9AAE3C8E095DBD4; wuid=1690344667584; FQV=0a1d247370350cf6558d48a98fde7304; translate.sess=5d078bf7-880c-402d-a644-29c6861bbe18; SGINPUT_UPSCREEN=1690344669163")
    req.Header.Set("Origin", "https://fanyi.sogou.com")
    req.Header.Set("Pragma", "no-cache")
    req.Header.Set("Referer", "https://fanyi.sogou.com/text")
    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/115.0.0.0 Safari/537.36 Edg/115.0.1901.183")
    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"`)
    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)
    var shuju AutoGenerated  //respond结构体
    err = json.Unmarshal(bodyText,&shuju)
    if err != nil {
        fmt.Println("转换失败")
    }
    //打印翻译
    for _,name := range shuju.Sugg{
        fmt.Println(name)
    }
}