diff --git a/plugin/bilibili/api.go b/plugin/bilibili/api.go index dcd058b8..ad5518f7 100644 --- a/plugin/bilibili/api.go +++ b/plugin/bilibili/api.go @@ -5,6 +5,7 @@ import ( "errors" "io" "net/http" + "time" "github.com/FloatTech/zbputils/binary" "github.com/FloatTech/zbputils/web" @@ -42,6 +43,17 @@ func search(keyword string) (r []searchResult, err error) { return } +// 用mid搜索,主要拿注册时间 +func getCardByMid(mid string) (t string, err error) { + requestURL := "https://account.bilibili.com/api/member/getCardByMid?mid=" + mid + data, err := web.GetData(requestURL) + if err != nil { + return + } + t = time.Unix(gjson.ParseBytes(data).Get("card.regtime").Int(), 0).Format("2006-01-02 15:04:05") + return +} + type follower struct { Mid int `json:"mid"` Uname string `json:"uname"` @@ -85,14 +97,14 @@ func followings(uid string) (s string, err error) { if err != nil { return } - json := gjson.ParseBytes(body) - s = json.Get("data.list.#.uname").Raw - if json.Get("code").Int() == -101 { + j := gjson.ParseBytes(body) + s = j.Get("data.list.#.uname").Raw + if j.Get("code").Int() == -101 { err = errNeedCookie return } - if json.Get("code").Int() != 0 { - err = errors.New(json.Get("message").String()) + if j.Get("code").Int() != 0 { + err = errors.New(j.Get("message").String()) return } return diff --git a/plugin/bilibili/info.go b/plugin/bilibili/info.go index 9b6570d8..9314818d 100644 --- a/plugin/bilibili/info.go +++ b/plugin/bilibili/info.go @@ -4,8 +4,10 @@ package bilibili import ( "encoding/binary" "fmt" + "image" "image/color" "os" + "path" "sort" "strconv" "time" @@ -153,28 +155,29 @@ func init() { i-- } } - facePath := cachePath + id + "vupFace.png" - err = initFacePic(facePath, u.Face) - if err != nil { - ctx.SendChain(message.Text("ERROR:", err)) - return + facePath := cachePath + id + "vupFace" + path.Ext(u.Face) + backX := 500 + backY := 500 + var back image.Image + if path.Ext(u.Face) != ".webp" { + err = initFacePic(facePath, u.Face) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + back, err = gg.LoadImage(facePath) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + back = img.Limit(back, backX, backY) } - var backX int - var backY int - back, err := gg.LoadImage(facePath) - if err != nil { - ctx.SendChain(message.Text("ERROR:", err)) - return - } - back = img.Limit(back, 500, 500) - backX = back.Bounds().Size().X - backY = back.Bounds().Size().Y if len(vups) > 50 { ctx.SendChain(message.Text(u.Name + "关注的up主太多了,只展示前50个up")) vups = vups[:50] } - canvas := gg.NewContext(backX*3, int(float64(backY)*(1.1+float64(len(vups))/3))) - fontSize := float64(backX) * 0.1 + canvas := gg.NewContext(1500, int(500*(1.1+float64(len(vups))/3))) + fontSize := 50.0 canvas.SetColor(color.White) canvas.Clear() if back != nil { @@ -192,16 +195,21 @@ func init() { sl, _ := canvas.MeasureString("好") length, h := canvas.MeasureString(u.Mid) n, _ := canvas.MeasureString(u.Name) - canvas.DrawString(u.Name, float64(backX)*1.1, float64(backY)/3-h) - canvas.DrawRoundedRectangle(float64(backX)*1.2+n-length*0.1, float64(backY)/3-h*2.5, length*1.2, h*2, fontSize*0.2) + canvas.DrawString(u.Name, 550, 160-h) + canvas.DrawRoundedRectangle(600+n-length*0.1, 160-h*2.5, length*1.2, h*2, fontSize*0.2) canvas.SetRGB255(221, 221, 221) canvas.Fill() canvas.SetColor(color.Black) - canvas.DrawString(u.Mid, float64(backX)*1.2+n, float64(backY)/3-h) - canvas.DrawString(fmt.Sprintf("粉丝:%d", u.Fans), float64(backX)*1.1, float64(backY)/3*2-2.5*h) - canvas.DrawString(fmt.Sprintf("关注:%d", len(u.Attentions)), float64(backX)*2, float64(backY)/3*2-2.5*h) - canvas.DrawString(fmt.Sprintf("管人痴成分:%.2f%%(%d/%d)", float64(vupLen)/float64(len(u.Attentions))*100, vupLen, len(u.Attentions)), float64(backX)*1.1, float64(backY)-4*h) - canvas.DrawString("日期:"+time.Now().Format("2006-01-02"), float64(backX)*1.1, float64(backY)-h) + canvas.DrawString(u.Mid, 600+n, 160-h) + canvas.DrawString(fmt.Sprintf("粉丝:%d", u.Fans), 550, 240-h) + canvas.DrawString(fmt.Sprintf("关注:%d", len(u.Attentions)), 1000, 240-h) + canvas.DrawString(fmt.Sprintf("管人痴成分:%.2f%%(%d/%d)", float64(vupLen)/float64(len(u.Attentions))*100, vupLen, len(u.Attentions)), 550, 320-h) + regtime, err := getCardByMid(u.Mid) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + } + canvas.DrawString("注册日期:"+regtime, 550, 400-h) + canvas.DrawString("查询日期:"+time.Now().Format("2006-01-02"), 550, 480-h) for i, v := range vups { if i%2 == 1 { canvas.SetRGB255(245, 245, 245) @@ -221,9 +229,9 @@ func init() { mnl, _ := canvas.MeasureString(m.MedalName) grad := gg.NewLinearGradient(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h, nl+ml+mnl+sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-1.5*h) r, g, b := int2rbg(m.MedalColorStart) - grad.AddColorStop(0, color.RGBA{uint8(r), uint8(g), uint8(b), 255}) + grad.AddColorStop(0, color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 255}) r, g, b = int2rbg(m.MedalColorEnd) - grad.AddColorStop(1, color.RGBA{uint8(r), uint8(g), uint8(b), 255}) + grad.AddColorStop(1, color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 255}) canvas.SetFillStyle(grad) canvas.SetLineWidth(4) canvas.MoveTo(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h)