前言
输入一个英语单词,返回它的发音,解释,同义词,反义词,以及例子
使用的是免费翻译网站,彩云小译
注意,彩云小译更新,博主并没有找到dict响应,但是写这个却能调用
步骤
1.打开网站。
2.打开开发者工具,网络请求找到dict
3.右击dict,复制它的curl
4.在Convert curl commands to Go将curl转为go代码
5.记得将响应内容的json转化为结构体,https://oktools.net/json2go这个网站快捷转换
6.发起请求,将格式转换为结构体,然后输出需要的内容。
7.可以将需查询的单词输入进去
详细代码
Go
package main
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
type DictRequest struct {
TransType string `json:"trans_type"` // 翻译类型,例如 "en2zh" 表示从英语到中文
Source string `json:"source"` // 源单词
UserID string `json:"user_id"` // 用户ID
}
type DictResponse struct {
Rc int `json:"rc"` // 返回码
Wiki struct {
KnownInLanguages int `json:"known_in_laguages"` // 该单词在多少种语言中可用
Description struct {
Source string `json:"source"` // 源语言描述
Target interface{} `json:"target"` // 目标语言描述
} `json:"description"` // 描述信息
ID string `json:"id"` // 词条ID
Item struct {
Source string `json:"source"` // 源单词
Target string `json:"target"` // 目标单词
} `json:"item"` // 词条项
ImageURL string `json:"image_url"` // 图像URL
IsSubject string `json:"is_subject"` // 是否为主题
Sitelink string `json:"sitelink"` // 站点链接
} `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"` // 字典信息
}
func main() {
// 使用 bufio 从标准输入读取单词
reader := bufio.NewReader(os.Stdin) // 创建一个 bufio.Reader 来读取标准输入
fmt.Print("请输入一个单词: ") // 提示用户输入一个单词
word, err := reader.ReadString('\n') // 读取用户输入的单词,直到遇到换行符
if err != nil {
log.Fatal(err) // 如果读取过程中发生错误,记录错误并退出
}
// 去除输入的换行符和多余空格
word = strings.TrimSpace(word) // 去除输入的换行符和多余空格,确保输入的单词是干净的
if word == "" {
log.Fatal("请输入有效的单词") // 如果用户没有输入任何单词,记录错误并退出
}
client := &http.Client{} // 创建一个 HTTP 客户端
request := DictRequest{TransType: "en2zh", Source: word} // 创建请求结构体,翻译类型为 en2zh,源单词为用户输入的单词
buf, err := json.Marshal(request) // 将请求结构体序列化为 JSON 格式
if err != nil {
log.Fatal(err) // 如果序列化过程中发生错误,记录错误并退出
}
var data = bytes.NewReader(buf) // 创建一个 bytes.Reader 来读取 JSON 数据
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) // 创建 HTTP POST 请求
if err != nil {
log.Fatal(err) // 如果创建请求过程中发生错误,记录错误并退出
}
// 设置请求头
req.Header.Set("Connection", "keep-alive") // 保持连接
req.Header.Set("DNT", "1") // 不跟踪
req.Header.Set("os-version", "") // 操作系统版本
req.Header.Set("sec-ch-ua-mobile", "?0") // 是否为移动设备
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36") // 用户代理
req.Header.Set("app-name", "xy") // 应用名称
req.Header.Set("Content-Type", "application/json;charset=UTF-8") // 内容类型为 JSON
req.Header.Set("Accept", "application/json, text/plain, */*") // 接受的内容类型
req.Header.Set("device-id", "") // 设备ID
req.Header.Set("os-type", "web") // 操作系统类型为 web
req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi") // 授权 token
req.Header.Set("Origin", "https://fanyi.caiyunapp.com") // 请求来源
req.Header.Set("Sec-Fetch-Site", "cross-site") // 请求站点类型
req.Header.Set("Sec-Fetch-Mode", "cors") // 请求模式为 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") // 接受语言
req.Header.Set("Cookie", "_ym_uid=16455948721020430059; _ym_d=1645694872") // Cookie 信息
resp, err := client.Do(req) // 发送 HTTP 请求
if err != nil {
log.Fatal(err) // 如果请求过程中发生错误,记录错误并退出
}
defer resp.Body.Close() // 请求完成后关闭响应体
bodyText, err := ioutil.ReadAll(resp.Body) // 读取响应体内容
if err != nil {
log.Fatal(err) // 如果读取响应体过程中发生错误,记录错误并退出
}
var dictResponse DictResponse // 创建一个 DictResponse 结构体来接收响应数据
err = json.Unmarshal(bodyText, &dictResponse) // 将 JSON 响应内容解析为 DictResponse 结构体
if err != nil {
log.Fatal(err) // 如果解析过程中发生错误,记录错误并退出
}
// 规整输出格式
fmt.Printf("字典信息:\n") // 输出字典信息的标题
fmt.Printf(" 发音:\n") // 输出发音的标题
fmt.Printf(" 美式英语: %s\n", dictResponse.Dictionary.Prons.EnUs) // 输出美式英语发音
fmt.Printf(" 英式英语: %s\n", dictResponse.Dictionary.Prons.En) // 输出英式英语发音
fmt.Printf(" 解释:\n") // 输出解释的标题
for _, explanation := range dictResponse.Dictionary.Explanations { // 循环输出每个解释
fmt.Printf(" - %s\n", explanation)
}
fmt.Printf(" 同义词:\n") // 输出同义词的标题
for _, synonym := range dictResponse.Dictionary.Synonym { // 循环输出每个同义词
fmt.Printf(" - %s\n", synonym)
}
fmt.Printf(" 反义词:\n") // 输出反义词的标题
for _, antonym := range dictResponse.Dictionary.Antonym { // 循环输出每个反义词
fmt.Printf(" - %s\n", antonym)
}
fmt.Printf(" 示例:\n") // 输出示例的标题
for _, example := range dictResponse.Dictionary.WqxExample { // 循环输出每个示例
fmt.Printf(" - %s: %s\n", example[0], example[1])
}
}