diff --git a/go.mod b/go.mod index 7491df34..ca75303a 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,7 @@ module github.com/FloatTech/ZeroBot-Plugin go 1.16 require ( - github.com/FloatTech/AnimeAPI v0.0.0-20210713044920-63367fe18ccd - github.com/FloatTech/ZeroBot-ACGImage v1.5.5 + github.com/FloatTech/AnimeAPI v1.1.1 github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.2 github.com/StackExchange/wmi v1.2.1 // indirect github.com/golang/protobuf v1.5.2 diff --git a/go.sum b/go.sum index eb9a8334..954791b0 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,9 @@ -github.com/FloatTech/AnimeAPI v0.0.0-20210713044920-63367fe18ccd h1:rvV66DIEqNJMEKwYXDJvw6kpJuGg+Pz/BooewuTBjXs= -github.com/FloatTech/AnimeAPI v0.0.0-20210713044920-63367fe18ccd/go.mod h1:GYrQD70HvBzry1XiZ1tHFNOsOqRkR+ao4XGYZqV4I9c= -github.com/FloatTech/ZeroBot-ACGImage v1.5.5 h1:cmAsXHl99RHJR38vQXL+q/U0BGWg5LyMHxBw5Mf8f1o= -github.com/FloatTech/ZeroBot-ACGImage v1.5.5/go.mod h1:TDGCgGHKjgcnA0akLaEwUcFwL+/ya7p6PZITdJQ1vnQ= -github.com/FloatTech/ZeroBot-Plugin-Timer v1.3.4 h1:nRJqY/S7TRlN32MQGIBH3UWfVrpjxpJXCnp42pd2O2Q= -github.com/FloatTech/ZeroBot-Plugin-Timer v1.3.4/go.mod h1:NuODdnVhf9AClsJBdYFqnL9sQE7VIRZyZos37J286n0= -github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.1 h1:LVSTyfLlhcJEES16r3gyhN2jd2WJUlQiN193f0DdJ7Q= -github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.1/go.mod h1:NuODdnVhf9AClsJBdYFqnL9sQE7VIRZyZos37J286n0= +github.com/FloatTech/AnimeAPI v1.1.0 h1:X6UMkl6eC8NHHeInt40x0AHb8a3GiQSmE1HigyTG/Qg= +github.com/FloatTech/AnimeAPI v1.1.0/go.mod h1:CC+vF30UGBlcIUxwFOcXIEHoJ4r7c5x2iLQsnUCVdDI= +github.com/FloatTech/AnimeAPI v1.1.1 h1:SPyrVlqRVQHfYOm9x8eGBJWlT+3gj1wtFsbH1bCgkXs= +github.com/FloatTech/AnimeAPI v1.1.1/go.mod h1:CC+vF30UGBlcIUxwFOcXIEHoJ4r7c5x2iLQsnUCVdDI= github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.2 h1:w/JerL8DwdyoxZYB4HRMaHANRV2j+r5XxaQhVB0sjBw= github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.2/go.mod h1:MVOQQ4e6AVGFm993blXXU4Sd6bAsLY2+Zb+/HMrEeEc= -github.com/FloatTech/Zerobot-ACGImage-Classify v1.3.3 h1:mMaBe23yg8mk5U0yb9OS9iX/9hju6Dj+Z+Fty18vIhU= -github.com/FloatTech/Zerobot-ACGImage-Classify v1.3.3/go.mod h1:swPvVKyXu1YFWZ7Kt6R79LgIa16hs4cE1E5LroBB2SQ= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M= @@ -24,8 +18,6 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -44,8 +36,6 @@ github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMW github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -93,27 +83,23 @@ github.com/tklauser/numcpus v0.2.3 h1:nQ0QYpiritP6ViFhrKYsiv6VVxOpum2Gks5GhnJbS/ github.com/tklauser/numcpus v0.2.3/go.mod h1:vpEPS/JC+oZGGQ/My/vJnNsvMDQL6PwOqt8dsCw5j+E= github.com/wdvxdr1123/ZeroBot v1.2.2 h1:BKEy3l80BMrQWpFWaII0AfFMyf9bqrB0TxfWhTdoV58= github.com/wdvxdr1123/ZeroBot v1.2.2/go.mod h1:83nHtG8V5TAxPwH/LCDxLpZk4khIgs29dkr5TBWf7fc= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -139,9 +125,7 @@ golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -150,7 +134,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/main.go b/main.go index 1855ce86..c4ea31b5 100644 --- a/main.go +++ b/main.go @@ -27,7 +27,7 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin_diana" // 嘉心糖发病 // 二次元图片 - _ "github.com/FloatTech/ZeroBot-ACGImage" // 随机图片与AI点评 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin_acgimage" // 随机图片与AI点评 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_image_finder" // 关键字搜图 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_lolicon" // lolicon 随机图片 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_saucenao" // 以图搜图 diff --git a/plugin_acgimage/classify.go b/plugin_acgimage/classify.go new file mode 100644 index 00000000..a3f722b8 --- /dev/null +++ b/plugin_acgimage/classify.go @@ -0,0 +1,118 @@ +package acgimage + +import ( + "net/url" + "strconv" + "strings" + + "github.com/FloatTech/AnimeAPI/classify" + "github.com/FloatTech/AnimeAPI/picture" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +var ( + lolipxy = "http://sayuri.fumiama.top:62002/dice?class=0&loli=true&r18=true" + // r18有一定保护,一般不会发出图片 + randapi = "&loli=true&r18=true" + msgof = make(map[int64]int64) + datapath = "data/acgimage/" + cachefile = datapath + "cache" + cacheuri = "file:///" + cachefile +) + +func init() { // 插件主体 + zero.OnRegex(`^设置随机图片网址(.*)$`, zero.SuperUserPermission).SetBlock(true).SetPriority(20). + Handle(func(ctx *zero.Ctx) { + url := ctx.State["regex_matched"].([]string)[1] + if !strings.HasPrefix(url, "http") { + ctx.Send("URL非法!") + } else { + randapi = url + } + }) + // 有保护的随机图片 + zero.OnFullMatch("随机图片").SetBlock(true).SetPriority(24). + Handle(func(ctx *zero.Ctx) { + if ctx.Event.GroupID > 0 { + if classify.CanVisit(5) { + go func() { + class, lastvisit, dhash, comment := classify.Classify(randapi, false) + replyClass(ctx, dhash, class, false, lastvisit, comment) + }() + } else { + ctx.Send("你太快啦!") + } + } + }) + // 直接随机图片,无r18保护,后果自负。如果出r18图可尽快通过发送"太涩了"撤回 + zero.OnFullMatch("直接随机", zero.AdminPermission).SetBlock(true).SetPriority(24). + Handle(func(ctx *zero.Ctx) { + if ctx.Event.GroupID > 0 { + if classify.CanVisit(5) { + ctx.Send("请稍后再试哦") + } else if randapi != "" { + var url string + if randapi[0] == '&' { + url = lolipxy + } else { + url = randapi + } + setLastMsg(ctx.Event.GroupID, ctx.Send(message.Image(url).Add("cache", "0"))) + } + } + }) + // 撤回最后的直接随机图片 + zero.OnFullMatch("太涩了").SetBlock(true).SetPriority(24). + Handle(func(ctx *zero.Ctx) { + go cancel(ctx) + }) + // 上传一张图进行评价 + zero.OnKeywordGroup([]string{"评价图片"}, picture.CmdMatch(), picture.MustGiven()).SetBlock(true).SetPriority(24). + Handle(func(ctx *zero.Ctx) { + if ctx.Event.GroupID > 0 { + ctx.Send("少女祈祷中...") + for _, url := range ctx.State["image_url"].([]string) { + go func(target string) { + class, lastvisit, dhash, comment := classify.Classify(target, true) + replyClass(ctx, dhash, class, true, lastvisit, comment) + }(url) + } + } + }) +} + +func setLastMsg(id int64, msg int64) { + msgof[id] = msg +} + +func cancel(ctx *zero.Ctx) { + msg, ok := msgof[ctx.Event.GroupID] + if ok { + ctx.DeleteMessage(msg) + delete(msgof, ctx.Event.GroupID) + } +} + +func replyClass(ctx *zero.Ctx, dhash string, class int, noimg bool, lv int64, comment string) { + img := message.Image(cacheuri + strconv.FormatInt(lv, 10)) + if class > 5 { + if dhash != "" && !noimg { + b14, err3 := url.QueryUnescape(dhash) + if err3 == nil { + ctx.Send(comment + "\n给你点提示哦:" + b14) + ctx.Event.GroupID = 0 + ctx.Send(img) + } + } else { + ctx.Send(comment) + } + } else { + comment := message.Text(comment) + if !noimg { + ctx.SendChain(img, comment) + } else { + ctx.SendChain(message.Reply(ctx.Event.MessageID), comment) + } + } +} diff --git a/plugin_saucenao/searcher.go b/plugin_saucenao/searcher.go index 847ceb5a..99e66a7b 100644 --- a/plugin_saucenao/searcher.go +++ b/plugin_saucenao/searcher.go @@ -5,12 +5,12 @@ import ( "fmt" "strconv" "strings" - "time" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/message" "github.com/FloatTech/AnimeAPI/ascii2d" + "github.com/FloatTech/AnimeAPI/picture" "github.com/FloatTech/AnimeAPI/pixiv" "github.com/FloatTech/AnimeAPI/saucenao" ) @@ -44,49 +44,8 @@ func init() { // 插件主体 ) }) // 以图搜图 - zero.OnKeywordGroup([]string{"以图搜图", "搜索图片", "以图识图"}).SetBlock(true).FirstPriority(). + zero.OnKeywordGroup([]string{"以图搜图", "搜索图片", "以图识图"}, picture.CmdMatch(), picture.MustGiven()).SetBlock(true).FirstPriority(). Handle(func(ctx *zero.Ctx) { - // 匹配命令 - for _, elem := range ctx.Event.Message { - if elem.Type == "text" { - text := strings.ReplaceAll(elem.Data["text"], " ", "") - if text != ctx.State["keyword"].(string) { - return - } - } - } - // 匹配图片 - rule := func() zero.Rule { - return func(ctx *zero.Ctx) bool { - var urls = []string{} - for _, elem := range ctx.Event.Message { - if elem.Type == "image" { - urls = append(urls, elem.Data["url"]) - } - } - if len(urls) > 0 { - ctx.State["image_url"] = urls - return true - } - return false - } - } - // 索取图片 - if !rule()(ctx) { - ctx.SendChain(message.Text("请发送一张图片")) - next := zero.NewFutureEvent("message", 999, false, zero.CheckUser(ctx.Event.UserID), rule()) - recv, cancel := next.Repeat() - select { - case <-time.After(time.Second * 120): - return - case e := <-recv: - cancel() - newCtx := &zero.Ctx{Event: e, State: zero.State{}} - if rule()(newCtx) { - ctx.State["image_url"] = newCtx.State["image_url"] - } - } - } // 开始搜索图片 ctx.Send("少女祈祷中......") for _, pic := range ctx.State["image_url"].([]string) {