go-bot/workers/httpcat.go

116 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}