go第二天

82 阅读3分钟

Go语言-第二天 实战

猜谜游戏

思路:生成随机数---读取用户输入---逻辑判断---实现游戏循环

生成随机数

	secretNumer := rand.Intn(maxNum) //生成0-99随机数
	fmt.Println("秘密数字是", secretNumer)
	//这个版本没有初始化随机数种子 导致每次输出结果一样



	maxNum := 100
	rand.Seed(time.Now().UnixNano()) // 设置随机数种子为当前时间的纳秒数
	secretNumer := rand.Intn(maxNum) //生成0-99随机数
	fmt.Println("秘密数字是", secretNumer)


读取用户输入

读取输入-用变量读取用户输入的数据--删除不必要换行符--把输入转换为数字

	rand.Seed(time.Now().UnixNano()) // 设置随机数种子为当前时间的纳秒数
	secretNumer := rand.Intn(maxNum) //生成0-99随机数
	fmt.Println("秘密数字是", secretNumer)

	fmt.Println("请输入你的猜想")
	reader := bufio.NewReader(os.Stdin) //用这个变量来读取用户输入的数据 然后赋值给input变量
	input, err := reader.ReadString('\n')
	if err != nil {
		fmt.Printf("输入时发生错误", err)
		return
	}
	input = strings.TrimSuffix(input, "\r\n") //去掉换行符
	//把strings.TrimSuffix函数的参数改成"\r\n",这样就可以去掉整个换行符

	guess, err := strconv.Atoi(input) //转换时发生错误
	if err != nil {
		fmt.Printf("转换时候发生了错误,再试一次")
		return
	}
	fmt.Println("你的猜想是", guess)
}

逻辑判断

if guess > secretNumer {
		fmt.Println("你猜的比秘密数字大了,再试一次")
	} else if guess < secretNumer {
		fmt.Println("小了,再试一次")
	} else {
		fmt.Println("猜中了")
	}


循环

在循环时需要把每次报错时就退出的break去掉 以免一遇到错误就退出,换成continue,错误时再来一次

爬虫

思路-抓包-发请求--解析请求

在输入的时候在想为什么要弄个新的结构体

尝试过直接用拼接字符串的方法 但是寄了 返回 sent a request that this server could not understand

var data = strings.NewReader({"trans_type":"en2zh","source": + word + })

没办法只能按照教程撸咯

首先是抓包 这个包没有加密也没有反爬 直接转代码

```
client := &http.Client{}
var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
   log.Fatal(err)
}
req.Header.Set("authority", "api.interpreter.caiyunai.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
req.Header.Set("app-name", "xy")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "fcf849b8a72182ca4650f9c07c84c20b")
req.Header.Set("origin", "https://fanyi.caiyunapp.com")
req.Header.Set("os-type", "web")
req.Header.Set("os-version", "")
req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
req.Header.Set("sec-ch-ua", `"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"`)
req.Header.Set("sec-ch-ua-mobile", "?1")
req.Header.Set("sec-ch-ua-platform", `"Android"`)
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Mobile Safari/537.36")
req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
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)
```

然后考虑怎么从外部输入单词 实现用户输入 试过用拼接字符串方式直接拼,可能自己的问题返回 sent a request that this server could not understand

发请求 请求参数封装结构体

观察发现 用于翻译的json字符串是

{"trans_type":"en2zh","source":"good"}

那就依次 创建请求的结构体 名字随意

type dict struct {
   Transtype string `json:"trans_type"`
   Source    string `json:"source"`

然后把结构体对应的序列化 转换成一个json格式的字节切片 然后再bytes.Reader类型的变量来包装它 最后传给data

client := &http.Client{}
request := dict{Transtype: "en2zh", Source: word}
buf, err := json.Marshal(request)
if err != nil {
   //log.Fatal(err)
   fmt.Println("序列化失败")
}
var data = bytes.NewReader(buf)

//用户请求的部分

接受请求参数

请求的返回 需要进行筛选 不然看的头疼 首先先根据返回生成对应的结构体

type AutoGenerated struct {
	Rc int `json:"rc"`
	Wiki struct {
	} `json:"wiki"`
	Dictionary struct {
		Prons struct {
			EnUs string `json:"en-us"`
			En string `json:"en"`
		} `json:"prons"`
		Explanations []string `json:"explanations"`
		Synonym []string `json:"synonym"`
		Antonym []string `json:"antonym"`
		WqxExample [][]string `json:"wqx_example"`
		Entry string `json:"entry"`
		Type string `json:"type"`
		Related []interface{} `json:"related"`
		Source string `json:"source"`
	} `json:"dictionary"`
}


然后将返回的数据根据结构体转换为对应的字符串

var d AutoGenerated
err = json.Unmarshal(bodyText, &d)
if err != nil {
   log.Fatal(err)
}

然后最后再根据返回查找翻译结果

fmt.Println(word, "UK", d.Dictionary.Prons.En, "US", d.Dictionary.Prons.EnUs)//输出音标
for _, item := range d.Dictionary.Explanations { //遍历循环输出所有翻译的结果
   fmt.Println(item)
}

代理是真看不懂了= = 实在没搞明白