package workers import ( "compress/gzip" "fmt" "go-bot/config" "io" "slices" "time" "github.com/PuerkitoBio/goquery" "github.com/andybalholm/brotli" "github.com/imroc/req/v3" ) func init() { plugins := config.GetConfig()["PLUGINS"].([]interface{}) if slices.Contains(plugins, "httpdog") { RegisterWorkerFactory("httpdog", func(parms []string, uid, gid, role, mid, rawMsg string) Worker { return &HttpDog{ StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg), } }) } } type HttpDog struct { *StdAns } func (a *HttpDog) GetMsg() string { if len(a.Parms) < 2 { return "您可以使用 !httpdog 状态码 进行查找,状态码支持100-599" } baseUrl := "https://http.dog/" picUrl := baseUrl + a.Parms[1] + ".jpg" // 使用 req 发起 HEAD 请求检查资源是否存在 client := req.C().SetTimeout(time.Second * 5) resp, err := client.R().Head(picUrl) if err != nil { return "请求错误: " + err.Error() } // 判断资源是否存在 if resp.StatusCode != 200 { return fmt.Sprintf("资源不存在,状态码: %d", resp.StatusCode) } respContent := "[CQ:image,file=" + picUrl + "]" docUrl := "https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/" + a.Parms[1] resp, err = client.R(). SetHeader("Host", "developer.mozilla.org"). SetHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)"). SetHeader("Accept", "*/*"). SetHeader("Content-Type", "text/plain"). Get(docUrl) if err != nil { return "请求错误: " + err.Error() } if resp != nil { defer resp.Body.Close() } if resp != nil && resp.StatusCode == 200 { // 解压缩响应体 var reader io.ReadCloser switch resp.Header.Get("Content-Encoding") { case "br": reader = io.NopCloser(brotli.NewReader(resp.Body)) case "gzip": var err error reader, err = gzip.NewReader(resp.Body) if err != nil { fmt.Println("gzip 解压错误:", err) return respContent } defer reader.Close() default: reader = resp.Body } // 使用 goquery 解析 HTML doc, err := goquery.NewDocumentFromReader(reader) if err != nil { fmt.Println("HTML 解析错误:", err) return respContent } // 查找 标签并获取 content 属性的值 description, exists := doc.Find(`meta[name="description"]`).Attr("content") if exists { // fmt.Println("Meta Description Content:", description) respContent += description } else { fmt.Println("没有找到 meta description 标签") // 将解析后的 HTML 保存到文件 // file, err := os.Create("output.html") // if err != nil { // fmt.Println("文件创建错误:", err) // return respContent // } // defer file.Close() // // 输出 HTML 内容到文件 // html, err := doc.Html() // if err != nil { // fmt.Println("获取 HTML 错误:", err) // return respContent // } // _, err = file.WriteString(html) // if err != nil { // fmt.Println("写入文件错误:", err) // return respContent // } // fmt.Println("HTML 内容已保存到 output.html 文件") } } return respContent }