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)
}
代理是真看不懂了= = 实在没搞明白