Go实现翻译功能|青训营笔记

134 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

Go实现翻译系统

1.本功能实现了抓取翻译 分别是彩云,360翻译,搜狗翻译

2.经过多次实验发现360最简单,返回的结果只有翻译,而且是路径传参,但发现了360翻译的bug,他用的是彩云做的代理,所以每次都比彩云慢也很正常

3.搜狗翻译结果是最全的,它的请求发送时有个uuid,怀疑是防刷吧。

package main

import (
   "bufio"
   "bytes"
   "encoding/json"
   "fmt"
   "io/ioutil"
   "log"
   "math/rand"
   "net/http"
   "os"
   "strconv"
   "sync"
   "time"
)

/**
翻译软件
 */
func main(){
   fmt.Println("请输入要查询的单词!")
   reader := bufio.NewReader(os.Stdin)
   input, _, err := reader.ReadLine()
   if err != nil{
      fmt.Println("输入有误,请重新输入!")
   }
   wg := sync.WaitGroup{}
   wg.Add(3)
   go func() {
      CyTranslateServer(string(input))
      wg.Done()
   }()
   go func() {
      A360TranslateServer(string(input))
      wg.Done()
   }()
   go func() {
      SougouTranslateServer(string(input))
      wg.Done()
   }()
   wg.Wait()
   fmt.Println("服务结束!")

}

/**
搜狗翻译请求
 */

func SougouTranslateServer(str string)  {
   client := &http.Client{}
   //`{"from":"auto","to":"zh-CHS","text":"good","client":"pc","fr":"browser_pc","needQc":1,
   //"s":"8dcdbc5f48b9b9f85a43f0307e471252","uuid":"677fee33-dddd-42dd-a323-1e9de67b709b",
   //"exchange":false}`
   reqStruct:=SougouRequestStruct{
      From: "auto",
      To: "zh-CHS",
      Text: str,
      Client: "pc",
      Fr: "browser_pc",
      NeedQc: 1,
      S: "8dcdbc5f48b9b9f85a43f0307e471252",
      Uuid: "677fee33-dddd-42dd-a323-1e9de67b700b",
      Exchange: false,
   }
   marshal, err := json.Marshal(reqStruct)
   if(err != nil){
      log.Fatal("请求解析失败!")
   }
   data := bytes.NewReader(marshal)
   req, err := http.NewRequest("POST", "https://fanyi.sogou.com/api/transpc/text/result", data)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("Connection", "keep-alive")
   req.Header.Set("sec-ch-ua", `"Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"`)
   req.Header.Set("Accept", "application/json, text/plain, */*")
   req.Header.Set("Content-Type", "application/json;charset=UTF-8")
   req.Header.Set("sec-ch-ua-mobile", "?0")
   req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36")
   req.Header.Set("sec-ch-ua-platform", `"Windows"`)
   req.Header.Set("Origin", "https://fanyi.sogou.com")
   req.Header.Set("Sec-Fetch-Site", "same-origin")
   req.Header.Set("Sec-Fetch-Mode", "cors")
   req.Header.Set("Sec-Fetch-Dest", "empty")
   req.Header.Set("Referer", "https://fanyi.sogou.com/text?keyword=&transfrom=auto&transto=zh-CHS&model=general")
   req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
   req.Header.Set("Cookie", "ABTEST=0|1652086670|v17; SNUID=B32EC95A2B2EF4BA4C0B8DA22B86DC0F; IPLOC=CN2102; SUID=9805E3718586A20A000000006278D78E; wuid=1652086670467; FUV=327833cfb9e5100142e302a31e873159; translate.sess=09047b42-575c-4a55-905a-1bcebcd3e8f3; SUV=1652086622652; SGINPUT_UPSCREEN=1652086622675")
   resp, err := client.Do(req)
   if err != nil {
      log.Fatal(err)
   }
   defer resp.Body.Close()
   bodyText, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      log.Fatal(err)
   }
   if resp.StatusCode!=http.StatusOK{
      log.Fatal("请求出错!")
   }
   var respData SogouTranslateResponse
   err = json.Unmarshal(bodyText, &respData)
   if err !=nil {
      fmt.Println("请求数据解析失败!")
   }
   fmt.Println()
   fmt.Println(respData.Data.Translate)
   fmt.Println(respData.Data.CET4.Word)
   fmt.Println(respData.Data.CET6.WordFamily)
   fmt.Println("搜狗翻译提供服务")
}

/**
360 翻译请求

 */

func A360TranslateServer(str string)  {
   //360的翻译是路径传参
   client := &http.Client{}
   url:="https://fanyi.so.com/index/search?eng=1&validate=&ignore_trans=0&query="
   url+=str
   req, err := http.NewRequest("POST", url, nil)
   if err != nil {
      log.Fatal(err)
      return
   }
   req.Header.Set("authority", "fanyi.so.com")
   req.Header.Set("content-length", "0")
   req.Header.Set("sec-ch-ua", `"Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"`)
   req.Header.Set("accept", "application/json, text/plain, */*")
   req.Header.Set("sec-ch-ua-mobile", "?0")
   req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36")
   req.Header.Set("pro", "fanyi")
   req.Header.Set("sec-ch-ua-platform", `"Windows"`)
   req.Header.Set("origin", "https://fanyi.so.com")
   req.Header.Set("sec-fetch-site", "same-origin")
   req.Header.Set("sec-fetch-mode", "cors")
   req.Header.Set("sec-fetch-dest", "empty")
   req.Header.Set("referer", "https://fanyi.so.com/")
   req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
   req.Header.Set("cookie", "QiHooGUID=F4175786235432CD9DC4AE3A2DFF7105.1641361262148; Q_UDID=8fe1ed02-21c8-1741-7a6f-66016983722c; __guid=144965027.4584270621567012000.1652084552450.3076; count=1; __huid=113sbMjF5gFw%2F22tQzwHFKSz5%2FotybmbfbUc3cBaQKmi0%3D; gtHuid=1")
   resp, err := client.Do(req)
   if err != nil {
      log.Fatal(err)
      return
   }
   defer resp.Body.Close()
   bodyText, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      log.Fatal(err)
      return
   }
   if resp.StatusCode!=http.StatusOK{
      log.Fatal("请求错误!")
      return
   }
   var translated A360TranslateResponse
   err = json.Unmarshal(bodyText, &translated)
   if err != nil{
      log.Fatal("json 解析出错")
      return
   }
   fmt.Println()
   fmt.Println(translated.Data.Fanyi)
   fmt.Printf("360翻译提供服务")
}

/**
彩云翻译请求
 */

func CyTranslateServer(str string){
   request:= DictRequest{TransType: "en2zh",Source: str}
   marshal, err := json.Marshal(request)
   if err != nil {
      fmt.Println(err)
   }
   client := &http.Client{}
   var data = bytes.NewReader(marshal)
   req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
   if err != nil {
      log.Fatal(err)
   }
   req.Header.Set("Connection", "keep-alive")
   req.Header.Set("sec-ch-ua", `"Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"`)
   req.Header.Set("sec-ch-ua-mobile", "?0")
   req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36")
   req.Header.Set("app-name", "xy")
   req.Header.Set("Content-Type", "application/json;charset=UTF-8")
   req.Header.Set("Accept", "application/json, text/plain, */*")
   req.Header.Set("os-type", "web")
   req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
   req.Header.Set("sec-ch-ua-platform", `"Windows"`)
   req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
   req.Header.Set("Sec-Fetch-Site", "cross-site")
   req.Header.Set("Sec-Fetch-Mode", "cors")
   req.Header.Set("Sec-Fetch-Dest", "empty")
   req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
   req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
   resp, err := client.Do(req)
   if err != nil {
      log.Fatal(err)
   }
   bodyText, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      log.Fatal(err)
   }
   if resp.StatusCode != http.StatusOK{
      log.Fatal("出错了!")
   }
   defer resp.Body.Close()
   var res1 CYTranslateResponse
   err = json.Unmarshal(bodyText, &res1)
   if err!=nil {
      log.Fatal("解析出错了")
   }
   fmt.Println()
   fmt.Println("英式: ",res1.Dictionary.Prons.En,"美式: ",res1.Dictionary.Prons.EnUs)
   fmt.Println("翻译: ",res1.Dictionary.Explanations)
   fmt.Println("同义词: ",res1.Dictionary.Synonym)
   fmt.Println("彩云翻译提供服务")
}

/**
第一个小游戏 猜数字
*/
func guessNum()  {
   var maxNum int
   maxNum=100
   rand.Seed(time.Now().UnixNano())
   guessNum := rand.Intn(maxNum)
   fmt.Println("please guss a number value range of 0-100!")
   reader := bufio.NewReader(os.Stdin)
   for  {

      readString, _, errForRead := reader.ReadLine()
      if errForRead == nil {
         myGuessNum, errForParse := strconv.Atoi(string(readString))
         if errForParse == nil{
            if solve(myGuessNum, guessNum){
               break
            }
         }
      }
   }
   defer func() {
      fmt.Println("开始回收垃圾了")
   }()
   fmt.Println("运行结束!")
}

func solve(guess int,ans int)  bool{
   if guess>ans{
      fmt.Println("猜的数字太大了!")
      return false
   }else if guess<ans{
      fmt.Println("猜的数字太小了!")
      return false
   }else{
      fmt.Println("恭喜猜对了,游戏结束!")
      return true
   }
}