Go语言实现火山翻译在线词典 | 青训营

113 阅读5分钟

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

特点:

  • 高性能、高并发
  • 语法简单、学习曲线平缓
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

下载安装:

go.dev/

studygolang.com/dl

goproxy.cn/

环境变量配置:此电脑->属性->高级系统设置->环境变量

系统环境变量

GOROOTGo的安装文件路径eg:D:\Go
GOPATHGo的工作环境路径eg:E:\go-workspace

Path中加入:%GOROOT%\bin

win + r,输入cmd进入命令终端,go env 查看配置信息

解决go包无法下载问题:

go env -w GOPROXY=https://goproxy.cn,direct

go工作目录配置建议如图:

go使用火山云翻译实现在线简单词典

抓包

打开火山翻译首页translate.volcengine.com/,按F12打开以下页面。

代码生成curlconverter.com/go/

解析response bodyoktools.net/json2go

完整代码如下:

package main
​
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "os"
)
​
type DictRequest struct {
    Source         string   `json:"source"`
    Words          []string `json:"words"`
    SourceLanguage string   `json:"source_language"`
    TargetLanguage string   `json:"target_language"`
}
​
​
type DictResponse struct {
    Details []struct {
        Detail string `json:"detail"`
        Extra string `json:"extra"`
    } `json:"details"`
    BaseResp struct {
        StatusCode int `json:"status_code"`
        StatusMessage string `json:"status_message"`
    } `json:"base_resp"`
}
​
​
type DictResponseData struct {
    Result []struct {
        Ec struct {
            ReturnPhrase []string `json:"returnPhrase"`
            Synonyms []struct {
                Pos string `json:"pos"`
                Words []string `json:"words"`
                Trans string `json:"trans"`
            } `json:"synonyms"`
            Etymology struct {
                ZhCHS []struct {
                    Description string `json:"description"`
                    Detail string `json:"detail"`
                    Source string `json:"source"`
                } `json:"zh-CHS"`
            } `json:"etymology"`
            SentenceSample []struct {
                Sentence string `json:"sentence"`
                SentenceBold string `json:"sentenceBold"`
                Translation string `json:"translation"`
                Source string `json:"source"`
            } `json:"sentenceSample"`
            WebDict string `json:"webDict"`
            Web []struct {
                Phrase string `json:"phrase"`
                Meanings []string `json:"meanings"`
            } `json:"web"`
            MTerminalDict string `json:"mTerminalDict"`
            RelWord struct {
                Word string `json:"word"`
                Stem string `json:"stem"`
                Rels []struct {
                    Rel struct {
                        Pos string `json:"pos"`
                        Words []struct {
                            Word string `json:"word"`
                            Tran string `json:"tran"`
                        } `json:"words"`
                    } `json:"rel"`
                } `json:"rels"`
            } `json:"relWord"`
            Dict string `json:"dict"`
            Basic struct {
                UsPhonetic string `json:"usPhonetic"`
                UsSpeech string `json:"usSpeech"`
                Phonetic string `json:"phonetic"`
                UkSpeech string `json:"ukSpeech"`
                ExamType []string `json:"examType"`
                Explains []struct {
                    Pos string `json:"pos"`
                    Trans string `json:"trans"`
                } `json:"explains"`
                UkPhonetic string `json:"ukPhonetic"`
                WordFormats []struct {
                    Name string `json:"name"`
                    Value string `json:"value"`
                } `json:"wordFormats"`
            } `json:"basic"`
            Phrases []struct {
                Phrase string `json:"phrase"`
                Meanings []string `json:"meanings"`
            } `json:"phrases"`
            Lang string `json:"lang"`
            IsWord bool `json:"isWord"`
        } `json:"ec"`
    } `json:"result"`
}
​
func query(word string) {
    client := &http.Client{}
    request := DictRequest{Source: "youdao", Words: []string{word}, SourceLanguage: "en", TargetLanguage: "zh"}
    buf, err := json.Marshal(request)
    if err != nil {
        log.Fatal(err)
    }
​
    var data = bytes.NewReader(buf)
    req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/detail/v1/?msToken=&X-Bogus=DFSzswVLQDaZVIDktx7DBl9WX7nO&_signature=_02B4Z6wo00001L.7d5QAAIDAP.mN1gUfR-C.-3MAAEsXeuwCHy8aLlGJDPMXPl7ghj9UERhzp5yvR2W.kXtn1GUPJQFo2gCh7j66KNu6XT3J2dsVTbKzk182qbknXaMl-M4KoWyOALE3-Jvlad", data)
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Set("authority", "translate.volcengine.com")
    req.Header.Set("accept", "application/json, text/plain, */*")
    req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en-US;q=0.8,en-CN;q=0.7,en;q=0.6")
    req.Header.Set("content-type", "application/json")
    req.Header.Set("cookie", "x-jupiter-uuid=169319391604024; i18next=zh-CN; s_v_web_id=verify_llubxvj8_p1NoLbyP_3WPB_41iK_8iaF_9EDbCm9LQ6o4; ttcid=d44d010ccecc4a1bb1ee2cbd7c5b94aa18; tt_scid=YH3nzGmQuWhdiKi3qTdqr1wGT3rOr4AH7RUtb7WCMvWwEwiHgV7461G4WZjkLr4sb157")
    req.Header.Set("origin", "https://translate.volcengine.com")
    req.Header.Set("referer", "https://translate.volcengine.com/?category=&home_language=zh&source_language=detect&target_language=zh&text=good")
    req.Header.Set("sec-ch-ua", `"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"`)
    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", "same-origin")
    req.Header.Set("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")
    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)
    }
​
    if resp.StatusCode != 200 {
        log.Fatal("bad StatusCode: ", resp.StatusCode, "body", string(bodyText))
    }
​
    var dictResponse DictResponse
    err = json.Unmarshal(bodyText, &dictResponse)
    if err != nil {
        log.Fatal(err)
    }
​
    var item = dictResponse.Details[0]
    jsonStr := item.Detail;
​
    var dictData DictResponseData
​
    err = json.Unmarshal([]byte(jsonStr), &dictData)
​
    if err != nil {
        log.Fatal(err)
    }
    for _, content := range dictData.Result[0].Ec.Basic.Explains {
        fmt.Println(content.Pos, content.Trans)
    }
    
}
​
func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, `usage: simpleDict WORD example: simpleDict hello`)
        os.Exit(1)
    }
    word := os.Args[1]
    query(word)
}

SOCKS5代理

SOCKS是一种网络传输协议,名字取自SOCKetS[注 1],主要用于客户端与外网服务器之间通讯的中间传递。

当防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。

这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。

根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。SOCKS协定不提供加密。

SOCKS工作在比HTTP代理更低的层次:SOCKS使用握手协议来通知代理软件其客户端试图进行的SOCKS连接,然后尽可能透明地进行操作,而常规代理可能会解释和重写报头(例如,使用另一种底层协议,例如FTP;然而,HTTP代理只是将HTTP请求转发到所需的HTTP服务器)。虽然HTTP代理有不同的使用模式,HTTP CONNECT方法允许转发TCP连接;然而,SOCKS代理还可以转发UDP流量(仅SOCKS5),而HTTP代理不能。HTTP代理通常更了解HTTP协议,执行更高层次的过滤(虽然通常只用于GET和POST方法,而不用于CONNECT方法)。

Socks5代理可以用于多种用途,包括:

  • 绕过防火墙和地理限制:通过连接到位于其他地区的Socks5代理服务器,用户可以访问被地理限制的内容,或是绕过网络防火墙的限制。
  • 隐私保护:Socks5代理可以隐藏用户的真实IP地址,增强个人隐私和匿名性。这对于需要保护个人信息的用户来说是有用的。
  • 访问受限网站:有些网站可能在特定地区被封锁,通过连接到Socks5代理,用户可以访问这些受限制的网站。
  • 网络爬虫和数据采集:研究人员和开发者可以使用Socks5代理来采集互联网上的数据,同时减少被目标网站封锁的风险。
VERNMETHODSMETHODS
111-255
  • VER是SOCKS版本,0x05

  • NMETHODS是METHODS部分的长度

  • METHODS是客户端支持的认证方式列表,每个方法占1字节。

    • 0x00不需要验证
    • 0x01GSSAPI
    • 0x02用户名、密码认证
    • 0x03-0x07由IANA分配