diff --git a/go.mod b/go.mod index 04d87f3..295c383 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,6 @@ require ( github.com/glebarez/sqlite v1.11.0 github.com/go-resty/resty/v2 v2.16.5 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/gorilla/websocket v1.5.3 github.com/guohuiyuan/go-fyzhq v0.0.0-20220807135412-25c16c843e5a github.com/mmcdole/gofeed v1.3.0 github.com/patrickmn/go-cache v2.1.0+incompatible @@ -28,7 +27,6 @@ require ( github.com/wdvxdr1123/ZeroBot v1.8.2-0.20250330133859-27c25d9412b5 golang.org/x/sys v0.30.0 gorm.io/gorm v1.26.1 - jaytaylor.com/html2text v0.0.0-20230321000545-74c2419ad056 ) require ( @@ -55,17 +53,13 @@ require ( github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mmcdole/goxpp v1.1.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mozillazg/go-pinyin v0.20.0 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/vcaesar/cedar v0.20.2 // indirect diff --git a/go.sum b/go.sum index 91e181f..de35917 100644 --- a/go.sum +++ b/go.sum @@ -76,8 +76,6 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/guohuiyuan/go-fyzhq v0.0.0-20220807135412-25c16c843e5a h1:sSbq6g6ofG33GfKtQXRjC+Z7YIjJJhkJXzPT4LXwROM= github.com/guohuiyuan/go-fyzhq v0.0.0-20220807135412-25c16c843e5a/go.mod h1:AfOiF6dEJ10INSyuLQIFJr+l//v510xaXxaXbuq2f/k= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -88,9 +86,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mmcdole/gofeed v1.3.0 h1:5yn+HeqlcvjMeAI4gu6T+crm7d0anY85+M+v6fIFNG4= github.com/mmcdole/gofeed v1.3.0/go.mod h1:9TGv2LcJhdXePDzxiuMnukhV2/zb6VtnZt1mS+SjkLE= @@ -105,8 +100,6 @@ github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+ github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= @@ -117,12 +110,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= -github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -229,8 +218,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw= gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= -jaytaylor.com/html2text v0.0.0-20230321000545-74c2419ad056 h1:6YFJoB+0fUH6X3xU/G2tQqCYg+PkGtnZ5nMR5rpw72g= -jaytaylor.com/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:OxvTsCwKosqQ1q7B+8FwXqg4rKZ/UG9dUW+g/VL2xH4= modernc.org/cc/v4 v4.21.2 h1:dycHFB/jDc3IyacKipCNSDrjIC0Lm1hyoWOZTRR20Lk= modernc.org/ccgo/v4 v4.17.8 h1:yyWBf2ipA0Y9GGz/MmCmi3EFpKgeS7ICrAFes+suEbs= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= diff --git a/main.go b/main.go index 1ab59d3..4c0cca8 100644 --- a/main.go +++ b/main.go @@ -19,18 +19,15 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin-Playground/example/JiangRed" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/example/xiaoguofan" - _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/asoularticle" + _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/anotherfortune" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/chatgpt" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/chinesebqb" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/cybercat" - _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/deepdanbooru" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/draw" // 服务详情 _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/fadian" - _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/feifeilv" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/fgopickup" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/fyzhq" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/games" - _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/grasspicture" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/klala" // 星穹铁道面板/图鉴插件 _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/kokomi" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/moegozh" @@ -46,8 +43,6 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/subweibo" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/tgyj" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/vote" - _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/vtbwife" // 抽vtbwife - _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/wantquotes" _ "github.com/FloatTech/ZeroBot-Plugin-Playground/plugin/youdaotranslate" // 程序主体 diff --git a/plugin/anotherfortune/main.go b/plugin/anotherfortune/main.go index a02e3f5..23ae893 100644 --- a/plugin/anotherfortune/main.go +++ b/plugin/anotherfortune/main.go @@ -18,7 +18,6 @@ import ( "github.com/tidwall/gjson" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/message" - "github.com/wdvxdr1123/ZeroBot/utils/helper" ) type card struct { @@ -46,11 +45,11 @@ var ( ) func init() { - engine := control.Register("AnotherFortune", &ctrl.Options[*zero.Ctx]{ + engine := control.Register("anotherfortune", &ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, Brief: "另一个今日人品", Help: "仿照鱼子酱的今日人品w", - PrivateDataFolder: "AnotherFortune", + PrivateDataFolder: "anotherfortune", }) signTF = make(map[string](int)) egg = make(map[string](int)) @@ -74,10 +73,6 @@ func init() { Handle(func(ctx *zero.Ctx) { var mutex sync.RWMutex // 添加读写锁以保证稳定性 mutex.Lock() - yiyan, err := web.GetData("http://ovooa.com/API/yiyan/api.php") - if err != nil { - return - } // 获取一言 p := rand.Intn(2) i := rand.Intn(78) card := cardMap[(strconv.Itoa(i))] @@ -134,8 +129,6 @@ func init() { message.Text(fmt.Sprintf("\n%s\n"+botName+"正在帮你整理~\n", uptime)), message.Text("今日的人品值为", result[user]), message.Text(jrrpbk), - message.Text("\n今日一言:\n"), - message.Text(helper.BytesToString(yiyan), "\n"), message.Text("今日塔罗牌是: \n归类于", cardtype, reasons[rand.Intn(len(reasons))], position[p], " 的 ", name, "\n"), message.Text("\n其意义为:\n", info, "\n", vme50)) } else { diff --git a/plugin/asoularticle/asoularticle.go b/plugin/asoularticle/asoularticle.go deleted file mode 100644 index f335f4b..0000000 --- a/plugin/asoularticle/asoularticle.go +++ /dev/null @@ -1,57 +0,0 @@ -// Package asoularticle asoul.icu小作文 -package asoularticle - -import ( - "fmt" - "net/url" - - "github.com/FloatTech/floatbox/web" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - "github.com/tidwall/gjson" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" - "jaytaylor.com/html2text" -) - -func init() { // 插件主体 - engine := control.Register("asoularticle", &ctrl.Options[*zero.Ctx]{ - DisableOnDefault: false, - Brief: "小作文", - Help: "- 小作文\n" + - "更新小作文", - PrivateDataFolder: "asoularticle", - }) - go func() { - adb = initialize(engine.DataFolder() + "asoularticle.db") - }() - engine.OnFullMatch(`小作文`).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - a, err := adb.randomArticle() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - u := fmt.Sprintf(detailURL, url.QueryEscape(a.Title)) - data, err := web.RequestDataWith(web.NewDefaultClient(), u, "GET", u, web.RandUA(), nil) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - tex, err := html2text.FromString(gjson.ParseBytes(data).Get("htmlContent").String(), html2text.Options{PrettyTables: true}) - if err != nil { - panic(err) - } - ctx.SendChain(message.Text(tex)) - }) - engine.OnFullMatch(`更新小作文`, zero.SuperUserPermission).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - ctx.SendChain(message.Text("少女祈祷中...")) - err := adb.truncateAndInsert() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.Text("asoul.icu小作文更新完毕")) - }) -} diff --git a/plugin/asoularticle/model.go b/plugin/asoularticle/model.go deleted file mode 100644 index d159141..0000000 --- a/plugin/asoularticle/model.go +++ /dev/null @@ -1,170 +0,0 @@ -package asoularticle - -import ( - "encoding/json" - "fmt" - "math" - "math/rand" - "os" - "strings" - - "github.com/FloatTech/floatbox/web" - "github.com/glebarez/sqlite" - "github.com/sirupsen/logrus" - "gorm.io/gorm" -) - -const ( - articlesURL = "https://asoul.icu/v/articles?pageNum=%v&pageSize=48" - detailURL = "https://asoul.icu/v/articles/%v" -) - -type articleReply struct { - Articles []Articles `json:"articles"` -} - -// adb 小作文数据库全局变量 -var adb *articledb - -// articledb 小作文数据库 -type articledb gorm.DB - -// initialize 初始化 -func initialize(dbpath string) *articledb { - var err error - if _, err = os.Stat(dbpath); err != nil || os.IsNotExist(err) { - // 生成文件 - f, err := os.Create(dbpath) - if err != nil { - return nil - } - defer f.Close() - } - db, err := gorm.Open(sqlite.Open(dbpath), &gorm.Config{}) - if err != nil { - panic(err) - } - adb := (*articledb)(db) - err = db.AutoMigrate(&Article{}) - if err != nil { - panic(err) - } - var count int64 - err = db.Model(&Article{}).Count(&count).Error - if err != nil { - panic(err) - } - if count == 0 { - err = adb.truncateAndInsert() - if err != nil { - panic(err) - } - } - err = db.Model(&Article{}).Count(&count).Error - if err != nil { - panic(err) - } - logrus.Infoln("[asoularticle]加载", count, "条小作文") - return (*articledb)(db) -} - -// Article 小作文数据 -type Article struct { - ID int `gorm:"primary_key;AUTO_INCREMENT"` - Title string `gorm:"column:title"` - Author string `gorm:"column:author"` - Brief string `gorm:"column:brief"` - CreateTime int64 `gorm:"column:create_time"` - Tags string `gorm:"column:tags"` -} - -// Articles 小作文数据 -type Articles struct { - ID int `json:"id"` - Title string `json:"title"` - Author string `json:"author"` - Brief string `json:"brief"` - CreateTime int64 `json:"createTime"` - Tags []string `json:"tags"` -} - -// TableName 表名 -func (Article) TableName() string { - return "article" -} - -func (adb *articledb) truncateAndInsert() (err error) { - db := (*gorm.DB)(adb) - var ( - data []byte - r articleReply - pageNum = 1 - ) - err = db.Exec("drop table article").Error - if err != nil { - return - } - err = db.AutoMigrate(&Article{}) - if err != nil { - return - } - data, err = web.GetData(fmt.Sprintf(articlesURL, pageNum)) - if err != nil { - return - } - err = json.Unmarshal(data, &r) - if err != nil { - return - } - alist := make([]Article, 0, 100) - for len(r.Articles) > 0 { - for _, v := range r.Articles { - alist = append(alist, Article{ - ID: v.ID, - Title: v.Title, - Author: v.Author, - Brief: v.Brief, - CreateTime: v.CreateTime, - Tags: strings.Join(v.Tags, "|"), - }) - } - pageNum++ - data, err = web.GetData(fmt.Sprintf(articlesURL, pageNum)) - if err != nil { - return - } - err = json.Unmarshal(data, &r) - if err != nil { - return - } - } - partition := Partition(alist, 100) - for _, v := range partition { - err = db.Create(&v).Error - if err != nil { - return - } - } - return -} - -func (adb *articledb) randomArticle() (a Article, err error) { - db := (*gorm.DB)(adb) - var count int64 - err = db.Model(&Article{}).Count(&count).Offset(rand.Intn(int(count))).Take(&a).Error - return -} - -// Partition 分组函数 -func Partition[T any](list []T, size int) (plist [][]T) { - plen := int(math.Ceil(float64(len(list)) / float64(size))) - plist = make([][]T, plen) - for i := 0; i < plen; i++ { - if i == plen-1 { - plist[i] = list[i*size:] - break - } - plist[i] = list[i*size : (i+1)*size] - } - return -} diff --git a/plugin/deepdanbooru/deepdanbooru.go b/plugin/deepdanbooru/deepdanbooru.go deleted file mode 100644 index 266e0fc..0000000 --- a/plugin/deepdanbooru/deepdanbooru.go +++ /dev/null @@ -1,173 +0,0 @@ -// Package deepdanbooru 二次元标签分析 -package deepdanbooru - -import ( - "bytes" - "context" - "crypto/md5" - "encoding/base64" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "image" - "strings" - "time" - - hf "github.com/FloatTech/AnimeAPI/huggingface" - "github.com/FloatTech/floatbox/binary" - "github.com/FloatTech/floatbox/file" - "github.com/FloatTech/floatbox/web" - "github.com/FloatTech/gg" - "github.com/FloatTech/imgfactory" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - "github.com/FloatTech/zbputils/ctxext" - "github.com/FloatTech/zbputils/img/text" - "github.com/gorilla/websocket" - "github.com/tidwall/gjson" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -const ( - magicpromptURL = "wss://hysts-deepdanbooru.hf.space/queue/join" -) - -func init() { // 插件主体 - engine := control.Register("deepdanbooru", &ctrl.Options[*zero.Ctx]{ - DisableOnDefault: false, - Brief: "二次元标签分析", - Help: "- 鉴赏图片 [xxx]", - PrivateDataFolder: "deepdanbooru", - }) - - cachefolder := engine.DataFolder() - // 开启 - engine.OnKeywordGroup([]string{"鉴赏图片"}, zero.MustProvidePicture).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - ctx.SendChain(message.Text("少女祈祷中...")) - for _, url := range ctx.State["image_url"].([]string) { - t, tseq, err := handleImage(url) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - } - digest := md5.Sum(binary.StringToBytes(url)) - f := cachefolder + hex.EncodeToString(digest[:]) - if file.IsNotExist(f) { - _ = imgfactory.SavePNG2Path(f, t) - } - m := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Image("file:///"+file.BOTPATH+"/"+f)), - ctxext.FakeSenderForwardNode(ctx, message.Text("tags: ", strings.Join(tseq, ",")))} - if id := ctx.Send(m).ID(); id == 0 { - ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待")) - } - } - }) -} - -func handleImage(url string) (im image.Image, tseq []string, err error) { - _ctx, _cancel := context.WithTimeout(context.Background(), hf.TimeoutMax*time.Second) - defer _cancel() - var ( - data []byte - img image.Image - ) - c, _, err := websocket.DefaultDialer.Dial(magicpromptURL, nil) - if err != nil { - return - } - defer c.Close() - - imageData, err := web.GetData(url) - if err != nil { - return - } - r := hf.PushRequest{ - FnIndex: 0, - SessionHash: "zerobot", - } - b, err := json.Marshal(r) - if err != nil { - return - } - - encodeStr := "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(imageData) - r1 := hf.PushRequest{ - FnIndex: 0, - Data: []interface{}{encodeStr, 0.5}, - SessionHash: "zerobot", - } - b1, err := json.Marshal(r1) - if err != nil { - return - } - t := time.NewTicker(time.Second * 1) - defer t.Stop() - for { - select { - case <-t.C: - _, data, err = c.ReadMessage() - if err != nil { - return - } - j := gjson.ParseBytes(data) - switch j.Get("msg").String() { - case "send_hash": - err = c.WriteMessage(websocket.TextMessage, b) - if err != nil { - return - } - case "send_data": - err = c.WriteMessage(websocket.TextMessage, b1) - if err != nil { - return - } - case hf.WssCompleteStatus: - arr := j.Get("output.data.0.confidences").Array() - - img, _, err = image.Decode(bytes.NewReader(imageData)) - if err != nil { - return - } - - img = imgfactory.Limit(img, 1280, 720) - - canvas := gg.NewContext(img.Bounds().Size().X, img.Bounds().Size().Y+int(float64(img.Bounds().Size().X)*0.2)+len(arr)*img.Bounds().Size().X/25) - canvas.SetRGB(1, 1, 1) - canvas.Clear() - canvas.DrawImage(img, 0, 0) - if err = canvas.LoadFontFace(text.BoldFontFile, float64(img.Bounds().Size().X)*0.1); err != nil { - return - } - canvas.SetRGB(0, 0, 0) - canvas.DrawString("", float64(img.Bounds().Size().X)*0.02, float64(img.Bounds().Size().Y)+float64(img.Bounds().Size().X)*0.1) - if err = canvas.LoadFontFace(text.ConsolasFontFile, float64(img.Bounds().Size().X)*0.04); err != nil { - return - } - - longestlen := 0 - for _, v := range arr { - if len(v.Get("label").String()) > longestlen { - longestlen = len(v.Get("label").String()) - } - tseq = append(tseq, v.Get("label").String()) - } - longestlen++ - - i := float64(img.Bounds().Size().Y) + float64(img.Bounds().Size().X)*0.2 - rate := float64(img.Bounds().Size().X) * 0.04 - for _, v := range arr { - canvas.DrawString(fmt.Sprintf("* %-*s -%.3f-", longestlen, v.Get("label").String(), v.Get("confidence").Float()), float64(img.Bounds().Size().X)*0.04, i) - i += rate - } - im = canvas.Image() - return - } - - case <-_ctx.Done(): - err = errors.New("ERROR: 吟唱提示指令超时") - return - } - } -} diff --git a/plugin/feifeilv/feifeilv.go b/plugin/feifeilv/feifeilv.go deleted file mode 100644 index 010b6d2..0000000 --- a/plugin/feifeilv/feifeilv.go +++ /dev/null @@ -1,333 +0,0 @@ -// Package feifeilv 可能媒用 -package feifeilv - -import ( - "bytes" - "crypto/md5" - "encoding/json" - "errors" - "fmt" - "math/rand" - "os" - "strconv" - "strings" - "time" - - "github.com/FloatTech/floatbox/binary" - "github.com/FloatTech/floatbox/web" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - "github.com/FloatTech/zbputils/ctxext" - "github.com/FloatTech/zbputils/img/text" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -const ( - version = "10000" - sample = 1 - act = "getMsg" - textType = "text" - feifeiURL = "https://m.feifeilv.top" - configURL = feifeiURL + "/api/config/get" - libraryURL = feifeiURL + "/api/library/get" - msgURL = feifeiURL + "/api/msg/get" - randomIndex = "/pagesImp/random/index" -) - -// CommonRequest 常规请求 -type CommonRequest struct { - Version string `json:"version"` - Time string `json:"time"` -} - -// ConfigResponse 常用响应 -type ConfigResponse struct { - Code int `json:"code"` - Msg string `json:"msg"` - Data ConfigData `json:"data"` -} - -// ToolList 工具箱 -type ToolList struct { - CreateTime int64 `json:"createTime"` - State int `json:"state"` - Hot int `json:"hot"` - ID string `json:"_id"` - Name string `json:"name"` - Href string `json:"href"` - Keywords string `json:"keywords"` - Type string `json:"type"` - Headimg string `json:"headimg"` - Theme string `json:"theme,omitempty"` -} - -// ConfigData 配置相关数据 -type ConfigData struct { - Version string `json:"version"` - Notice string `json:"notice"` - ToolList []ToolList `json:"toolList"` -} - -// LibraryRequest 语录请求入参 -type LibraryRequest struct { - SupID string `json:"supId"` - Type string `json:"type"` - Sample int `json:"sample"` - Version string `json:"version"` - Time string `json:"time"` -} - -// LibraryResponse 随机返回 -type LibraryResponse struct { - Code int `json:"code"` - Msg string `json:"msg"` - Data LibraryTotalData `json:"data"` -} - -// LibraryData 随机数据 -type LibraryData struct { - ID string `json:"_id"` - SupID string `json:"supId"` - Type string `json:"type"` - Content string `json:"content"` - Source string `json:"source"` - CreateTime int64 `json:"createTime"` - State int `json:"state"` -} - -// LibraryTotalData 全体数据 -type LibraryTotalData struct { - Data []LibraryData `json:"data"` - Total int `json:"total"` -} - -// MsgRequest 消息请求 -type MsgRequest struct { - Keywords string `json:"keywords"` - Act string `json:"act"` - PageIndex int `json:"pageIndex"` - PageSize int `json:"pageSize"` - Version string `json:"version"` - Time string `json:"time"` -} - -// MsgResponse 消息出参 -type MsgResponse struct { - Code int `json:"code"` - Msg string `json:"msg"` - Data MsgTotalData `json:"data"` -} - -// MsgData 消息 -type MsgData struct { - ID string `json:"_id"` - Title string `json:"title"` - Content string `json:"content"` - Type string `json:"type,omitempty"` - CreateTime int64 `json:"createTime,omitempty"` - Hot int `json:"hot"` - State int `json:"state"` -} - -// MsgTotalData 消息统计 -type MsgTotalData struct { - Data []MsgData `json:"data"` - Total int `json:"total"` -} - -func init() { - engine := control.Register("feifeilv", &ctrl.Options[*zero.Ctx]{ - PrivateDataFolder: "feifeilv", - DisableOnDefault: false, - Brief: "可能媒用", - Help: "- 可能媒用\n- 聊天话术 开场白 0", - }) - cachePath := engine.DataFolder() + "cache/" - _ = os.RemoveAll(cachePath) - _ = os.MkdirAll(cachePath, 0755) - engine.OnFullMatchGroup([]string{"可能媒用"}).SetBlock(true).Handle(func(ctx *zero.Ctx) { - next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession()) - recv, cancel := next.Repeat() - defer cancel() - tools, err := getAllTool() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - tools = filterTool(tools) - tex := "请输入可能媒用序号\n" - for i, v := range tools { - tex += fmt.Sprintf("%d. %s\n", i, v.Name) - } - base64Str, err := text.RenderToBase64(tex, text.FontFile, 400, 20) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.Image("base64://" + binary.BytesToString(base64Str))) - for { - select { - case <-time.After(time.Second * 10): - num := rand.Intn(len(tools)) - ctx.SendChain(message.Text("时间太久啦!", zero.BotConfig.NickName[0], "帮你选择查询", tools[num].Name)) - library, err := getLibraryData(tools[num].ID) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var libraryTex string - if library.Source != "" { - libraryTex = library.Content + "\n——" + library.Source - } else { - libraryTex = library.Content - } - ctx.SendChain(message.Text(libraryTex)) - return - case c := <-recv: - msg := c.Event.Message.ExtractPlainText() - num, err := strconv.Atoi(msg) - if err != nil { - ctx.SendChain(message.Text("请输入数字!")) - continue - } - if num < 0 || num >= len(tools) { - ctx.SendChain(message.Text("序号非法!")) - continue - } - library, err := getLibraryData(tools[num].ID) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var libraryTex string - if library.Source != "" { - libraryTex = library.Content + "\n——" + library.Source - } else { - libraryTex = library.Content - } - ctx.SendChain(message.Text(libraryTex)) - return - } - } - }) - engine.OnRegex(`^聊天话术\s?(\S{1,25})\s?(\d*)$`).SetBlock(true).Handle(func(ctx *zero.Ctx) { - keyword := ctx.State["regex_matched"].([]string)[1] - pagenum := ctx.State["regex_matched"].([]string)[2] - pageIndex, _ := strconv.Atoi(pagenum) - msg, err := getMsg(keyword, pageIndex, 10) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - m := make(message.Message, 0, 10) - tip := "关键词%v相关的对话一共有%v页, %v条, 目前是第%v页" - tagMap := make(map[string]struct{}, 0) - m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(fmt.Sprintf(tip, keyword, (msg.Data.Total-1)/10, msg.Data.Total, pageIndex)))) - for _, v := range msg.Data.Data { - m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(v.Content))) - for _, t := range strings.Split(v.Type, ",") { - tagMap[t] = struct{}{} - } - } - tagList := make([]string, 0, len(tagMap)) - for k := range tagMap { - if k != "" { - tagList = append(tagList, k) - } - } - m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text("相关标签: ", strings.Join(tagList, ",")))) - ctx.Send(m) - }) -} - -func getAllTool() (tools []ToolList, err error) { - r := CommonRequest{ - Version: version, - Time: getTimestamp(), - } - b, err := json.Marshal(&r) - if err != nil { - return - } - data, err := web.PostData(configURL, "application/json", bytes.NewBuffer(b)) - if err != nil { - return - } - var rsp ConfigResponse - err = json.Unmarshal(data, &rsp) - if err != nil { - return - } - tools = rsp.Data.ToolList - return -} - -func filterTool(tools []ToolList) (newTools []ToolList) { - newTools = make([]ToolList, 0, len(tools)) - for _, v := range tools { - if v.Href == randomIndex { - newTools = append(newTools, v) - } - } - return -} - -func getLibraryData(supID string) (libray LibraryData, err error) { - r := LibraryRequest{ - SupID: supID, - Type: textType, - Sample: sample, - Version: version, - Time: getTimestamp(), - } - b, err := json.Marshal(&r) - if err != nil { - return - } - data, err := web.PostData(libraryURL, "application/json", bytes.NewBuffer(b)) - if err != nil { - return - } - var rsp LibraryResponse - err = json.Unmarshal(data, &rsp) - if err != nil { - return - } - if len(rsp.Data.Data) == 0 { - err = errors.New("请求数据为空") - return - } - libray = rsp.Data.Data[0] - return -} - -func getTimestamp() string { - timestamp := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10) - hash := md5.Sum([]byte(timestamp)) - return fmt.Sprintf("%x", hash) -} - -func getMsg(keyword string, pageIndex, pageSize int) (msg MsgResponse, err error) { - r := MsgRequest{ - Keywords: keyword, - Act: act, - Version: version, - PageIndex: pageIndex, - PageSize: pageSize, - Time: getTimestamp(), - } - b, err := json.Marshal(&r) - if err != nil { - return - } - data, err := web.PostData(msgURL, "application/json", bytes.NewBuffer(b)) - if err != nil { - return - } - err = json.Unmarshal(data, &msg) - if err != nil { - return - } - return -} diff --git a/plugin/grasspicture/grasspicture.go b/plugin/grasspicture/grasspicture.go deleted file mode 100644 index 48dac34..0000000 --- a/plugin/grasspicture/grasspicture.go +++ /dev/null @@ -1,166 +0,0 @@ -// Package grasspicture 草图 -package grasspicture - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "mime/multipart" - "os" - "strings" - - "github.com/FloatTech/floatbox/file" - "github.com/FloatTech/floatbox/web" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - "github.com/FloatTech/zbputils/ctxext" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -const ( - grassURL = "https://oss.grass.starxw.com" - infoURL = grassURL + "/service/info" - imageURL = grassURL + "/service/image" - statusURL = grassURL + "/service/status" - uploadURL = grassURL + "/service/upload" -) - -type infoRsp struct { - Code int `json:"code"` - ID string `json:"id"` - LikeCount int `json:"likeCount"` -} - -type statusRsp struct { - TotalImage int `json:"totalImage"` - TotalImageSize int `json:"totalImageSize"` - TotalImageSizeHuman string `json:"totalImageSizeHuman"` - WaitImage string `json:"waitImage"` - APICountToday int `json:"apiCountToday"` - APIFlowToday int `json:"apiFlowToday"` - APIFlowTodayHuman string `json:"apiFlowTodayHuman"` - Service bool `json:"service"` -} - -type uploadRsp struct { - Code int `json:"code"` -} - -func init() { - engine := control.Register("grasspicture", &ctrl.Options[*zero.Ctx]{ - PrivateDataFolder: "grasspicture", - DisableOnDefault: false, - Brief: "草图", - Help: "- 生草 | 来张草图\n- 草图信息\n- 草图投稿 (来个大佬解决问题)\n开发文档: https://apifox.com/apidoc/shared-8a633395-412a-460a-87e0-b82012573873", - }) - cachePath := engine.DataFolder() + "cache/" - _ = os.RemoveAll(cachePath) - _ = os.MkdirAll(cachePath, 0755) - engine.OnFullMatchGroup([]string{"生草", "来张草图"}).SetBlock(true).Handle(func(ctx *zero.Ctx) { - data, err := web.GetData(infoURL) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var info infoRsp - err = json.Unmarshal(data, &info) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - data, err = web.GetData(fmt.Sprintf("%v?id=%v&type=image", imageURL, info.ID)) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.ImageBytes(data)) - }) - engine.OnFullMatchGroup([]string{"草图信息"}).SetBlock(true).Handle(func(ctx *zero.Ctx) { - data, err := web.GetData(statusURL) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var status statusRsp - err = json.Unmarshal(data, &status) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - text := fmt.Sprintf("---==草图信息==---\n是否正常提供服务: %v\n图片总数: %v\n待审核图片数: %v\n今日调用次数: %v\n图片总大小: %v\n今日图片流量: %v\n", status.Service, status.TotalImage, status.WaitImage, status.APICountToday, status.TotalImageSizeHuman, status.APIFlowTodayHuman) - ctx.SendChain(message.Text(text)) - }) - engine.OnMessage(zero.AdminPermission, func(ctx *zero.Ctx) bool { - msg := ctx.Event.Message - if len(msg) < 1 { - return false - } - if msg[0].Type != "reply" { - return false - } - if !strings.Contains(msg.ExtractPlainText(), "草图投稿") { - return false - } - return true - }).SetBlock(true).Limit(ctxext.LimitByUser). - Handle(func(ctx *zero.Ctx) { - id := ctx.Event.Message[0].Data["id"] - imageURL := ctx.GetMessage(message.NewMessageIDFromString(id)).Elements[0].Data["url"] - fileName := cachePath + id + ".jpg" - err := file.DownloadTo(imageURL, fileName) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var payload bytes.Buffer - writer := multipart.NewWriter(&payload) - file, err := os.Open(fileName) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - defer file.Close() - part, err := writer.CreateFormFile("file", fileName) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - _, err = io.Copy(part, file) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - err = writer.Close() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - data, err := web.PostData(uploadURL, writer.FormDataContentType(), &payload) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var upload uploadRsp - err = json.Unmarshal(data, &upload) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var text string - switch upload.Code { - case 200: - text = "草图投稿成功" - case 400: - text = "您已被限流" - case 403: - text = "您已被加入黑名单" - case 1000: - text = "没有发送文件,或发送的文件非有效图片格式" - case 1001: - text = "文件体积大于 2MB" - } - ctx.SendChain(message.ReplyWithMessage(ctx.Event.Message[0].Data["id"], message.Text(text))...) - }) -} diff --git a/plugin/rsshub/domain/rawFeed.go b/plugin/rsshub/domain/rawFeed.go index 1892530..a8f6ee5 100644 --- a/plugin/rsshub/domain/rawFeed.go +++ b/plugin/rsshub/domain/rawFeed.go @@ -21,8 +21,7 @@ var ( // RSSHubMirrors RSSHub镜像站地址列表,第一个为默认地址 rssHubMirrors = []string{ "https://rsshub.rssforever.com", - "https://rss.itggg.cn", - "https://rsshub.feeded.xyz", + "https://rss.injahow.cn", } ) diff --git a/plugin/vtbwife/vtb.go b/plugin/vtbwife/vtb.go deleted file mode 100644 index 8e80e6c..0000000 --- a/plugin/vtbwife/vtb.go +++ /dev/null @@ -1,49 +0,0 @@ -// Package vtbwife 抽vtb老婆 -package vtbwife - -import ( - "encoding/json" - "strconv" - - "github.com/FloatTech/floatbox/web" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -const url = "http://47.93.28.113/vtbwife?id=" - -func init() { // 插件主体 - engine := control.Register("vtbwife", &ctrl.Options[*zero.Ctx]{ - DisableOnDefault: false, - Brief: "抽vtb老婆", - Help: "- 抽vtb(老婆)", - }) - engine.OnRegex(`^抽(vtb|VTB)(老婆)?$`).SetBlock(true).Handle(func(ctx *zero.Ctx) { - body, err := web.GetData(url + strconv.Itoa(int(ctx.Event.UserID))) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var r result - err = json.Unmarshal(body, &r) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - txt := message.Text( - "\n今天你的VTB老婆是: ", r.Name, - ) - if id := ctx.SendChain(message.At(ctx.Event.UserID), txt, message.Image(r.Imgurl), message.Text(r.Message)); id.ID() == 0 { - ctx.SendChain(message.At(ctx.Event.UserID), txt, message.Text("图片发送失败...\n"), message.Text(r.Message)) - } - }) -} - -type result struct { - Code int `json:"code"` - Imgurl string `json:"imgurl"` - Name string `json:"name"` - Message string `json:"message"` -} diff --git a/plugin/wantquotes/wantquotes.go b/plugin/wantquotes/wantquotes.go deleted file mode 100644 index 1a9f6ca..0000000 --- a/plugin/wantquotes/wantquotes.go +++ /dev/null @@ -1,205 +0,0 @@ -// Package wantquotes 据意查句 -package wantquotes - -import ( - "encoding/json" - "fmt" - "net/url" - "strconv" - "strings" - "time" - - "github.com/FloatTech/floatbox/binary" - "github.com/FloatTech/floatbox/web" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - "github.com/FloatTech/zbputils/ctxext" - "github.com/FloatTech/zbputils/img/text" - "github.com/sirupsen/logrus" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -const ( - wantquotesURL = "https://wantquotes.net" - getQrcode = "/api/get_qrcode/" - showqrcode = "https://mp.weixin.qq.com/cgi-bin/showqrcode" - loginCheck = "/api/login_check/" - semantic = "/api/semantic/" -) - -var ( - typeList = []string{"现", "现-名言", "现-佳句", "现-佳句-文学", "现-佳句-诗歌", "现-佳句-其他", "现-网络", "现-台词", "现-台词-影视剧", "现-台词-动漫", "现-台词-综艺", - "古", "谚", "谚-谚语", "谚-俗语", "谚-惯用语", "歇"} -) - -type getQrcodeRsp struct { - Ticket string `json:"ticket"` - SceneID string `json:"scene_id"` -} - -type loginCheckRsp struct { - Login int `json:"login"` - Secret string `json:"secret"` - Unionid string `json:"unionid"` -} - -type semanticRsp struct { - Quotes []Quotes `json:"quotes"` - TopSim float64 `json:"top_sim"` -} - -// Quotes 名句结构体 -type Quotes struct { - Quote string `json:"quote"` - SourceType string `json:"source_type"` - Author string `json:"author"` - Work string `json:"work"` - ID int `json:"id"` -} - -func init() { - engine := control.Register("wantquotes", &ctrl.Options[*zero.Ctx]{ - DisableOnDefault: false, - Brief: "据意查句", - Help: "- 据意查句 大海 (每次重启需, 登录据意查句)\n" + - "- 登录据意查句", - PrivateDataFolder: "wantquotes", - Extra: -1, - }) - - // 开启 - engine.OnRegex(`^据意查句\s?(.{1,25})$`, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) { - keyword := ctx.State["regex_matched"].([]string)[1] - quotesType := ctx.State["quotesType"].(string) - key := getAPIKey(ctx) - unionid, secret, _ := strings.Cut(key, "|") - apiURL := fmt.Sprintf("%s?query=%s&type=%s&unionid=%s&secret=%s", wantquotesURL+semantic, url.QueryEscape(keyword), url.QueryEscape(quotesType), url.QueryEscape(unionid), url.QueryEscape(secret)) - data, err := web.RequestDataWith(web.NewDefaultClient(), apiURL, "GET", wantquotesURL, web.RandUA(), nil) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var rsp semanticRsp - err = json.Unmarshal(data, &rsp) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - m := make(message.Message, 0, len(rsp.Quotes)) - text := strings.Builder{} - for _, v := range rsp.Quotes { - text.WriteString(v.Quote) - text.WriteString("\n—— ") - text.WriteString(v.Author) - text.WriteString(" 《") - text.WriteString(v.Work) - text.WriteString("》") - m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(text.String()))) - text.Reset() - } - if id := ctx.Send(m).ID(); id == 0 { - ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待")) - } - }) - engine.OnFullMatch(`登录据意查句`, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) { - getQrcodeData, err := web.RequestDataWith(web.NewDefaultClient(), wantquotesURL+getQrcode, "GET", wantquotesURL, web.RandUA(), nil) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var qrRsp getQrcodeRsp - err = json.Unmarshal(getQrcodeData, &qrRsp) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - showQrcodeData, err := web.RequestDataWith(web.NewDefaultClient(), showqrcode+"?ticket="+qrRsp.Ticket, "GET", "", web.RandUA(), nil) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.Text("WantQuotes\n微信扫码登录\n首次登录需关注公众号")) - ctx.SendChain(message.ImageBytes(showQrcodeData)) - now := time.Now() - for { - if time.Since(now).Seconds() > 120 { - ctx.SendChain(message.Text("据意查句登录超时,请重新登录")) - return - } - time.Sleep(2 * time.Second) - loginCheckData, err := web.RequestDataWith(web.NewDefaultClient(), wantquotesURL+loginCheck+"?scene_id="+qrRsp.SceneID, "GET", "", web.RandUA(), nil) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - var lcr loginCheckRsp - err = json.Unmarshal(loginCheckData, &lcr) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - if lcr.Login == 1 { - err := setAPIKey(ctx.State["manager"].(*ctrl.Control[*zero.Ctx]), lcr.Unionid+"|"+lcr.Secret) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.Text("据意查句登录成功")) - return - } - } - }) -} - -func getPara(ctx *zero.Ctx) bool { - next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession()) - recv, cancel := next.Repeat() - defer cancel() - tex := strings.Builder{} - tex.WriteString("请下列选择查询名句的类型\n") - for i, v := range typeList { - tex.WriteString(strconv.Itoa(i)) - tex.WriteString(". ") - tex.WriteString(v) - tex.WriteString("\n") - } - base64Str, err := text.RenderToBase64(tex.String(), text.FontFile, 400, 20) - if err != nil { - ctx.SendChain(message.Text("图片生成错误了, ", zero.BotConfig.NickName[0], "帮你选择查询名句类型")) - ctx.State["quotesType"] = typeList[0] - return true - } - ctx.SendChain(message.Image("base64://" + binary.BytesToString(base64Str))) - for { - select { - case <-time.After(time.Second * 10): - ctx.SendChain(message.Text("时间太久啦!", zero.BotConfig.NickName[0], "帮你选择查询名句类型")) - ctx.State["quotesType"] = typeList[0] - return true - case c := <-recv: - msg := c.Event.Message.ExtractPlainText() - num, _ := strconv.Atoi(msg) - if num < 0 || num >= len(typeList) { - ctx.SendChain(message.Text("序号非法!")) - continue - } - ctx.State["quotesType"] = typeList[num] - return true - } - } -} - -// setAPIKey 获取apikey -func getAPIKey(ctx *zero.Ctx) (apikey string) { - m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]) - _ = m.GetExtra(&apikey) - logrus.Debugln("[wantquotes] get api key:", apikey) - return -} - -// setAPIKey 设置apikey, 格式为unionid|secret -func setAPIKey(m *ctrl.Control[*zero.Ctx], apikey string) error { - _ = m.Manager.Response(-1) - return m.SetExtra(apikey) -}