go-bot/workers/httpcat.go

117 lines
3.1 KiB
Go
Raw Normal View History

package workers
import (
"compress/gzip"
"fmt"
"io"
"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]
resp, _, _ = request.Get(docUrl).
Set("Host", "developer.mozilla.org").
Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0").
Set("Accept", "*/*").
Set("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2").
Set("Accept-Encoding", "gzip, deflate, br, zstd").
Set("Connection", "keep-alive").
Set("Referer", docUrl).
Set("Sec-Fetch-Dest", "empty").
Set("Sec-Fetch-Mode", "no-cors").
Set("Sec-Fetch-Site", "same-origin").
End()
if 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
}
// 查找 <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
}