// Package translator 提供文本翻译功能 package translator import ( "errors" "fmt" "io" "net/http" "net/url" "regexp" "strings" "time" "golang.org/x/net/html" "golang.org/x/text/language" ) // YoudaoTranslator 有道翻译器结构体 type YoudaoTranslator struct { httpClient *http.Client // HTTP客户端 Timeout time.Duration // 请求超时时间 } // 常量定义 const ( youdaoDefaultTimeout = 30 * time.Second youdaoTranslateURL = "https://m.youdao.com/translate" ) // 错误定义 var ( ErrYoudaoNetworkError = errors.New("youdao translator network error") ErrYoudaoParseError = errors.New("youdao translator parse error") ) // NewYoudaoTranslator 创建一个新的有道翻译器实例 func NewYoudaoTranslator() *YoudaoTranslator { translator := &YoudaoTranslator{ Timeout: youdaoDefaultTimeout, httpClient: &http.Client{Timeout: youdaoDefaultTimeout}, } return translator } // SetTimeout 设置请求超时时间 func (t *YoudaoTranslator) SetTimeout(timeout time.Duration) { t.Timeout = timeout t.httpClient.Timeout = timeout } // Translate 使用标准语言标签进行文本翻译 func (t *YoudaoTranslator) Translate(text string, from language.Tag, to language.Tag) (string, error) { // 有道翻译不需要指定源语言和目标语言,它会自动检测 return t.translate(text) } // TranslateWithParams 使用简单字符串参数进行文本翻译 func (t *YoudaoTranslator) TranslateWithParams(text string, params TranslationParams) (string, error) { // 有道翻译不需要指定源语言和目标语言,它会自动检测 return t.translate(text) } // translate 执行实际翻译操作 func (t *YoudaoTranslator) translate(text string) (string, error) { // 构建表单数据 form := url.Values{} form.Add("inputtext", text) form.Add("type", "AUTO") // 创建请求 req, err := http.NewRequest("POST", youdaoTranslateURL, strings.NewReader(form.Encode())) if err != nil { return "", fmt.Errorf("failed to create request: %w", err) } // 设置请求头 req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36") req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") // 发送请求 resp, err := t.httpClient.Do(req) if err != nil { return "", fmt.Errorf("%w: %v", ErrYoudaoNetworkError, err) } defer resp.Body.Close() // 判断请求是否成功 if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("API error: status code %d", resp.StatusCode) } // 读取响应体 body, err := io.ReadAll(resp.Body) if err != nil { return "", fmt.Errorf("failed to read response: %w", err) } // 解析HTML响应 result, err := t.extractTranslationResult(string(body)) if err != nil { return "", err } return result, nil } // extractTranslationResult 从HTML响应中提取翻译结果 func (t *YoudaoTranslator) extractTranslationResult(htmlContent string) (string, error) { // 方法1:使用正则表达式提取翻译结果 pattern := regexp.MustCompile(`