package service import ( "bytes" "encoding/json" "fmt" "log" "os/exec" "path/filepath" ) type XHSService struct{} // SendCodeRequest 发送验证码请求 type SendCodeRequest struct { Phone string `json:"phone" binding:"required"` CountryCode string `json:"country_code"` } // SendCodeResponse 发送验证码响应 type SendCodeResponse struct { Code int `json:"code"` Message string `json:"message"` Data map[string]interface{} `json:"data"` } // LoginRequest 登录请求 type LoginRequest struct { Phone string `json:"phone" binding:"required"` Code string `json:"code" binding:"required"` CountryCode string `json:"country_code"` } // LoginResponse 登录响应 type LoginResponse struct { Code int `json:"code"` Message string `json:"message"` Data map[string]interface{} `json:"data"` } // SendVerificationCode 调用Python脚本发送验证码 func (s *XHSService) SendVerificationCode(phone, countryCode string) (*SendCodeResponse, error) { // 如果没有传国家码,默认使用+86 if countryCode == "" { countryCode = "+86" } // 获取Python脚本路径和venv中的Python解释器 backendDir := filepath.Join("..", "backend") pythonScript := filepath.Join(backendDir, "xhs_cli.py") // 使用venv中的Python解释器 (跨平台) pythonCmd := getPythonPath(backendDir) // 执行Python脚本 cmd := exec.Command(pythonCmd, pythonScript, "send_code", phone, countryCode) // 设置工作目录为Python脚本所在目录 cmd.Dir = backendDir // 捕获输出 var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr // 执行命令 err := cmd.Run() // 打印Python脚本的日志输出(stderr) if stderr.Len() > 0 { log.Printf("[Python日志-发送验证码] %s", stderr.String()) } if err != nil { return nil, fmt.Errorf("执行Python脚本失败: %w, stderr: %s", err, stderr.String()) } // 获取UTF-8编码的输出 outputStr := stdout.String() // 解析JSON输出 var result SendCodeResponse if err := json.Unmarshal([]byte(outputStr), &result); err != nil { return nil, fmt.Errorf("解析Python输出失败: %w, output: %s", err, outputStr) } // 检查Python脚本返回的success字段 if !result.Data["success"].(bool) { return &SendCodeResponse{ Code: 1, Message: result.Data["error"].(string), }, nil } return &SendCodeResponse{ Code: 0, Message: "验证码已发送", Data: result.Data, }, nil } // VerifyLogin 调用Python脚本验证登录 func (s *XHSService) VerifyLogin(phone, code, countryCode string) (*LoginResponse, error) { // 如果没有传国家码,默认使用+86 if countryCode == "" { countryCode = "+86" } // 获取Python脚本路径和venv中的Python解释器 backendDir := filepath.Join("..", "backend") pythonScript := filepath.Join(backendDir, "xhs_cli.py") // 使用venv中的Python解释器 (跨平台) pythonCmd := getPythonPath(backendDir) // 执行Python脚本 cmd := exec.Command(pythonCmd, pythonScript, "login", phone, code, countryCode) // 设置工作目录 cmd.Dir = backendDir // 捕获输出 var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr // 执行命令 err := cmd.Run() // 打印Python脚本的日志输出(stderr) if stderr.Len() > 0 { log.Printf("[Python日志-登录] %s", stderr.String()) } if err != nil { return nil, fmt.Errorf("执行Python脚本失败: %w, stderr: %s", err, stderr.String()) } // 获取UTF-8编码的输出 outputStr := stdout.String() // 解析JSON输出 var result LoginResponse if err := json.Unmarshal([]byte(outputStr), &result); err != nil { return nil, fmt.Errorf("解析Python输出失败: %w, output: %s", err, outputStr) } // 检查Python脚本返回的success字段 if !result.Data["success"].(bool) { errorMsg := "登录失败" if errStr, ok := result.Data["error"].(string); ok { errorMsg = errStr } return &LoginResponse{ Code: 1, Message: errorMsg, }, nil } return &LoginResponse{ Code: 0, Message: "登录成功", Data: result.Data, }, nil }