From 1e7decc9669f996783444a696515e31b3220941c Mon Sep 17 00:00:00 2001 From: Yiwen-Chan Date: Sat, 17 Apr 2021 19:17:58 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E5=A2=9E=E5=8A=A0=20shindanmaker.c?= =?UTF-8?q?om=20=E7=9A=84=E6=96=B0=E7=8E=A9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++ main.go | 1 + shindan/shindan.go | 134 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 shindan/shindan.go diff --git a/README.md b/README.md index d5c1cb8d..4bb19b96 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,10 @@ - [x] 网易点歌[xxx] - [x] 酷我点歌[xxx] - [x] 酷狗点歌[xxx] +- shindan `import _ "github.com/Yiwen-Chan/ZeroBot-Plugin/shindan"` + - [x] 今天是什么少女[@xxx] + - [x] 异世界转生[@xxx] + - [x] 卖萌[@xxx] - GitHub仓库搜索 `import _ "github.com/Yiwen-Chan/ZeroBot-Plugin/github"` - [x] >github [xxx] - 在线代码运行 `import _ "github.com/Yiwen-Chan/ZeroBot-Plugin/runcode"` diff --git a/main.go b/main.go index f0f79753..929209b8 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( _ "github.com/Yiwen-Chan/ZeroBot-Plugin/manager" _ "github.com/Yiwen-Chan/ZeroBot-Plugin/music" _ "github.com/Yiwen-Chan/ZeroBot-Plugin/runcode" + _ "github.com/Yiwen-Chan/ZeroBot-Plugin/shindan" //_ "github.com/Yiwen-Chan/ZeroBot-Plugin/setutime" ) diff --git a/shindan/shindan.go b/shindan/shindan.go new file mode 100644 index 00000000..9ca499cb --- /dev/null +++ b/shindan/shindan.go @@ -0,0 +1,134 @@ +package shindan + +import ( + "bytes" + "mime/multipart" + "net/http" + "strconv" + "strings" + "time" + + xpath "github.com/antchfx/htmlquery" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/extension/rate" + "github.com/wdvxdr1123/ZeroBot/message" +) + +var limit = rate.NewManager(time.Minute*5, 5) + +func init() { + table := map[string]string{ + "异世界转生": "587874", + "卖萌": "360578", + "今天是什么少女": "162207", + } + zero.OnMessage(HasTableKey(table), GetName()).SetBlock(true).FirstPriority(). + Handle(func(ctx *zero.Ctx) { + if !limit.Load(ctx.Event.UserID).Acquire() { + ctx.Send("请稍后重试0x0...") + return + } + + type_ := ctx.State["key"].(string) + name := ctx.State["name"].(string) + + //ctx.SendChain(message.Text("少女祈祷中......")) + + text, err := shindanmaker(table[type_], name) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + } + ctx.SendChain(message.Text(text)) + }) +} + +// HasTableKey 如果 ctx.Event.RawMessage 是以 table 的 key 开头,返回真 +func HasTableKey(table map[string]string) func(ctx *zero.Ctx) bool { + return func(ctx *zero.Ctx) bool { + msg := ctx.Event.RawMessage + for key := range table { + if strings.HasPrefix(msg, key) { + temp := strings.TrimPrefix(msg, key) + if temp == "" { + return false + } + ctx.State["key"] = key + ctx.State["trim_key"] = temp + return true + } + } + return false + } +} + +// GetName 如果 rule:HasTableKey 中 ctx.State["trim_key "] 是艾特 +// 则 ctx.State["name"] 为 被艾特的人的 名片 昵称 群头衔 +// 否则 ctx.State["name"] 为 ctx.State["trim_key "] +func GetName() func(ctx *zero.Ctx) bool { + return func(ctx *zero.Ctx) bool { + name := ctx.State["trim_key"].(string) + arr := message.ParseMessageFromString(name) + for i := range arr { + if arr[i].Type == "at" { + qq, _ := strconv.ParseInt(arr[i].Data["qq"], 10, 64) + info := ctx.GetGroupMemberInfo(ctx.Event.GroupID, qq, false) + if card := info.Get("card").Str; card != "" { + name = card + break + } + if nick := info.Get("nickname").Str; nick != "" { + name = nick + break + } + if title := info.Get("title").Str; title != "" { + name = title + break + } + } + } + temp := []rune(name) + if len(temp) > 10 { + // 防止超长名字 + temp = temp[:10] + } + name = string(temp) + ctx.State["name"] = name + return true + } +} + +func shindanmaker(id, name string) (string, error) { + url := "https://shindanmaker.com/" + id + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + _ = writer.WriteField("_token", "2HgIQ1okTbr1SZ5EXDQWvFXQEBoerVRK8CSW0xro") + _ = writer.WriteField("name", name) + _ = writer.WriteField("hiddenName", "名無しのV") + _ = writer.Close() + + client := &http.Client{} + req, _ := http.NewRequest("POST", url, payload) + req.Header.Add("Cookie", "_session=8gvUXS6oVG3hZ1vBf2QlOVGquMh0UwJEuBwHIjNf; _ga=GA1.2.531883706.1618563450; _gid=GA1.2.622904960.1618563450; trc_cookie_storage=taboola%2520global%253Auser-id%3D09ef6d7e-ddb2-4a3f-ac71-b75801d11fef-tuct7602eee; dui=eyJpdiI6ImJ0MThXNTFoZ1hVOXNWZXZFeTRDdlE9PSIsInZhbHVlIjoibUF3em14ZzhXbVJsL1k5b284Tzh5QUhHa0VSYWtYZjF3KzZNRkxtRmVIMHBUbnJ1M0JwNTEzaWhWTzZTT1NGcGVxdFhGaG11Y052a3hyUUZVZDRtNFc0ZndiRnVTSHJFL1hzak43QzNhYVd6cEFEZVJxZVNNNytpNHhQbnF0TGpmbXNNdFlUNjFwNVNubnVJbkN5NHNRPT0iLCJtYWMiOiIzOTNmNmU2NmM3ZmNlMWU5OTA1ZDFlZTJlYTRiZThlZDViMzEwN2VmN2Y0NDEyZjNkYmM5ZGJhNTllMGU1ZjE3In0%3D; XSRF-TOKEN=eyJpdiI6Ikw0eTU4eFFtSytCL3VySlpuSG1UaVE9PSIsInZhbHVlIjoiL3h5WVkvSDdEaWZVdGY1M1hmalpYUDM2Y0IzSlFIL3BFTUd6MXczekFpZWlDcHVxTk5TSVF1SzhhVm53T1dYbUd5dS8vL1FjMm9yYVlGOGJReTI4c2JoV0tnNURhMHhBODBrQ1RxYkhnQ1ZsSXoxMmlUNVNrQ241cnlFKzQzWDciLCJtYWMiOiI0NDhiMzI3NzNmOGJjNmM1ZDk1ZjYwMTFmYzk4YjQ5ZDQ3OWY0MGY1YTkwNGIyY2U5YzhiMTQ1ZGQyNDhiM2NjIn0%3D; name=eyJpdiI6IjBrTVE0RFl4Nm9kTVVMb2EvYVNPQmc9PSIsInZhbHVlIjoiV3o0b1R3azhKZDZaOE1udkFrVis1L0xsdHJoZXZsKzlkRk9DR3FTQU9XalU4c0kyc3M2ckdTMjVYSjFjT0RPeSIsIm1hYyI6IjI2ZDMzZjM0YThhNzUwOGU2NGYxNGJmZTk3YjI3ZDU4YzBmMjJkMTZkMDQyOTE2NTczODA4NzA1NDQ2OTIzMGUifQ%3D%3D; dsr=eyJpdiI6IlZPQnhVM3RWVkU5VDcxd3dmRWVBU1E9PSIsInZhbHVlIjoiREFsOEZoUHozaHBxbTJDS1V2OVR3djZtNU5TQkEreW5GTHhYaWRRbG5WeENDdXJsOG9RVDNKclgyQkJpdEZnNkFqMTQwcmJSTlBoenBxZDVSanQ5TFE9PSIsIm1hYyI6ImNiNjdjOTFmYjYzOTAwMTc3MDdhNzBhMDhhMTQ0M2Q0ODM1YzIwMDJhNmQ4MWVmZTJjZDFiMmYyM2IxYTNmNjIifQ%3D%3D; __gads=ID=b597940057bf81ba:T=1618572481:S=ALNI_MasEvf_XV_9a4OWpVPI2UNR4vOswQ; XSRF-TOKEN=eyJpdiI6InQ0MkcvTGJjZVNabnI1MUV6K1Y4b1E9PSIsInZhbHVlIjoiR2hOZ0FiTDVBM1ZPYUMzbEJGRUJiWVIyNWlHN0VRUVc1NStYMjMrWmVWRHE0R1ZQSDZXMkhWTHFYU21MczRkSDJUZnBWT1hzWnl2VEVRbXhOdzdWNEErRGM0eUYyOEdIWVBrekQ4TkdLRlcwSzVKOWJtMmJSZkVUTUVNZmprNnEiLCJtYWMiOiI5ZDc3ZDEwNjQ3NTVhMTFiYTg5YTNiM2JiNTc3NjYyYWQ1MjY2ZmE0MmMwNGQyM2I4MjRmY2I2MmEzOWRlYzdkIn0%3D; name=eyJpdiI6ImFDRTNheSsra09GYnVvWVJieDRxSWc9PSIsInZhbHVlIjoicEZpdEtqMVNOZitPRS8wdlJqVVdiZGpkdkFKek5JYlNoM3E5b2wzakxJLzdPZmJBeTBkeTRQcGZtM0pFWEtqLyIsIm1hYyI6IjBiNDA0MDI1ZjU1ZDNmNDIzODE5OWFmNjZhNDA3MTU5OWY1MzI5YTI3ZTg5YzU3YWVjZDJmNGNmZmNkZWQwZDcifQ%3D%3D; _session=8gvUXS6oVG3hZ1vBf2QlOVGquMh0UwJEuBwHIjNf") + req.Header.Set("Content-Type", writer.FormDataContentType()) + resp, err := client.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + // 解析XPATH + doc, err := xpath.Parse(resp.Body) + if err != nil { + return "", err + } + // 取出每个返回的结果 + list := xpath.Find(doc, `//*[@id="shindanResult"]`) + var output = []string{} + for child := list[0].FirstChild; child != nil; child = child.NextSibling { + if text := xpath.InnerText(child); text != "" { + output = append(output, text) + } else { + output = append(output, "\n") + } + } + return strings.Join(output, ""), nil +}