diff --git a/README.md b/README.md index 0b87f58f..c5243821 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,11 @@ zerobot -h -t token -u url [-d|w] [-g 监听地址:端口] qq1 qq2 qq3 ... - [x] 讲个笑话[@xxx]|讲个笑话[qq号] - **抽象话** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_chouxianghua"` - [x] 抽象翻译[xxx] +- **绝绝子** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_juejuezi"` + - [x] 喝奶茶绝绝子|绝绝子吃饭 +- **藏头诗** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_cangtoushi"` + - [x] 藏头诗[xxx] + - [x] 藏尾诗[xxx] - **TODO...** ## 使用方法 diff --git a/main.go b/main.go index aa5ca9b3..74671181 100644 --- a/main.go +++ b/main.go @@ -31,12 +31,14 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin-Gif" // 制图 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_ai_false" // 服务器监控 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_book_review" // 哀伤雪刃吧推书记录 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin_cangtoushi" // 藏头诗 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_choose" // 选择困难症帮手 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_chouxianghua" // 说抽象话 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_coser" // 三次元小姐姐 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_fortune" // 运势 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_funny" // 笑话 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_hs" // 炉石 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin_juejuezi" // 绝绝子生成器 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_minecraft" // MCSManager _ "github.com/FloatTech/ZeroBot-Plugin/plugin_moyu" // 摸鱼 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_music" // 点歌 diff --git a/plugin_cangtoushi/cangtoushi.go b/plugin_cangtoushi/cangtoushi.go new file mode 100644 index 00000000..0ad782d5 --- /dev/null +++ b/plugin_cangtoushi/cangtoushi.go @@ -0,0 +1,124 @@ +package cangtoushi + +import ( + "fmt" + "io" + "net/http" + "net/http/cookiejar" + "net/url" + "strings" + "time" + + "github.com/FloatTech/ZeroBot-Plugin/control" + "github.com/antchfx/htmlquery" + log "github.com/sirupsen/logrus" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/extension/rate" + "github.com/wdvxdr1123/ZeroBot/message" + "github.com/wdvxdr1123/ZeroBot/utils/helper" +) + +const ( + loginURL = "https://www.shicimingju.com/cangtoushi/" + searchURL = "https://www.shicimingju.com/cangtoushi/index.html" + ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" + referer = "https://www.shicimingju.com/cangtoushi/index.html" + prio = 20 +) + +var ( + gCurCookieJar *cookiejar.Jar + engine = control.Register("cangtoushi", &control.Options{ + DisableOnDefault: false, + Help: "藏头诗\n" + + "- 藏头诗[xxx]\n- 藏尾诗[xxx]", + }) + limit = rate.NewManager(time.Minute, 20) + csrf string +) + +func init() { + engine.OnRegex("藏头诗([\u4E00-\u9FA5]{3,10})").SetBlock(true).SetPriority(prio).Handle(func(ctx *zero.Ctx) { + kw := ctx.State["regex_matched"].([]string)[1] + login() + data, err := search(kw, "7", "0") + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + text := dealHTML(helper.BytesToString(data)) + ctx.SendChain(message.Text(text)) + }) + + engine.OnRegex("藏尾诗([\u4E00-\u9FA5]{3,10})").SetBlock(true).SetPriority(prio).Handle(func(ctx *zero.Ctx) { + kw := ctx.State["regex_matched"].([]string)[1] + login() + data, err := search(kw, "7", "2") + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + text := dealHTML(helper.BytesToString(data)) + ctx.SendChain(message.Text(text)) + }) +} + +func login() { + gCurCookieJar, _ = cookiejar.New(nil) + client := &http.Client{ + Jar: gCurCookieJar, + } + request, err := http.NewRequest("GET", loginURL, nil) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + request.Header.Add("User-Agent", ua) + response, err := client.Do(request) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + data, err := io.ReadAll(response.Body) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + response.Body.Close() + doc, err := htmlquery.Parse(strings.NewReader(helper.BytesToString(data))) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + csrf = htmlquery.SelectAttr(htmlquery.FindOne(doc, "//input[@name='_csrf']"), "value") +} + +func search(kw, zishu, position string) (data []byte, err error) { + postStr := fmt.Sprintf("_csrf=%s&kw=%s&zishu=%s&position=%s", url.QueryEscape(csrf), url.QueryEscape(kw), zishu, position) + log.Println("postStr:", postStr) + client := &http.Client{ + Jar: gCurCookieJar, + } + request, err := http.NewRequest("POST", searchURL, strings.NewReader(postStr)) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + request.Header.Add("Referer", referer) + request.Header.Add("User-Agent", ua) + request.Header.Add("Content-Type", "application/x-www-form-urlencoded") + response, err := client.Do(request) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + data, err = io.ReadAll(response.Body) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + response.Body.Close() + return +} + +func dealHTML(data string) (text string) { + doc, err := htmlquery.Parse(strings.NewReader(data)) + if err != nil { + log.Errorln("[cangtoushi]:", err) + } + text = htmlquery.InnerText(htmlquery.FindOne(doc, "//div[@class='card']/div[@class='card']")) + text = strings.ReplaceAll(text, " ", "") + text = strings.Replace(text, "\n", "", 1) + return text +} diff --git a/plugin_chouxianghua/chouxianghua.go b/plugin_chouxianghua/chouxianghua.go index 07bdcf7a..4da594b0 100644 --- a/plugin_chouxianghua/chouxianghua.go +++ b/plugin_chouxianghua/chouxianghua.go @@ -13,7 +13,7 @@ func init() { control.Register("chouxianghua", &control.Options{ DisableOnDefault: false, Help: "抽象话\n- 抽象翻译xxx\n", - }).OnRegex("^抽象翻译([\u4E00-\u9FA5A-Za-z0-9]+)$").SetBlock(true).SetPriority(prio). + }).OnRegex("^抽象翻译((\\s|[\\r\\n]|[\u4E00-\u9FA5A-Za-z0-9“”,;、。《》=?\\x22])+)$").SetBlock(true).SetPriority(prio). Handle(func(ctx *zero.Ctx) { r := cx(ctx.State["regex_matched"].([]string)[1]) ctx.SendChain(message.Text(r)) diff --git a/plugin_funny/laugh.go b/plugin_funny/laugh.go index 729d9749..51eb8d7b 100644 --- a/plugin_funny/laugh.go +++ b/plugin_funny/laugh.go @@ -14,7 +14,7 @@ import ( ) var ( - engine = control.Register("curse", &control.Options{ + engine = control.Register("funny", &control.Options{ DisableOnDefault: false, Help: "讲个笑话\n" + "- 讲个笑话[@xxx]|讲个笑话[qq号]\n", @@ -32,9 +32,15 @@ func init() { name := ctx.State["args"].(string) if len(ctx.Event.Message) > 1 && ctx.Event.Message[1].Type == "at" { qq, _ := strconv.ParseInt(ctx.Event.Message[1].Data["qq"], 10, 64) - name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, qq, false).Get("nickname").Str + name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, qq, false).Get("card").String() + if name == "" { + name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, qq, false).Get("nickname").String() + } } else if name == "" { - name = ctx.Event.Sender.NickName + name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, ctx.Event.UserID, false).Get("card").String() + if name == "" { + name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, ctx.Event.UserID, false).Get("nickname").String() + } } var j joke err := db.Pick("jokes", &j) diff --git a/plugin_juejuezi/jiejiezi.go b/plugin_juejuezi/jiejiezi.go new file mode 100644 index 00000000..9797b3bb --- /dev/null +++ b/plugin_juejuezi/jiejiezi.go @@ -0,0 +1,77 @@ +package juejuezi + +import ( + "fmt" + log "github.com/sirupsen/logrus" + "io" + "net/http" + "strings" + "time" + + "github.com/FloatTech/ZeroBot-Plugin/control" + "github.com/tidwall/gjson" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/extension/rate" + "github.com/wdvxdr1123/ZeroBot/message" + "github.com/wdvxdr1123/ZeroBot/utils/helper" +) + +const ( + juejueziURL = "https://www.offjuan.com/api/juejuezi/text" + prio = 15 + referer = "https://juejuezi.offjuan.com/" + ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" +) + +var ( + engine = control.Register("juejuezi", &control.Options{ + DisableOnDefault: false, + Help: "绝绝子生成器\n" + + "- 喝奶茶绝绝子|绝绝子吃饭", + }) + limit = rate.NewManager(time.Minute, 20) +) + +func init() { + engine.OnRegex("[\u4E00-\u9FA5]{0,10}绝绝子[\u4E00-\u9FA5]{0,10}").SetBlock(true).SetPriority(prio).Handle(func(ctx *zero.Ctx) { + if !limit.Load(ctx.Event.GroupID).Acquire() { + return + } + toDealStr := []rune(strings.ReplaceAll(ctx.ExtractPlainText(), "绝绝子", "")) + if len(toDealStr) < 2 { + ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("不要只输入绝绝子")) + } else if len(toDealStr) == 2 { + data, err := juejuezi(string(toDealStr[0]), string(toDealStr[1])) + if err != nil { + ctx.SendChain(message.Text(err)) + } + ctx.SendChain(message.Text(gjson.Get(helper.BytesToString(data), "text").String())) + } else { + params := ctx.GetWordSlices(string(toDealStr)).Get("slices").Array() + data, err := juejuezi(params[0].String(), params[1].String()) + if err != nil { + ctx.SendChain(message.Text(err)) + } + ctx.SendChain(message.Text(gjson.Get(helper.BytesToString(data), "text").String())) + } + }) +} + +func juejuezi(verb, noun string) (data []byte, err error) { + juejueziStr := fmt.Sprintf("{\"verb\":\"%s\",\"noun\":\"%s\"}", verb, noun) + client := &http.Client{} + // 提交请求 + request, err := http.NewRequest("POST", juejueziURL, strings.NewReader(juejueziStr)) + if err != nil { + log.Errorln("[juejuezi]:", err) + } + request.Header.Add("Referer", referer) + request.Header.Add("User-Agent", ua) + response, err := client.Do(request) + if err != nil { + log.Errorln("[juejuezi]:", err) + } + data, err = io.ReadAll(response.Body) + response.Body.Close() + return +} diff --git a/plugin_manager/manager.go b/plugin_manager/manager.go index e48e6526..6dd16221 100644 --- a/plugin_manager/manager.go +++ b/plugin_manager/manager.go @@ -423,7 +423,10 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { if ctx.Event.NoticeType == "group_decrease" { userid := ctx.Event.UserID - nickname := ctx.GetStrangerInfo(userid, false).Get("nickname").String() + nickname := ctx.GetGroupMemberInfo(ctx.Event.GroupID, userid, false).Get("card").String() + if nickname == "" { + nickname = ctx.GetGroupMemberInfo(ctx.Event.GroupID, userid, false).Get("nickname").String() + } ctx.SendChain(message.Text(nickname, "(", userid, ")", "离开了我们...")) } }) diff --git a/utils/web/http.go b/utils/web/http.go index 23c5c21c..a3a50217 100644 --- a/utils/web/http.go +++ b/utils/web/http.go @@ -11,14 +11,14 @@ import ( func ReqWith(url string, method string, referer string, ua string) (data []byte, err error) { client := &http.Client{} // 提交请求 - var reqest *http.Request - reqest, err = http.NewRequest(method, url, nil) + var request *http.Request + request, err = http.NewRequest(method, url, nil) if err == nil { // 增加header选项 - reqest.Header.Add("Referer", referer) - reqest.Header.Add("User-Agent", ua) + request.Header.Add("Referer", referer) + request.Header.Add("User-Agent", ua) var response *http.Response - response, err = client.Do(reqest) + response, err = client.Do(request) if err == nil { data, err = io.ReadAll(response.Body) response.Body.Close()