这是我参与「第三届青训营 -后端场」笔记创作活动的的第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
}
}