2024-08-17 16:31:09 +08:00
|
|
|
|
package workers
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"compress/gzip"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
2024-08-17 18:04:24 +08:00
|
|
|
|
"log"
|
2024-08-17 16:31:09 +08:00
|
|
|
|
|
|
|
|
|
"github.com/PuerkitoBio/goquery"
|
|
|
|
|
"github.com/andybalholm/brotli"
|
|
|
|
|
|
|
|
|
|
"github.com/parnurzeal/gorequest"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
RegisterWorkerFactory("httpcat", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
|
|
|
|
return &HttpCat{
|
|
|
|
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type HttpCat struct {
|
|
|
|
|
*StdAns
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (a *HttpCat) GetMsg() string {
|
|
|
|
|
if len(a.Parms) < 2 {
|
|
|
|
|
return "您可以使用 !httpcat 状态码 进行查找,状态码支持100-599"
|
|
|
|
|
}
|
|
|
|
|
baseUrl := "https://http.cat/"
|
|
|
|
|
picUrl := baseUrl + "images/" + a.Parms[1] + ".jpg"
|
|
|
|
|
// 使用 gorequest 发起 HEAD 请求检查资源是否存在
|
|
|
|
|
request := gorequest.New()
|
|
|
|
|
resp, _, errs := request.Head(picUrl).End()
|
|
|
|
|
if len(errs) > 0 {
|
|
|
|
|
return "请求错误: " + fmt.Sprint(errs)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 判断资源是否存在
|
|
|
|
|
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]
|
2024-08-17 18:04:24 +08:00
|
|
|
|
res, _, errs := request.Get(docUrl).
|
2024-08-17 16:31:09 +08:00
|
|
|
|
Set("Host", "developer.mozilla.org").
|
2024-08-17 18:04:24 +08:00
|
|
|
|
Set("User-Agent", "Apifox/1.0.0 (https://apifox.com)").
|
2024-08-17 16:31:09 +08:00
|
|
|
|
Set("Accept", "*/*").
|
2024-08-17 18:04:24 +08:00
|
|
|
|
Set("Content-Type", "text/plain").
|
2024-08-17 16:31:09 +08:00
|
|
|
|
End()
|
2024-08-17 18:04:24 +08:00
|
|
|
|
if len(errs) > 0 {
|
|
|
|
|
log.Println("请求错误: " + fmt.Sprint(errs))
|
|
|
|
|
}
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if res != nil && res.StatusCode == 200 {
|
2024-08-17 16:31:09 +08:00
|
|
|
|
// 解压缩响应体
|
|
|
|
|
var reader io.ReadCloser
|
2024-08-17 18:04:24 +08:00
|
|
|
|
switch res.Header.Get("Content-Encoding") {
|
2024-08-17 16:31:09 +08:00
|
|
|
|
case "br":
|
2024-08-17 18:04:24 +08:00
|
|
|
|
reader = io.NopCloser(brotli.NewReader(res.Body))
|
2024-08-17 16:31:09 +08:00
|
|
|
|
case "gzip":
|
|
|
|
|
var err error
|
2024-08-17 18:04:24 +08:00
|
|
|
|
reader, err = gzip.NewReader(res.Body)
|
2024-08-17 16:31:09 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("gzip 解压错误:", err)
|
|
|
|
|
return respContent
|
|
|
|
|
}
|
|
|
|
|
defer reader.Close()
|
|
|
|
|
default:
|
2024-08-17 18:04:24 +08:00
|
|
|
|
reader = res.Body
|
2024-08-17 16:31:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 使用 goquery 解析 HTML
|
|
|
|
|
doc, err := goquery.NewDocumentFromReader(reader)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("HTML 解析错误:", err)
|
|
|
|
|
return respContent
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查找 <meta name="description"> 标签并获取 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
|
|
|
|
|
|
|
|
|
|
}
|