mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-19 22:00:11 +08:00
⚡️ 🎨 优化bilibili
This commit is contained in:
parent
519ae62760
commit
9cb54a34da
2
go.mod
2
go.mod
@ -4,7 +4,7 @@ go 1.19
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Coloured-glaze/gg v1.3.4
|
github.com/Coloured-glaze/gg v1.3.4
|
||||||
github.com/FloatTech/AnimeAPI v1.5.1-0.20221006135705-daf77c4dedea
|
github.com/FloatTech/AnimeAPI v1.5.2-0.20221007041953-504c6d0e683b
|
||||||
github.com/FloatTech/floatbox v0.0.0-20221004092550-1ebf9b4e6198
|
github.com/FloatTech/floatbox v0.0.0-20221004092550-1ebf9b4e6198
|
||||||
github.com/FloatTech/sqlite v0.4.0
|
github.com/FloatTech/sqlite v0.4.0
|
||||||
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
|
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
|
||||||
|
|||||||
4
go.sum
4
go.sum
@ -2,8 +2,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
|||||||
github.com/Coloured-glaze/gg v1.3.4 h1:l31zIF/HaVwkzjrj+A56RGQoSKyKuR1IWtIrqXGFStI=
|
github.com/Coloured-glaze/gg v1.3.4 h1:l31zIF/HaVwkzjrj+A56RGQoSKyKuR1IWtIrqXGFStI=
|
||||||
github.com/Coloured-glaze/gg v1.3.4/go.mod h1:Ih5NLNNDHOy3RJbB0EPqGTreIzq/H02TGThIagh8HJg=
|
github.com/Coloured-glaze/gg v1.3.4/go.mod h1:Ih5NLNNDHOy3RJbB0EPqGTreIzq/H02TGThIagh8HJg=
|
||||||
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||||
github.com/FloatTech/AnimeAPI v1.5.1-0.20221006135705-daf77c4dedea h1:1kZDanLMBknJa2Z+O9t17TNmOENnIYGaPZaGeSw9V5w=
|
github.com/FloatTech/AnimeAPI v1.5.2-0.20221007041953-504c6d0e683b h1:HMNvCoycUJc/+2RdmwuLHyW1KbsuGrF0RQRivVZ2Qzc=
|
||||||
github.com/FloatTech/AnimeAPI v1.5.1-0.20221006135705-daf77c4dedea/go.mod h1:HFQWi7BT966CxSGx6Et/weLaCApsY8FFSbbMPHqEGl0=
|
github.com/FloatTech/AnimeAPI v1.5.2-0.20221007041953-504c6d0e683b/go.mod h1:HFQWi7BT966CxSGx6Et/weLaCApsY8FFSbbMPHqEGl0=
|
||||||
github.com/FloatTech/floatbox v0.0.0-20221004092550-1ebf9b4e6198 h1:AkwB7LKMK74yS5rIERhOQbJosDgOefJBSkhEiMbyr+A=
|
github.com/FloatTech/floatbox v0.0.0-20221004092550-1ebf9b4e6198 h1:AkwB7LKMK74yS5rIERhOQbJosDgOefJBSkhEiMbyr+A=
|
||||||
github.com/FloatTech/floatbox v0.0.0-20221004092550-1ebf9b4e6198/go.mod h1:4UDl6E/I2HqAqRnKdsxxfO28fkqGo3CzFOP2BhyI6ag=
|
github.com/FloatTech/floatbox v0.0.0-20221004092550-1ebf9b4e6198/go.mod h1:4UDl6E/I2HqAqRnKdsxxfO28fkqGo3CzFOP2BhyI6ag=
|
||||||
github.com/FloatTech/sqlite v0.4.0 h1:fvQ1vc7fw99jYXccs5KItMluy7QL1t6NxbkH7aN1F4g=
|
github.com/FloatTech/sqlite v0.4.0 h1:fvQ1vc7fw99jYXccs5KItMluy7QL1t6NxbkH7aN1F4g=
|
||||||
|
|||||||
@ -1,144 +0,0 @@
|
|||||||
package bilibili
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/FloatTech/floatbox/binary"
|
|
||||||
"github.com/FloatTech/floatbox/web"
|
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errNeedCookie = errors.New("该api需要设置b站cookie,请发送命令设置cookie,例如\"设置b站cookie SESSDATA=82da790d,1663822823,06ecf*31\"")
|
|
||||||
)
|
|
||||||
|
|
||||||
// searchUser 查找b站用户
|
|
||||||
func searchUser(keyword string) (r []searchResult, err error) {
|
|
||||||
client := &http.Client{}
|
|
||||||
req, err := http.NewRequest("GET", fmt.Sprintf(searchUserURL, keyword), nil)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = reflushBilibiliCookie()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.Header.Add("cookie", cfg.BilibiliCookie)
|
|
||||||
res, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
if res.StatusCode != http.StatusOK {
|
|
||||||
s := fmt.Sprintf("status code: %d", res.StatusCode)
|
|
||||||
err = errors.New(s)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var sd searchData
|
|
||||||
err = json.NewDecoder(res.Body).Decode(&sd)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
r = sd.Data.Result
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// getVtbDetail 查找vtb信息
|
|
||||||
func getVtbDetail(uid string) (result vtbDetail, err error) {
|
|
||||||
data, err := web.GetData(fmt.Sprintf(vtbDetailURL, uid))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = json.Unmarshal(data, &result); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// getMemberCard 获取b站个人详情
|
|
||||||
func getMemberCard(uid interface{}) (result memberCard, err error) {
|
|
||||||
data, err := web.GetData(fmt.Sprintf(memberCardURL, uid))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("card").Raw), &result)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// getMedalwall 用b站uid获得牌子
|
|
||||||
func getMedalwall(uid string) (result []medal, err error) {
|
|
||||||
client := &http.Client{}
|
|
||||||
req, err := http.NewRequest("GET", fmt.Sprintf(medalwallURL, uid), nil)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = reflushBilibiliCookie()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.Header.Add("cookie", cfg.BilibiliCookie)
|
|
||||||
res, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
var md medalData
|
|
||||||
err = json.NewDecoder(res.Body).Decode(&md)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if md.Code == -101 {
|
|
||||||
err = errNeedCookie
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if md.Code != 0 {
|
|
||||||
err = errors.New(md.Message)
|
|
||||||
}
|
|
||||||
result = md.Data.List
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// getArticleInfo 用id查专栏信息
|
|
||||||
func getArticleInfo(id string) (card Card, err error) {
|
|
||||||
var data []byte
|
|
||||||
data, err = web.GetData(fmt.Sprintf(articleInfoURL, id))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("data").Raw), &card)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// getLiveRoomInfo 用直播间id查直播间信息
|
|
||||||
func getLiveRoomInfo(roomID string) (card roomCard, err error) {
|
|
||||||
var data []byte
|
|
||||||
data, err = web.GetData(fmt.Sprintf(liveRoomInfoURL, roomID))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("data").Raw), &card)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// getVideoInfo 用av或bv查视频信息
|
|
||||||
func getVideoInfo(id string) (card Card, err error) {
|
|
||||||
var data []byte
|
|
||||||
_, err = strconv.Atoi(id)
|
|
||||||
if err == nil {
|
|
||||||
data, err = web.GetData(fmt.Sprintf(videoInfoURL, id, ""))
|
|
||||||
} else {
|
|
||||||
data, err = web.GetData(fmt.Sprintf(videoInfoURL, "", id))
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("data").Raw), &card)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@ -17,6 +17,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Coloured-glaze/gg"
|
"github.com/Coloured-glaze/gg"
|
||||||
|
bz "github.com/FloatTech/AnimeAPI/bilibili"
|
||||||
fcext "github.com/FloatTech/floatbox/ctxext"
|
fcext "github.com/FloatTech/floatbox/ctxext"
|
||||||
"github.com/FloatTech/floatbox/file"
|
"github.com/FloatTech/floatbox/file"
|
||||||
"github.com/FloatTech/floatbox/img/writer"
|
"github.com/FloatTech/floatbox/img/writer"
|
||||||
@ -40,8 +41,7 @@ var (
|
|||||||
4: "进入直播间",
|
4: "进入直播间",
|
||||||
5: "标题变动",
|
5: "标题变动",
|
||||||
}
|
}
|
||||||
cfgFile = "data/Bilibili/config.json"
|
cfg = bz.NewCookieConfig("data/Bilibili/config.json")
|
||||||
cfg config
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 查成分的
|
// 查成分的
|
||||||
@ -73,7 +73,7 @@ func init() {
|
|||||||
engine.OnRegex(`^>user info\s?(.{1,25})$`, getPara).SetBlock(true).
|
engine.OnRegex(`^>user info\s?(.{1,25})$`, getPara).SetBlock(true).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
id := ctx.State["uid"].(string)
|
id := ctx.State["uid"].(string)
|
||||||
card, err := getMemberCard(id)
|
card, err := bz.GetMemberCard(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -92,7 +92,7 @@ func init() {
|
|||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
id := ctx.State["uid"].(string)
|
id := ctx.State["uid"].(string)
|
||||||
// 获取详情
|
// 获取详情
|
||||||
fo, err := getVtbDetail(id)
|
fo, err := bz.GetVtbDetail(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -120,7 +120,7 @@ func init() {
|
|||||||
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
|
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
u, err := getMemberCard(id)
|
u, err := bz.GetMemberCard(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -131,13 +131,13 @@ func init() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
vupLen := len(vups)
|
vupLen := len(vups)
|
||||||
medals, err := getMedalwall(id)
|
medals, err := bz.GetMedalWall(cfg, id)
|
||||||
sort.Sort(medalSlice(medals))
|
sort.Sort(bz.MedalSorter(medals))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
}
|
}
|
||||||
frontVups := make([]vup, 0)
|
frontVups := make([]vup, 0)
|
||||||
medalMap := make(map[int64]medal)
|
medalMap := make(map[int64]bz.Medal)
|
||||||
for _, v := range medals {
|
for _, v := range medals {
|
||||||
up := vup{
|
up := vup{
|
||||||
Mid: v.Mid,
|
Mid: v.Mid,
|
||||||
@ -173,7 +173,7 @@ func init() {
|
|||||||
back = img.Size(back, backX, backY).Im
|
back = img.Size(back, backX, backY).Im
|
||||||
}
|
}
|
||||||
if len(vups) > 50 {
|
if len(vups) > 50 {
|
||||||
ctx.SendChain(message.Text(u.Name + "关注的up主太多了,只展示前50个up"))
|
ctx.SendChain(message.Text(u.Name + "关注的up主太多了, 只展示前50个up"))
|
||||||
vups = vups[:50]
|
vups = vups[:50]
|
||||||
}
|
}
|
||||||
canvas := gg.NewContext(1500, int(500*(1.1+float64(len(vups))/3)))
|
canvas := gg.NewContext(1500, int(500*(1.1+float64(len(vups))/3)))
|
||||||
@ -275,19 +275,19 @@ func init() {
|
|||||||
if pagenum == "" {
|
if pagenum == "" {
|
||||||
pagenum = "0"
|
pagenum = "0"
|
||||||
}
|
}
|
||||||
u, err := getMemberCard(id)
|
u, err := bz.GetMemberCard(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var danmaku danmakusuki
|
var danmaku bz.Danmakusuki
|
||||||
tr := &http.Transport{
|
tr := &http.Transport{
|
||||||
DisableKeepAlives: true,
|
DisableKeepAlives: true,
|
||||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||||
}
|
}
|
||||||
|
|
||||||
client := &http.Client{Transport: tr}
|
client := &http.Client{Transport: tr}
|
||||||
data, err := web.RequestDataWith(client, fmt.Sprintf(danmakuAPI, id, pagenum), "GET", "", web.RandUA())
|
data, err := web.RequestDataWith(client, fmt.Sprintf(bz.DanmakuAPI, id, pagenum), "GET", "", web.RandUA())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -363,7 +363,7 @@ func init() {
|
|||||||
canvas.DrawString(u.Mid, 900+n, 122.5)
|
canvas.DrawString(u.Mid, 900+n, 122.5)
|
||||||
canvas.DrawString(fmt.Sprintf("粉丝:%d 关注:%d", u.Fans, u.Attention), startWidth, 222.5)
|
canvas.DrawString(fmt.Sprintf("粉丝:%d 关注:%d", u.Fans, u.Attention), startWidth, 222.5)
|
||||||
canvas.DrawString(fmt.Sprintf("页码:[%d/%d]", danmaku.Data.PageNum, (danmaku.Data.Total-1)/5), startWidth, 322.5)
|
canvas.DrawString(fmt.Sprintf("页码:[%d/%d]", danmaku.Data.PageNum, (danmaku.Data.Total-1)/5), startWidth, 322.5)
|
||||||
canvas.DrawString("网页链接: "+fmt.Sprintf(danmakuURL, u.Mid), startWidth, 422.5)
|
canvas.DrawString("网页链接: "+fmt.Sprintf(bz.DanmakuURL, u.Mid), startWidth, 422.5)
|
||||||
var channelStart float64
|
var channelStart float64
|
||||||
channelStart = float64(550)
|
channelStart = float64(550)
|
||||||
for i := 0; i < len(danmaku.Data.Data); i++ {
|
for i := 0; i < len(danmaku.Data.Data); i++ {
|
||||||
@ -527,7 +527,7 @@ func init() {
|
|||||||
engine.OnRegex(`^设置b站cookie?\s+(.*)$`, zero.SuperUserPermission).SetBlock(true).
|
engine.OnRegex(`^设置b站cookie?\s+(.*)$`, zero.SuperUserPermission).SetBlock(true).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
cookie := ctx.State["regex_matched"].([]string)[1]
|
cookie := ctx.State["regex_matched"].([]string)[1]
|
||||||
err := setBilibiliCookie(cookie)
|
err := cfg.Set(cookie)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -571,7 +571,7 @@ func int2rbg(t int64) (int64, int64, int64) {
|
|||||||
func getPara(ctx *zero.Ctx) bool {
|
func getPara(ctx *zero.Ctx) bool {
|
||||||
keyword := ctx.State["regex_matched"].([]string)[1]
|
keyword := ctx.State["regex_matched"].([]string)[1]
|
||||||
if !re.MatchString(keyword) {
|
if !re.MatchString(keyword) {
|
||||||
searchRes, err := searchUser(keyword)
|
searchRes, err := bz.SearchUser(cfg, keyword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return false
|
return false
|
||||||
@ -582,7 +582,7 @@ func getPara(ctx *zero.Ctx) bool {
|
|||||||
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
|
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
|
||||||
recv, cancel := next.Repeat()
|
recv, cancel := next.Repeat()
|
||||||
defer cancel()
|
defer cancel()
|
||||||
ctx.SendChain(message.Text("输入为纯数字,请选择查询uid还是用户名,输入对应序号:\n0. 查询uid\n1. 查询用户名"))
|
ctx.SendChain(message.Text("输入为纯数字, 请选择查询uid还是用户名, 输入对应序号:\n0. 查询uid\n1. 查询用户名"))
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Second * 10):
|
case <-time.After(time.Second * 10):
|
||||||
@ -604,7 +604,7 @@ func getPara(ctx *zero.Ctx) bool {
|
|||||||
ctx.State["uid"] = keyword
|
ctx.State["uid"] = keyword
|
||||||
return true
|
return true
|
||||||
} else if num == 1 {
|
} else if num == 1 {
|
||||||
searchRes, err := searchUser(keyword)
|
searchRes, err := bz.SearchUser(cfg, keyword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return false
|
return false
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
bz "github.com/FloatTech/AnimeAPI/bilibili"
|
||||||
ctrl "github.com/FloatTech/zbpctrl"
|
ctrl "github.com/FloatTech/zbpctrl"
|
||||||
"github.com/FloatTech/zbputils/control"
|
"github.com/FloatTech/zbputils/control"
|
||||||
"github.com/FloatTech/zbputils/ctxext"
|
"github.com/FloatTech/zbputils/ctxext"
|
||||||
@ -34,7 +35,7 @@ func init() {
|
|||||||
en.OnRegex(`((b23|acg).tv|bili2233.cn)/[0-9a-zA-Z]+`).SetBlock(true).Limit(limit.LimitByGroup).
|
en.OnRegex(`((b23|acg).tv|bili2233.cn)/[0-9a-zA-Z]+`).SetBlock(true).Limit(limit.LimitByGroup).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
url := ctx.State["regex_matched"].([]string)[0]
|
url := ctx.State["regex_matched"].([]string)[0]
|
||||||
realurl, err := getrealurl("https://" + url)
|
realurl, err := bz.GetRealUrl("https://" + url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -65,7 +66,7 @@ func handleVideo(ctx *zero.Ctx) {
|
|||||||
if id == "" {
|
if id == "" {
|
||||||
id = ctx.State["regex_matched"].([]string)[2]
|
id = ctx.State["regex_matched"].([]string)[2]
|
||||||
}
|
}
|
||||||
card, err := getVideoInfo(id)
|
card, err := bz.GetVideoInfo(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -88,7 +89,7 @@ func handleDynamic(ctx *zero.Ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleArticle(ctx *zero.Ctx) {
|
func handleArticle(ctx *zero.Ctx) {
|
||||||
card, err := getArticleInfo(ctx.State["regex_matched"].([]string)[1])
|
card, err := bz.GetArticleInfo(ctx.State["regex_matched"].([]string)[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
@ -97,7 +98,7 @@ func handleArticle(ctx *zero.Ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleLive(ctx *zero.Ctx) {
|
func handleLive(ctx *zero.Ctx) {
|
||||||
card, err := getLiveRoomInfo(ctx.State["regex_matched"].([]string)[1])
|
card, err := bz.GetLiveRoomInfo(ctx.State["regex_matched"].([]string)[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
return
|
return
|
||||||
|
|||||||
@ -1,12 +1,9 @@
|
|||||||
package bilibili
|
package bilibili
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/FloatTech/floatbox/binary"
|
"github.com/FloatTech/floatbox/binary"
|
||||||
"github.com/FloatTech/floatbox/file"
|
|
||||||
"github.com/FloatTech/floatbox/web"
|
"github.com/FloatTech/floatbox/web"
|
||||||
_ "github.com/fumiama/sqlite3" // use sql
|
_ "github.com/fumiama/sqlite3" // use sql
|
||||||
"github.com/jinzhu/gorm"
|
"github.com/jinzhu/gorm"
|
||||||
@ -92,32 +89,3 @@ func updateVup() error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setBilibiliCookie(cookie string) (err error) {
|
|
||||||
cfg = config{
|
|
||||||
BilibiliCookie: cookie,
|
|
||||||
}
|
|
||||||
return saveConfig(cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func reflushBilibiliCookie() (err error) {
|
|
||||||
if file.IsNotExist(cfgFile) {
|
|
||||||
err = errors.New("未初始化配置")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
reader, err := os.Open(cfgFile)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer reader.Close()
|
|
||||||
return json.NewDecoder(reader).Decode(&cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func saveConfig(cfg config) (err error) {
|
|
||||||
reader, err := os.Create(cfgFile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer reader.Close()
|
|
||||||
return json.NewEncoder(reader).Encode(&cfg)
|
|
||||||
}
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import (
|
|||||||
zero "github.com/wdvxdr1123/ZeroBot"
|
zero "github.com/wdvxdr1123/ZeroBot"
|
||||||
"github.com/wdvxdr1123/ZeroBot/message"
|
"github.com/wdvxdr1123/ZeroBot/message"
|
||||||
|
|
||||||
|
bz "github.com/FloatTech/AnimeAPI/bilibili"
|
||||||
"github.com/FloatTech/floatbox/binary"
|
"github.com/FloatTech/floatbox/binary"
|
||||||
"github.com/FloatTech/floatbox/web"
|
"github.com/FloatTech/floatbox/web"
|
||||||
ctrl "github.com/FloatTech/zbpctrl"
|
ctrl "github.com/FloatTech/zbpctrl"
|
||||||
@ -191,7 +192,7 @@ func getName(buid int64) (name string, err error) {
|
|||||||
|
|
||||||
// subscribe 订阅
|
// subscribe 订阅
|
||||||
func subscribe(buid, groupid int64) (err error) {
|
func subscribe(buid, groupid int64) (err error) {
|
||||||
bpMap := map[string]interface{}{
|
bpMap := map[string]any{
|
||||||
"bilibili_uid": buid,
|
"bilibili_uid": buid,
|
||||||
"group_id": groupid,
|
"group_id": groupid,
|
||||||
"live_disable": 0,
|
"live_disable": 0,
|
||||||
@ -202,7 +203,7 @@ func subscribe(buid, groupid int64) (err error) {
|
|||||||
|
|
||||||
// unsubscribe 取消订阅
|
// unsubscribe 取消订阅
|
||||||
func unsubscribe(buid, groupid int64) (err error) {
|
func unsubscribe(buid, groupid int64) (err error) {
|
||||||
bpMap := map[string]interface{}{
|
bpMap := map[string]any{
|
||||||
"bilibili_uid": buid,
|
"bilibili_uid": buid,
|
||||||
"group_id": groupid,
|
"group_id": groupid,
|
||||||
"live_disable": 1,
|
"live_disable": 1,
|
||||||
@ -212,7 +213,7 @@ func unsubscribe(buid, groupid int64) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func unsubscribeDynamic(buid, groupid int64) (err error) {
|
func unsubscribeDynamic(buid, groupid int64) (err error) {
|
||||||
bpMap := map[string]interface{}{
|
bpMap := map[string]any{
|
||||||
"bilibili_uid": buid,
|
"bilibili_uid": buid,
|
||||||
"group_id": groupid,
|
"group_id": groupid,
|
||||||
"dynamic_disable": 1,
|
"dynamic_disable": 1,
|
||||||
@ -221,7 +222,7 @@ func unsubscribeDynamic(buid, groupid int64) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func unsubscribeLive(buid, groupid int64) (err error) {
|
func unsubscribeLive(buid, groupid int64) (err error) {
|
||||||
bpMap := map[string]interface{}{
|
bpMap := map[string]any{
|
||||||
"bilibili_uid": buid,
|
"bilibili_uid": buid,
|
||||||
"group_id": groupid,
|
"group_id": groupid,
|
||||||
"live_disable": 1,
|
"live_disable": 1,
|
||||||
@ -230,7 +231,7 @@ func unsubscribeLive(buid, groupid int64) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getUserDynamicCard(buid int64) (cardList []gjson.Result, err error) {
|
func getUserDynamicCard(buid int64) (cardList []gjson.Result, err error) {
|
||||||
data, err := web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(spaceHistoryURL, buid, 0), "GET", referer, ua)
|
data, err := web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(bz.SpaceHistoryURL, buid, 0), "GET", referer, ua)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -239,13 +240,13 @@ func getUserDynamicCard(buid int64) (cardList []gjson.Result, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getLiveList(uids ...int64) (string, error) {
|
func getLiveList(uids ...int64) (string, error) {
|
||||||
m := make(map[string]interface{})
|
m := make(map[string]any)
|
||||||
m["uids"] = uids
|
m["uids"] = uids
|
||||||
b, err := json.Marshal(m)
|
b, err := json.Marshal(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
data, err := web.PostData(liveListURL, "application/json", bytes.NewReader(b))
|
data, err := web.PostData(bz.LiveListURL, "application/json", bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@ -276,7 +277,12 @@ func sendDynamic(ctx *zero.Ctx) error {
|
|||||||
m, ok := control.Lookup(serviceName)
|
m, ok := control.Lookup(serviceName)
|
||||||
if ok {
|
if ok {
|
||||||
groupList := bdb.getAllGroupByBuidAndDynamic(buid)
|
groupList := bdb.getAllGroupByBuidAndDynamic(buid)
|
||||||
msg, err := dynamicCard2msg(cardList[i].Raw, 0)
|
dc, err := bz.LoadDynamicDetail(cardList[i].Raw)
|
||||||
|
if err != nil {
|
||||||
|
err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
msg, err := dynamicCard2msg(&dc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err)
|
err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err)
|
||||||
return err
|
return err
|
||||||
@ -324,7 +330,7 @@ func sendLive(ctx *zero.Ctx) error {
|
|||||||
if roomID == 0 {
|
if roomID == 0 {
|
||||||
roomID = value.Get("room_id").Int()
|
roomID = value.Get("room_id").Int()
|
||||||
}
|
}
|
||||||
lURL := liveURL + strconv.FormatInt(roomID, 10)
|
lURL := bz.LiveURL + strconv.FormatInt(roomID, 10)
|
||||||
lName := value.Get("uname").String()
|
lName := value.Get("uname").String()
|
||||||
lTitle := value.Get("title").String()
|
lTitle := value.Get("title").String()
|
||||||
lCover := value.Get("cover_from_user").String()
|
lCover := value.Get("cover_from_user").String()
|
||||||
|
|||||||
@ -54,7 +54,7 @@ func initializePush(dbpath string) *bilibilipushdb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// insertOrUpdateLiveAndDynamic 插入或更新数据库
|
// insertOrUpdateLiveAndDynamic 插入或更新数据库
|
||||||
func (bdb *bilibilipushdb) insertOrUpdateLiveAndDynamic(bpMap map[string]interface{}) (err error) {
|
func (bdb *bilibilipushdb) insertOrUpdateLiveAndDynamic(bpMap map[string]any) (err error) {
|
||||||
db := (*gorm.DB)(bdb)
|
db := (*gorm.DB)(bdb)
|
||||||
bp := bilibilipush{}
|
bp := bilibilipush{}
|
||||||
data, err := json.Marshal(&bpMap)
|
data, err := json.Marshal(&bpMap)
|
||||||
|
|||||||
@ -2,18 +2,15 @@ package bilibili
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
bz "github.com/FloatTech/AnimeAPI/bilibili"
|
||||||
"github.com/FloatTech/floatbox/binary"
|
"github.com/FloatTech/floatbox/binary"
|
||||||
"github.com/FloatTech/floatbox/web"
|
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
"github.com/wdvxdr1123/ZeroBot/message"
|
"github.com/wdvxdr1123/ZeroBot/message"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
typeMsg = map[int]string{
|
MsgType = map[int]string{
|
||||||
1: "转发了动态",
|
1: "转发了动态",
|
||||||
2: "有图营业",
|
2: "有图营业",
|
||||||
4: "无图营业",
|
4: "无图营业",
|
||||||
@ -27,66 +24,56 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// dynamicCard2msg cType=0时,处理DynCard字符串,cType=1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308时,处理Card字符串,cType为card类型
|
// dynamicCard2msg 处理DynCard
|
||||||
func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err error) {
|
func dynamicCard2msg(dynamicCard *bz.DynamicCard) (msg []message.MessageSegment, err error) {
|
||||||
var (
|
var (
|
||||||
dynamicCard dynamicCard
|
card bz.Card
|
||||||
card Card
|
vote bz.Vote
|
||||||
vote Vote
|
cType int
|
||||||
)
|
)
|
||||||
msg = make([]message.MessageSegment, 0, 16)
|
msg = make([]message.MessageSegment, 0, 16)
|
||||||
// 初始化结构体
|
// 初始化结构体
|
||||||
switch cType {
|
err = json.Unmarshal(binary.StringToBytes(dynamicCard.Card), &card)
|
||||||
case 0:
|
if err != nil {
|
||||||
err = json.Unmarshal(binary.StringToBytes(str), &dynamicCard)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(dynamicCard.Card), &card)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if dynamicCard.Extension.Vote != "" {
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(dynamicCard.Extension.Vote), &vote)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cType = dynamicCard.Desc.Type
|
|
||||||
case 1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308:
|
|
||||||
err = json.Unmarshal(binary.StringToBytes(str), &card)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
err = errors.New("只有0, 1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308模式")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if dynamicCard.Extension.Vote != "" {
|
||||||
|
err = json.Unmarshal(binary.StringToBytes(dynamicCard.Extension.Vote), &vote)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cType = dynamicCard.Desc.Type
|
||||||
// 生成消息
|
// 生成消息
|
||||||
switch cType {
|
switch cType {
|
||||||
case 1:
|
case 1:
|
||||||
msg = append(msg, message.Text(card.User.Uname, typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.User.Uname, MsgType[cType], "\n",
|
||||||
card.Item.Content, "\n",
|
card.Item.Content, "\n",
|
||||||
"转发的内容: \n"))
|
"转发的内容: \n"))
|
||||||
var originMsg []message.MessageSegment
|
var originMsg []message.MessageSegment
|
||||||
originMsg, err = dynamicCard2msg(card.Origin, card.Item.OrigType)
|
var co bz.Card
|
||||||
|
co, err = bz.LoadCardDetail(card.Origin)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
originMsg, err = card2msg(dynamicCard, &co, card.Item.OrigType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
msg = append(msg, originMsg...)
|
msg = append(msg, originMsg...)
|
||||||
case 2:
|
case 2:
|
||||||
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
card.Item.Description))
|
card.Item.Description))
|
||||||
for i := 0; i < len(card.Item.Pictures); i++ {
|
for i := 0; i < len(card.Item.Pictures); i++ {
|
||||||
msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc))
|
msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc))
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
card.Item.Content, "\n"))
|
card.Item.Content, "\n"))
|
||||||
if dynamicCard.Extension.Vote != "" {
|
if dynamicCard.Extension.Vote != "" {
|
||||||
msg = append(msg, message.Text("【投票】", vote.Desc, "\n",
|
msg = append(msg, message.Text("【投票】", vote.Desc, "\n",
|
||||||
"截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n",
|
"截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n",
|
||||||
"参与人数: ", humanNum(vote.JoinNum), "\n",
|
"参与人数: ", bz.HumanNum(vote.JoinNum), "\n",
|
||||||
"投票选项( 最多选择", vote.ChoiceCnt, "项 )\n"))
|
"投票选项( 最多选择", vote.ChoiceCnt, "项 )\n"))
|
||||||
for i := 0; i < len(vote.Options); i++ {
|
for i := 0; i < len(vote.Options); i++ {
|
||||||
msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n"))
|
msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n"))
|
||||||
@ -96,18 +83,18 @@ func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 8:
|
case 8:
|
||||||
msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
card.Title))
|
card.Title))
|
||||||
msg = append(msg, message.Image(card.Pic))
|
msg = append(msg, message.Image(card.Pic))
|
||||||
msg = append(msg, message.Text(card.Desc, "\n",
|
msg = append(msg, message.Text(card.Desc, "\n",
|
||||||
card.ShareSubtitle, "\n",
|
card.ShareSubtitle, "\n",
|
||||||
"视频链接: ", card.ShortLink, "\n"))
|
"视频链接: ", card.ShortLink, "\n"))
|
||||||
case 16:
|
case 16:
|
||||||
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
card.Item.Description))
|
card.Item.Description))
|
||||||
msg = append(msg, message.Image(card.Item.Cover.Default))
|
msg = append(msg, message.Image(card.Item.Cover.Default))
|
||||||
case 64:
|
case 64:
|
||||||
msg = append(msg, message.Text(card.Author.(map[string]interface{})["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.Author.(map[string]any)["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
card.Title, "\n",
|
card.Title, "\n",
|
||||||
card.Summary))
|
card.Summary))
|
||||||
for i := 0; i < len(card.ImageUrls); i++ {
|
for i := 0; i < len(card.ImageUrls); i++ {
|
||||||
@ -117,7 +104,7 @@ func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err e
|
|||||||
msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n"))
|
msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n"))
|
||||||
}
|
}
|
||||||
case 256:
|
case 256:
|
||||||
msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
card.Title))
|
card.Title))
|
||||||
msg = append(msg, message.Image(card.Cover))
|
msg = append(msg, message.Image(card.Cover))
|
||||||
msg = append(msg, message.Text(card.Intro, "\n"))
|
msg = append(msg, message.Text(card.Intro, "\n"))
|
||||||
@ -126,7 +113,7 @@ func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err e
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 2048:
|
case 2048:
|
||||||
msg = append(msg, message.Text(card.User.Uname, typeMsg[cType], "\n",
|
msg = append(msg, message.Text(card.User.Uname, MsgType[cType], "\n",
|
||||||
card.Vest.Content, "\n",
|
card.Vest.Content, "\n",
|
||||||
card.Sketch.Title, "\n",
|
card.Sketch.Title, "\n",
|
||||||
card.Sketch.DescText, "\n"))
|
card.Sketch.DescText, "\n"))
|
||||||
@ -134,7 +121,7 @@ func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err e
|
|||||||
msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n"))
|
msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n"))
|
||||||
case 4308:
|
case 4308:
|
||||||
if dynamicCard.Desc.UserProfile.Info.Uname != "" {
|
if dynamicCard.Desc.UserProfile.Info.Uname != "" {
|
||||||
msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, typeMsg[cType], "\n"))
|
msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, MsgType[cType], "\n"))
|
||||||
}
|
}
|
||||||
msg = append(msg, message.Image(card.LivePlayInfo.Cover))
|
msg = append(msg, message.Image(card.LivePlayInfo.Cover))
|
||||||
msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n",
|
msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n",
|
||||||
@ -153,35 +140,141 @@ func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err e
|
|||||||
msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n"))
|
msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n"))
|
||||||
}
|
}
|
||||||
if dynamicCard.Desc.DynamicIDStr != "" {
|
if dynamicCard.Desc.DynamicIDStr != "" {
|
||||||
msg = append(msg, message.Text("动态链接: ", tURL, dynamicCard.Desc.DynamicIDStr))
|
msg = append(msg, message.Text("动态链接: ", bz.TURL, dynamicCard.Desc.DynamicIDStr))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// card2msg cType=1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308时,处理Card字符串,cType为card类型
|
||||||
|
func card2msg(dynamicCard *bz.DynamicCard, card *bz.Card, cType int) (msg []message.MessageSegment, err error) {
|
||||||
|
var (
|
||||||
|
vote bz.Vote
|
||||||
|
)
|
||||||
|
msg = make([]message.MessageSegment, 0, 16)
|
||||||
|
// 生成消息
|
||||||
|
switch cType {
|
||||||
|
case 1:
|
||||||
|
msg = append(msg, message.Text(card.User.Uname, MsgType[cType], "\n",
|
||||||
|
card.Item.Content, "\n",
|
||||||
|
"转发的内容: \n"))
|
||||||
|
var originMsg []message.MessageSegment
|
||||||
|
var co bz.Card
|
||||||
|
co, err = bz.LoadCardDetail(card.Origin)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
originMsg, err = card2msg(dynamicCard, &co, card.Item.OrigType)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
msg = append(msg, originMsg...)
|
||||||
|
case 2:
|
||||||
|
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
|
card.Item.Description))
|
||||||
|
for i := 0; i < len(card.Item.Pictures); i++ {
|
||||||
|
msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc))
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
|
card.Item.Content, "\n"))
|
||||||
|
if dynamicCard.Extension.Vote != "" {
|
||||||
|
msg = append(msg, message.Text("【投票】", vote.Desc, "\n",
|
||||||
|
"截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n",
|
||||||
|
"参与人数: ", bz.HumanNum(vote.JoinNum), "\n",
|
||||||
|
"投票选项( 最多选择", vote.ChoiceCnt, "项 )\n"))
|
||||||
|
for i := 0; i < len(vote.Options); i++ {
|
||||||
|
msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n"))
|
||||||
|
if vote.Options[i].ImgURL != "" {
|
||||||
|
msg = append(msg, message.Image(vote.Options[i].ImgURL))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 8:
|
||||||
|
msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
|
card.Title))
|
||||||
|
msg = append(msg, message.Image(card.Pic))
|
||||||
|
msg = append(msg, message.Text(card.Desc, "\n",
|
||||||
|
card.ShareSubtitle, "\n",
|
||||||
|
"视频链接: ", card.ShortLink, "\n"))
|
||||||
|
case 16:
|
||||||
|
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
|
card.Item.Description))
|
||||||
|
msg = append(msg, message.Image(card.Item.Cover.Default))
|
||||||
|
case 64:
|
||||||
|
msg = append(msg, message.Text(card.Author.(map[string]any)["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
|
card.Title, "\n",
|
||||||
|
card.Summary))
|
||||||
|
for i := 0; i < len(card.ImageUrls); i++ {
|
||||||
|
msg = append(msg, message.Image(card.ImageUrls[i]))
|
||||||
|
}
|
||||||
|
if card.ID != 0 {
|
||||||
|
msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n"))
|
||||||
|
}
|
||||||
|
case 256:
|
||||||
|
msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), MsgType[cType], "\n",
|
||||||
|
card.Title))
|
||||||
|
msg = append(msg, message.Image(card.Cover))
|
||||||
|
msg = append(msg, message.Text(card.Intro, "\n"))
|
||||||
|
if card.ID != 0 {
|
||||||
|
msg = append(msg, message.Text("音频链接: https://www.bilibili.com/audio/au", card.ID, "\n"))
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2048:
|
||||||
|
msg = append(msg, message.Text(card.User.Uname, MsgType[cType], "\n",
|
||||||
|
card.Vest.Content, "\n",
|
||||||
|
card.Sketch.Title, "\n",
|
||||||
|
card.Sketch.DescText, "\n"))
|
||||||
|
msg = append(msg, message.Image(card.Sketch.CoverURL))
|
||||||
|
msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n"))
|
||||||
|
case 4308:
|
||||||
|
if dynamicCard.Desc.UserProfile.Info.Uname != "" {
|
||||||
|
msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, MsgType[cType], "\n"))
|
||||||
|
}
|
||||||
|
msg = append(msg, message.Image(card.LivePlayInfo.Cover))
|
||||||
|
msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n",
|
||||||
|
"房间号: ", card.LivePlayInfo.RoomID, "\n",
|
||||||
|
"分区: ", card.LivePlayInfo.ParentAreaName))
|
||||||
|
if card.LivePlayInfo.ParentAreaName != card.LivePlayInfo.AreaName {
|
||||||
|
msg = append(msg, message.Text("-", card.LivePlayInfo.AreaName))
|
||||||
|
}
|
||||||
|
if card.LivePlayInfo.LiveStatus == 0 {
|
||||||
|
msg = append(msg, message.Text("未开播 \n"))
|
||||||
|
} else {
|
||||||
|
msg = append(msg, message.Text("直播中 ", card.LivePlayInfo.WatchedShow, "\n"))
|
||||||
|
}
|
||||||
|
msg = append(msg, message.Text("直播链接: ", card.LivePlayInfo.Link))
|
||||||
|
default:
|
||||||
|
msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n"))
|
||||||
|
}
|
||||||
|
if dynamicCard.Desc.DynamicIDStr != "" {
|
||||||
|
msg = append(msg, message.Text("动态链接: ", bz.TURL, dynamicCard.Desc.DynamicIDStr))
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// dynamicDetail 用动态id查动态信息
|
// dynamicDetail 用动态id查动态信息
|
||||||
func dynamicDetail(dynamicIDStr string) (msg []message.MessageSegment, err error) {
|
func dynamicDetail(dynamicIDStr string) (msg []message.MessageSegment, err error) {
|
||||||
var data []byte
|
dyc, err := bz.GetDynamicDetail(dynamicIDStr)
|
||||||
data, err = web.GetData(fmt.Sprintf(dynamicDetailURL, dynamicIDStr))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return dynamicCard2msg(gjson.ParseBytes(data).Get("data.card").Raw, 0)
|
return dynamicCard2msg(&dyc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// articleCard2msg 专栏转消息
|
// articleCard2msg 专栏转消息
|
||||||
func articleCard2msg(card Card, defaultID string) (msg []message.MessageSegment) {
|
func articleCard2msg(card bz.Card, defaultID string) (msg []message.MessageSegment) {
|
||||||
msg = make([]message.MessageSegment, 0, 16)
|
msg = make([]message.MessageSegment, 0, 16)
|
||||||
for i := 0; i < len(card.OriginImageUrls); i++ {
|
for i := 0; i < len(card.OriginImageUrls); i++ {
|
||||||
msg = append(msg, message.Image(card.OriginImageUrls[i]))
|
msg = append(msg, message.Image(card.OriginImageUrls[i]))
|
||||||
}
|
}
|
||||||
msg = append(msg, message.Text("\n", card.Title, "\n", "UP主: ", card.AuthorName, "\n",
|
msg = append(msg, message.Text("\n", card.Title, "\n", "UP主: ", card.AuthorName, "\n",
|
||||||
"阅读: ", humanNum(card.Stats.View), " 评论: ", humanNum(card.Stats.Reply), "\n",
|
"阅读: ", bz.HumanNum(card.Stats.View), " 评论: ", bz.HumanNum(card.Stats.Reply), "\n",
|
||||||
cvURL, defaultID))
|
bz.CVURL, defaultID))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// liveCard2msg 直播卡片转消息
|
// liveCard2msg 直播卡片转消息
|
||||||
func liveCard2msg(card roomCard) (msg []message.MessageSegment) {
|
func liveCard2msg(card bz.RoomCard) (msg []message.MessageSegment) {
|
||||||
msg = make([]message.MessageSegment, 0, 16)
|
msg = make([]message.MessageSegment, 0, 16)
|
||||||
msg = append(msg, message.Image(card.RoomInfo.Keyframe))
|
msg = append(msg, message.Image(card.RoomInfo.Keyframe))
|
||||||
msg = append(msg, message.Text("\n", card.RoomInfo.Title, "\n",
|
msg = append(msg, message.Text("\n", card.RoomInfo.Title, "\n",
|
||||||
@ -197,37 +290,37 @@ func liveCard2msg(card roomCard) (msg []message.MessageSegment) {
|
|||||||
if card.RoomInfo.LiveStatus == 0 {
|
if card.RoomInfo.LiveStatus == 0 {
|
||||||
msg = append(msg, message.Text("未开播 \n"))
|
msg = append(msg, message.Text("未开播 \n"))
|
||||||
} else {
|
} else {
|
||||||
msg = append(msg, message.Text("直播中 ", humanNum(card.RoomInfo.Online), "人气\n"))
|
msg = append(msg, message.Text("直播中 ", bz.HumanNum(card.RoomInfo.Online), "人气\n"))
|
||||||
}
|
}
|
||||||
if card.RoomInfo.ShortID != 0 {
|
if card.RoomInfo.ShortID != 0 {
|
||||||
msg = append(msg, message.Text("直播间链接: ", lURL, card.RoomInfo.ShortID))
|
msg = append(msg, message.Text("直播间链接: ", bz.LURL, card.RoomInfo.ShortID))
|
||||||
} else {
|
} else {
|
||||||
msg = append(msg, message.Text("直播间链接: ", lURL, card.RoomInfo.RoomID))
|
msg = append(msg, message.Text("直播间链接: ", bz.LURL, card.RoomInfo.RoomID))
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// videoCard2msg 视频卡片转消息
|
// videoCard2msg 视频卡片转消息
|
||||||
func videoCard2msg(card Card) (msg []message.MessageSegment, err error) {
|
func videoCard2msg(card bz.Card) (msg []message.MessageSegment, err error) {
|
||||||
var mCard memberCard
|
var mCard bz.MemberCard
|
||||||
msg = make([]message.MessageSegment, 0, 16)
|
msg = make([]message.MessageSegment, 0, 16)
|
||||||
mCard, err = getMemberCard(card.Owner.Mid)
|
mCard, err = bz.GetMemberCard(card.Owner.Mid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
msg = append(msg, message.Text("标题: ", card.Title, "\n"))
|
msg = append(msg, message.Text("标题: ", card.Title, "\n"))
|
||||||
if card.Rights.IsCooperation == 1 {
|
if card.Rights.IsCooperation == 1 {
|
||||||
for i := 0; i < len(card.Staff); i++ {
|
for i := 0; i < len(card.Staff); i++ {
|
||||||
msg = append(msg, message.Text(card.Staff[i].Title, ": ", card.Staff[i].Name, " 粉丝: ", humanNum(card.Staff[i].Follower), "\n"))
|
msg = append(msg, message.Text(card.Staff[i].Title, ": ", card.Staff[i].Name, " 粉丝: ", bz.HumanNum(card.Staff[i].Follower), "\n"))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
msg = append(msg, message.Text("UP主: ", card.Owner.Name, " 粉丝: ", humanNum(mCard.Fans), "\n"))
|
msg = append(msg, message.Text("UP主: ", card.Owner.Name, " 粉丝: ", bz.HumanNum(mCard.Fans), "\n"))
|
||||||
}
|
}
|
||||||
msg = append(msg, message.Text("播放: ", humanNum(card.Stat.View), " 弹幕: ", humanNum(card.Stat.Danmaku)))
|
msg = append(msg, message.Text("播放: ", bz.HumanNum(card.Stat.View), " 弹幕: ", bz.HumanNum(card.Stat.Danmaku)))
|
||||||
msg = append(msg, message.Image(card.Pic))
|
msg = append(msg, message.Image(card.Pic))
|
||||||
msg = append(msg, message.Text("\n点赞: ", humanNum(card.Stat.Like), " 投币: ", humanNum(card.Stat.Coin), "\n",
|
msg = append(msg, message.Text("\n点赞: ", bz.HumanNum(card.Stat.Like), " 投币: ", bz.HumanNum(card.Stat.Coin), "\n",
|
||||||
"收藏: ", humanNum(card.Stat.Favorite), " 分享: ", humanNum(card.Stat.Share), "\n",
|
"收藏: ", bz.HumanNum(card.Stat.Favorite), " 分享: ", bz.HumanNum(card.Stat.Share), "\n",
|
||||||
vURL, card.BvID))
|
bz.VURL, card.BvID))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,10 +2,12 @@ package bilibili
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
bz "github.com/FloatTech/AnimeAPI/bilibili"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestArticleInfo(t *testing.T) {
|
func TestArticleInfo(t *testing.T) {
|
||||||
card, err := getArticleInfo("17279244")
|
card, err := bz.GetArticleInfo("17279244")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -43,7 +45,7 @@ func TestDynamicDetail(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMemberCard(t *testing.T) {
|
func TestMemberCard(t *testing.T) {
|
||||||
card, err := getMemberCard(2)
|
card, err := bz.GetMemberCard(2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -51,22 +53,22 @@ func TestMemberCard(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestVideoInfo(t *testing.T) {
|
func TestVideoInfo(t *testing.T) {
|
||||||
card, err := getVideoInfo("10007")
|
card, err := bz.GetVideoInfo("10007")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(videoCard2msg(card))
|
t.Log(videoCard2msg(card))
|
||||||
card, err = getVideoInfo("BV1xx411c7mD")
|
card, err = bz.GetVideoInfo("BV1xx411c7mD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(videoCard2msg(card))
|
t.Log(videoCard2msg(card))
|
||||||
card, err = getVideoInfo("bv1xx411c7mD")
|
card, err = bz.GetVideoInfo("bv1xx411c7mD")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(videoCard2msg(card))
|
t.Log(videoCard2msg(card))
|
||||||
card, err = getVideoInfo("BV1mF411j7iU")
|
card, err = bz.GetVideoInfo("BV1mF411j7iU")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -74,7 +76,7 @@ func TestVideoInfo(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLiveRoomInfo(t *testing.T) {
|
func TestLiveRoomInfo(t *testing.T) {
|
||||||
card, err := getLiveRoomInfo("83171")
|
card, err := bz.GetLiveRoomInfo("83171")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,331 +0,0 @@
|
|||||||
package bilibili
|
|
||||||
|
|
||||||
const (
|
|
||||||
// tURL bilibili动态前缀
|
|
||||||
tURL = "https://t.bilibili.com/"
|
|
||||||
// liveURL bilibili直播前缀
|
|
||||||
liveURL = "https://live.bilibili.com/"
|
|
||||||
// dynamicDetailURL 当前动态信息,一个card
|
|
||||||
dynamicDetailURL = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=%v"
|
|
||||||
// memberCardURL 个人信息
|
|
||||||
memberCardURL = "https://account.bilibili.com/api/member/getCardByMid?mid=%v"
|
|
||||||
// articleInfoURL 查看专栏信息
|
|
||||||
articleInfoURL = "https://api.bilibili.com/x/article/viewinfo?id=%v"
|
|
||||||
// cvURL b站专栏前缀
|
|
||||||
cvURL = "https://www.bilibili.com/read/cv"
|
|
||||||
// liveRoomInfoURL 查看直播间信息
|
|
||||||
liveRoomInfoURL = "https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=%v"
|
|
||||||
// lURL b站直播间前缀
|
|
||||||
lURL = "https://live.bilibili.com/"
|
|
||||||
// videoInfoURL 查看视频信息
|
|
||||||
videoInfoURL = "https://api.bilibili.com/x/web-interface/view?aid=%v&bvid=%v"
|
|
||||||
// vURL 视频网址前缀
|
|
||||||
vURL = "https://www.bilibili.com/video/"
|
|
||||||
// searchUserURL 查找b站用户
|
|
||||||
searchUserURL = "http://api.bilibili.com/x/web-interface/search/type?search_type=bili_user&keyword=%v"
|
|
||||||
// vtbDetailURL 查找vtb信息
|
|
||||||
vtbDetailURL = "https://api.vtbs.moe/v1/detail/%v"
|
|
||||||
// medalwallURL 查找牌子
|
|
||||||
medalwallURL = "https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall?target_id=%v"
|
|
||||||
// spaceHistoryURL 历史动态信息,一共12个card
|
|
||||||
spaceHistoryURL = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?host_uid=%v&offset_dynamic_id=%v&need_top=0"
|
|
||||||
// liveListURL 获得直播状态
|
|
||||||
liveListURL = "https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids"
|
|
||||||
// danmakuAPI 弹幕网获得用户弹幕api
|
|
||||||
danmakuAPI = "https://danmaku.suki.club/api/search/user/detail?uid=%v&pagenum=%v&pagesize=5"
|
|
||||||
// danmakuURL 弹幕网链接
|
|
||||||
danmakuURL = "https://danmaku.suki.club/user/%v"
|
|
||||||
)
|
|
||||||
|
|
||||||
// dynamicCard 总动态结构体,包括desc,card
|
|
||||||
type dynamicCard struct {
|
|
||||||
Desc Desc `json:"desc"`
|
|
||||||
Card string `json:"card"`
|
|
||||||
Extension struct {
|
|
||||||
VoteCfg struct {
|
|
||||||
VoteID int `json:"vote_id"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
JoinNum int `json:"join_num"`
|
|
||||||
} `json:"vote_cfg"`
|
|
||||||
Vote string `json:"vote"`
|
|
||||||
} `json:"extension"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Card 卡片结构体
|
|
||||||
type Card struct {
|
|
||||||
Item struct {
|
|
||||||
Content string `json:"content"`
|
|
||||||
UploadTime int `json:"upload_time"`
|
|
||||||
Description string `json:"description"`
|
|
||||||
Pictures []struct {
|
|
||||||
ImgSrc string `json:"img_src"`
|
|
||||||
} `json:"pictures"`
|
|
||||||
Timestamp int `json:"timestamp"`
|
|
||||||
Cover struct {
|
|
||||||
Default string `json:"default"`
|
|
||||||
} `json:"cover"`
|
|
||||||
OrigType int `json:"orig_type"`
|
|
||||||
} `json:"item"`
|
|
||||||
AID interface{} `json:"aid"`
|
|
||||||
BvID interface{} `json:"bvid"`
|
|
||||||
Dynamic interface{} `json:"dynamic"`
|
|
||||||
Pic string `json:"pic"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
ID int `json:"id"`
|
|
||||||
Summary string `json:"summary"`
|
|
||||||
ImageUrls []string `json:"image_urls"`
|
|
||||||
OriginImageUrls []string `json:"origin_image_urls"`
|
|
||||||
Sketch struct {
|
|
||||||
Title string `json:"title"`
|
|
||||||
DescText string `json:"desc_text"`
|
|
||||||
CoverURL string `json:"cover_url"`
|
|
||||||
TargetURL string `json:"target_url"`
|
|
||||||
} `json:"sketch"`
|
|
||||||
Stat struct {
|
|
||||||
Aid int `json:"aid"`
|
|
||||||
View int `json:"view"`
|
|
||||||
Danmaku int `json:"danmaku"`
|
|
||||||
Reply int `json:"reply"`
|
|
||||||
Favorite int `json:"favorite"`
|
|
||||||
Coin int `json:"coin"`
|
|
||||||
Share int `json:"share"`
|
|
||||||
Like int `json:"like"`
|
|
||||||
} `json:"stat"`
|
|
||||||
Stats struct {
|
|
||||||
Aid int `json:"aid"`
|
|
||||||
View int `json:"view"`
|
|
||||||
Danmaku int `json:"danmaku"`
|
|
||||||
Reply int `json:"reply"`
|
|
||||||
Favorite int `json:"favorite"`
|
|
||||||
Coin int `json:"coin"`
|
|
||||||
Share int `json:"share"`
|
|
||||||
Like int `json:"like"`
|
|
||||||
} `json:"stats"`
|
|
||||||
Owner struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Pubdate int `json:"pubdate"`
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
} `json:"owner"`
|
|
||||||
Cover string `json:"cover"`
|
|
||||||
ShortID interface{} `json:"short_id"`
|
|
||||||
LivePlayInfo struct {
|
|
||||||
ParentAreaName string `json:"parent_area_name"`
|
|
||||||
AreaName string `json:"area_name"`
|
|
||||||
Cover string `json:"cover"`
|
|
||||||
Link string `json:"link"`
|
|
||||||
Online int `json:"online"`
|
|
||||||
RoomID int `json:"room_id"`
|
|
||||||
LiveStatus int `json:"live_status"`
|
|
||||||
WatchedShow string `json:"watched_show"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
} `json:"live_play_info"`
|
|
||||||
Intro string `json:"intro"`
|
|
||||||
Schema string `json:"schema"`
|
|
||||||
Author interface{} `json:"author"`
|
|
||||||
AuthorName string `json:"author_name"`
|
|
||||||
PlayCnt int `json:"play_cnt"`
|
|
||||||
ReplyCnt int `json:"reply_cnt"`
|
|
||||||
TypeInfo string `json:"type_info"`
|
|
||||||
User struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
} `json:"user"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
ShareSubtitle string `json:"share_subtitle"`
|
|
||||||
ShortLink string `json:"short_link"`
|
|
||||||
PublishTime int `json:"publish_time"`
|
|
||||||
BannerURL string `json:"banner_url"`
|
|
||||||
Ctime int `json:"ctime"`
|
|
||||||
Vest struct {
|
|
||||||
Content string `json:"content"`
|
|
||||||
} `json:"vest"`
|
|
||||||
Upper string `json:"upper"`
|
|
||||||
Origin string `json:"origin"`
|
|
||||||
Pubdate int `json:"pubdate"`
|
|
||||||
Rights struct {
|
|
||||||
IsCooperation int `json:"is_cooperation"`
|
|
||||||
} `json:"rights"`
|
|
||||||
Staff []struct {
|
|
||||||
Title string `json:"title"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Follower int `json:"follower"`
|
|
||||||
} `json:"staff"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Desc 描述结构体
|
|
||||||
type Desc struct {
|
|
||||||
Type int `json:"type"`
|
|
||||||
DynamicIDStr string `json:"dynamic_id_str"`
|
|
||||||
OrigType int `json:"orig_type"`
|
|
||||||
Timestamp int `json:"timestamp"`
|
|
||||||
Origin struct {
|
|
||||||
DynamicIDStr string `json:"dynamic_id_str"`
|
|
||||||
} `json:"origin"`
|
|
||||||
UserProfile struct {
|
|
||||||
Info struct {
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
} `json:"info"`
|
|
||||||
} `json:"user_profile"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vote 投票结构体
|
|
||||||
type Vote struct {
|
|
||||||
ChoiceCnt int `json:"choice_cnt"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
Endtime int `json:"endtime"`
|
|
||||||
JoinNum int `json:"join_num"`
|
|
||||||
Options []struct {
|
|
||||||
Idx int `json:"idx"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
ImgURL string `json:"img_url"`
|
|
||||||
} `json:"options"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// memberCard 个人信息卡片
|
|
||||||
type memberCard struct {
|
|
||||||
Mid string `json:"mid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Sex string `json:"sex"`
|
|
||||||
Face string `json:"face"`
|
|
||||||
Coins float64 `json:"coins"`
|
|
||||||
Regtime int64 `json:"regtime"`
|
|
||||||
Birthday string `json:"birthday"`
|
|
||||||
Sign string `json:"sign"`
|
|
||||||
Attentions []int64 `json:"attentions"`
|
|
||||||
Fans int `json:"fans"`
|
|
||||||
Friend int `json:"friend"`
|
|
||||||
Attention int `json:"attention"`
|
|
||||||
LevelInfo struct {
|
|
||||||
CurrentLevel int `json:"current_level"`
|
|
||||||
} `json:"level_info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// roomCard 直播间卡片
|
|
||||||
type roomCard struct {
|
|
||||||
RoomInfo struct {
|
|
||||||
RoomID int `json:"room_id"`
|
|
||||||
ShortID int `json:"short_id"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
LiveStatus int `json:"live_status"`
|
|
||||||
AreaName string `json:"area_name"`
|
|
||||||
ParentAreaName string `json:"parent_area_name"`
|
|
||||||
Keyframe string `json:"keyframe"`
|
|
||||||
Online int `json:"online"`
|
|
||||||
} `json:"room_info"`
|
|
||||||
AnchorInfo struct {
|
|
||||||
BaseInfo struct {
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
} `json:"base_info"`
|
|
||||||
} `json:"anchor_info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// searchData 查找b站用户总结构体
|
|
||||||
type searchData struct {
|
|
||||||
Data struct {
|
|
||||||
NumResults int `json:"numResults"`
|
|
||||||
Result []searchResult `json:"result"`
|
|
||||||
} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// searchResult 查找b站用户结果
|
|
||||||
type searchResult struct {
|
|
||||||
Mid int64 `json:"mid"`
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
Gender int64 `json:"gender"`
|
|
||||||
Usign string `json:"usign"`
|
|
||||||
Level int64 `json:"level"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// medalData 牌子接口返回结构体
|
|
||||||
type medalData struct {
|
|
||||||
Code int `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
Data struct {
|
|
||||||
List []medal `json:"list"`
|
|
||||||
} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// medalInfo b站牌子信息
|
|
||||||
type medalInfo struct {
|
|
||||||
Mid int64 `json:"target_id"`
|
|
||||||
MedalName string `json:"medal_name"`
|
|
||||||
Level int64 `json:"level"`
|
|
||||||
MedalColorStart int64 `json:"medal_color_start"`
|
|
||||||
MedalColorEnd int64 `json:"medal_color_end"`
|
|
||||||
MedalColorBorder int64 `json:"medal_color_border"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type medal struct {
|
|
||||||
Uname string `json:"target_name"`
|
|
||||||
medalInfo `json:"medal_info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type medalSlice []medal
|
|
||||||
|
|
||||||
func (m medalSlice) Len() int {
|
|
||||||
return len(m)
|
|
||||||
}
|
|
||||||
func (m medalSlice) Swap(i, j int) {
|
|
||||||
m[i], m[j] = m[j], m[i]
|
|
||||||
}
|
|
||||||
func (m medalSlice) Less(i, j int) bool {
|
|
||||||
return m[i].Level > m[j].Level
|
|
||||||
}
|
|
||||||
|
|
||||||
// vtb信息
|
|
||||||
type vtbDetail struct {
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
Video int `json:"video"`
|
|
||||||
Roomid int `json:"roomid"`
|
|
||||||
Rise int `json:"rise"`
|
|
||||||
Follower int `json:"follower"`
|
|
||||||
GuardNum int `json:"guardNum"`
|
|
||||||
AreaRank int `json:"areaRank"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// danmakusuki 弹幕网结构体
|
|
||||||
type danmakusuki struct {
|
|
||||||
Code int64 `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
Data struct {
|
|
||||||
Data []struct {
|
|
||||||
Channel struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
IsLiving bool `json:"isLiving"`
|
|
||||||
UID int64 `json:"uId"`
|
|
||||||
RoomID int64 `json:"roomId"`
|
|
||||||
FaceURL string `json:"faceUrl"`
|
|
||||||
LiveCount int64 `json:"liveCount"`
|
|
||||||
} `json:"channel"`
|
|
||||||
Live struct {
|
|
||||||
LiveID string `json:"liveId"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
IsFinish bool `json:"isFinish"`
|
|
||||||
CoverURL string `json:"coverUrl"`
|
|
||||||
StartDate int64 `json:"startDate"`
|
|
||||||
StopDate int64 `json:"stopDate"`
|
|
||||||
DanmakusCount int64 `json:"danmakusCount"`
|
|
||||||
TotalIncome float64 `json:"totalIncome"`
|
|
||||||
WatchCount int64 `json:"watchCount"`
|
|
||||||
} `json:"live"`
|
|
||||||
Danmakus []struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Type int64 `json:"type"`
|
|
||||||
UID int64 `json:"uId"`
|
|
||||||
SendDate int64 `json:"sendDate"`
|
|
||||||
Price float64 `json:"price"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
} `json:"danmakus"`
|
|
||||||
} `json:"data"`
|
|
||||||
Total int64 `json:"total"`
|
|
||||||
PageNum int64 `json:"pageNum"`
|
|
||||||
PageSize int64 `json:"pageSize"`
|
|
||||||
HasMore bool `json:"hasMore"`
|
|
||||||
} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 配置结构体
|
|
||||||
type config struct {
|
|
||||||
BilibiliCookie string `json:"bilibili_cookie"`
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
package bilibili
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
// humanNum 格式化人数
|
|
||||||
func humanNum(res int) string {
|
|
||||||
if res/10000 != 0 {
|
|
||||||
return strconv.FormatFloat(float64(res)/10000, 'f', 2, 64) + "万"
|
|
||||||
}
|
|
||||||
return strconv.Itoa(res)
|
|
||||||
}
|
|
||||||
|
|
||||||
// getrealurl 获取跳转后的链接
|
|
||||||
func getrealurl(url string) (realurl string, err error) {
|
|
||||||
data, err := http.Head(url)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_ = data.Body.Close()
|
|
||||||
realurl = data.Request.URL.String()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@ -35,8 +35,8 @@ type epidemic struct {
|
|||||||
type area struct {
|
type area struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Today struct {
|
Today struct {
|
||||||
Confirm int `json:"confirm"`
|
Confirm int `json:"confirm"`
|
||||||
Wzzadd interface{} `json:"wzz_add"`
|
Wzzadd any `json:"wzz_add"`
|
||||||
} `json:"today"`
|
} `json:"today"`
|
||||||
Total struct {
|
Total struct {
|
||||||
NowConfirm int `json:"nowConfirm"`
|
NowConfirm int `json:"nowConfirm"`
|
||||||
|
|||||||
@ -33,102 +33,102 @@ type qrInfo struct {
|
|||||||
} `json:"data"`
|
} `json:"data"`
|
||||||
}
|
}
|
||||||
type topList struct {
|
type topList struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
RelatedVideos interface{} `json:"relatedVideos"`
|
RelatedVideos any `json:"relatedVideos"`
|
||||||
Playlist struct {
|
Playlist struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
CoverImgID int64 `json:"coverImgId"`
|
CoverImgID int64 `json:"coverImgId"`
|
||||||
CoverImgURL string `json:"coverImgUrl"`
|
CoverImgURL string `json:"coverImgUrl"`
|
||||||
CoverImgIDStr string `json:"coverImgId_str"`
|
CoverImgIDStr string `json:"coverImgId_str"`
|
||||||
AdType int `json:"adType"`
|
AdType int `json:"adType"`
|
||||||
UserID int `json:"userId"`
|
UserID int `json:"userId"`
|
||||||
CreateTime int64 `json:"createTime"`
|
CreateTime int64 `json:"createTime"`
|
||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
OpRecommend bool `json:"opRecommend"`
|
OpRecommend bool `json:"opRecommend"`
|
||||||
HighQuality bool `json:"highQuality"`
|
HighQuality bool `json:"highQuality"`
|
||||||
NewImported bool `json:"newImported"`
|
NewImported bool `json:"newImported"`
|
||||||
UpdateTime int64 `json:"updateTime"`
|
UpdateTime int64 `json:"updateTime"`
|
||||||
TrackCount int `json:"trackCount"`
|
TrackCount int `json:"trackCount"`
|
||||||
SpecialType int `json:"specialType"`
|
SpecialType int `json:"specialType"`
|
||||||
Privacy int `json:"privacy"`
|
Privacy int `json:"privacy"`
|
||||||
TrackUpdateTime int64 `json:"trackUpdateTime"`
|
TrackUpdateTime int64 `json:"trackUpdateTime"`
|
||||||
CommentThreadID string `json:"commentThreadId"`
|
CommentThreadID string `json:"commentThreadId"`
|
||||||
PlayCount int `json:"playCount"`
|
PlayCount int `json:"playCount"`
|
||||||
TrackNumberUpdateTime int64 `json:"trackNumberUpdateTime"`
|
TrackNumberUpdateTime int64 `json:"trackNumberUpdateTime"`
|
||||||
SubscribedCount int `json:"subscribedCount"`
|
SubscribedCount int `json:"subscribedCount"`
|
||||||
CloudTrackCount int `json:"cloudTrackCount"`
|
CloudTrackCount int `json:"cloudTrackCount"`
|
||||||
Ordered bool `json:"ordered"`
|
Ordered bool `json:"ordered"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Tags []string `json:"tags"`
|
Tags []string `json:"tags"`
|
||||||
UpdateFrequency interface{} `json:"updateFrequency"`
|
UpdateFrequency any `json:"updateFrequency"`
|
||||||
BackgroundCoverID int `json:"backgroundCoverId"`
|
BackgroundCoverID int `json:"backgroundCoverId"`
|
||||||
BackgroundCoverURL interface{} `json:"backgroundCoverUrl"`
|
BackgroundCoverURL any `json:"backgroundCoverUrl"`
|
||||||
TitleImage int `json:"titleImage"`
|
TitleImage int `json:"titleImage"`
|
||||||
TitleImageURL interface{} `json:"titleImageUrl"`
|
TitleImageURL any `json:"titleImageUrl"`
|
||||||
EnglishTitle interface{} `json:"englishTitle"`
|
EnglishTitle any `json:"englishTitle"`
|
||||||
OfficialPlaylistType interface{} `json:"officialPlaylistType"`
|
OfficialPlaylistType any `json:"officialPlaylistType"`
|
||||||
Subscribers []struct {
|
Subscribers []struct {
|
||||||
DefaultAvatar bool `json:"defaultAvatar"`
|
DefaultAvatar bool `json:"defaultAvatar"`
|
||||||
Province int `json:"province"`
|
Province int `json:"province"`
|
||||||
AuthStatus int `json:"authStatus"`
|
AuthStatus int `json:"authStatus"`
|
||||||
Followed bool `json:"followed"`
|
Followed bool `json:"followed"`
|
||||||
AvatarURL string `json:"avatarUrl"`
|
AvatarURL string `json:"avatarUrl"`
|
||||||
AccountStatus int `json:"accountStatus"`
|
AccountStatus int `json:"accountStatus"`
|
||||||
Gender int `json:"gender"`
|
Gender int `json:"gender"`
|
||||||
City int `json:"city"`
|
City int `json:"city"`
|
||||||
Birthday int `json:"birthday"`
|
Birthday int `json:"birthday"`
|
||||||
UserID int `json:"userId"`
|
UserID int `json:"userId"`
|
||||||
UserType int `json:"userType"`
|
UserType int `json:"userType"`
|
||||||
Nickname string `json:"nickname"`
|
Nickname string `json:"nickname"`
|
||||||
Signature string `json:"signature"`
|
Signature string `json:"signature"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
DetailDescription string `json:"detailDescription"`
|
DetailDescription string `json:"detailDescription"`
|
||||||
AvatarImgID int64 `json:"avatarImgId"`
|
AvatarImgID int64 `json:"avatarImgId"`
|
||||||
BackgroundImgID int64 `json:"backgroundImgId"`
|
BackgroundImgID int64 `json:"backgroundImgId"`
|
||||||
BackgroundURL string `json:"backgroundUrl"`
|
BackgroundURL string `json:"backgroundUrl"`
|
||||||
Authority int `json:"authority"`
|
Authority int `json:"authority"`
|
||||||
Mutual bool `json:"mutual"`
|
Mutual bool `json:"mutual"`
|
||||||
ExpertTags interface{} `json:"expertTags"`
|
ExpertTags any `json:"expertTags"`
|
||||||
Experts interface{} `json:"experts"`
|
Experts any `json:"experts"`
|
||||||
DjStatus int `json:"djStatus"`
|
DjStatus int `json:"djStatus"`
|
||||||
VipType int `json:"vipType"`
|
VipType int `json:"vipType"`
|
||||||
RemarkName interface{} `json:"remarkName"`
|
RemarkName any `json:"remarkName"`
|
||||||
AuthenticationTypes int `json:"authenticationTypes"`
|
AuthenticationTypes int `json:"authenticationTypes"`
|
||||||
AvatarDetail interface{} `json:"avatarDetail"`
|
AvatarDetail any `json:"avatarDetail"`
|
||||||
Anchor bool `json:"anchor"`
|
Anchor bool `json:"anchor"`
|
||||||
BackgroundImgIDStr string `json:"backgroundImgIdStr"`
|
BackgroundImgIDStr string `json:"backgroundImgIdStr"`
|
||||||
AvatarImgIDStr string `json:"avatarImgIdStr"`
|
AvatarImgIDStr string `json:"avatarImgIdStr"`
|
||||||
AvatarImgIDString string `json:"AvatarImgIDString"`
|
AvatarImgIDString string `json:"AvatarImgIDString"`
|
||||||
} `json:"subscribers"`
|
} `json:"subscribers"`
|
||||||
Subscribed interface{} `json:"subscribed"`
|
Subscribed any `json:"subscribed"`
|
||||||
Creator struct {
|
Creator struct {
|
||||||
DefaultAvatar bool `json:"defaultAvatar"`
|
DefaultAvatar bool `json:"defaultAvatar"`
|
||||||
Province int `json:"province"`
|
Province int `json:"province"`
|
||||||
AuthStatus int `json:"authStatus"`
|
AuthStatus int `json:"authStatus"`
|
||||||
Followed bool `json:"followed"`
|
Followed bool `json:"followed"`
|
||||||
AvatarURL string `json:"avatarUrl"`
|
AvatarURL string `json:"avatarUrl"`
|
||||||
AccountStatus int `json:"accountStatus"`
|
AccountStatus int `json:"accountStatus"`
|
||||||
Gender int `json:"gender"`
|
Gender int `json:"gender"`
|
||||||
City int `json:"city"`
|
City int `json:"city"`
|
||||||
Birthday int `json:"birthday"`
|
Birthday int `json:"birthday"`
|
||||||
UserID int `json:"userId"`
|
UserID int `json:"userId"`
|
||||||
UserType int `json:"userType"`
|
UserType int `json:"userType"`
|
||||||
Nickname string `json:"nickname"`
|
Nickname string `json:"nickname"`
|
||||||
Signature string `json:"signature"`
|
Signature string `json:"signature"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
DetailDescription string `json:"detailDescription"`
|
DetailDescription string `json:"detailDescription"`
|
||||||
AvatarImgID int64 `json:"avatarImgId"`
|
AvatarImgID int64 `json:"avatarImgId"`
|
||||||
BackgroundImgID int64 `json:"backgroundImgId"`
|
BackgroundImgID int64 `json:"backgroundImgId"`
|
||||||
BackgroundURL string `json:"backgroundUrl"`
|
BackgroundURL string `json:"backgroundUrl"`
|
||||||
Authority int `json:"authority"`
|
Authority int `json:"authority"`
|
||||||
Mutual bool `json:"mutual"`
|
Mutual bool `json:"mutual"`
|
||||||
ExpertTags interface{} `json:"expertTags"`
|
ExpertTags any `json:"expertTags"`
|
||||||
Experts interface{} `json:"experts"`
|
Experts any `json:"experts"`
|
||||||
DjStatus int `json:"djStatus"`
|
DjStatus int `json:"djStatus"`
|
||||||
VipType int `json:"vipType"`
|
VipType int `json:"vipType"`
|
||||||
RemarkName interface{} `json:"remarkName"`
|
RemarkName any `json:"remarkName"`
|
||||||
AuthenticationTypes int `json:"authenticationTypes"`
|
AuthenticationTypes int `json:"authenticationTypes"`
|
||||||
AvatarDetail struct {
|
AvatarDetail struct {
|
||||||
UserType int `json:"userType"`
|
UserType int `json:"userType"`
|
||||||
IdentityLevel int `json:"identityLevel"`
|
IdentityLevel int `json:"identityLevel"`
|
||||||
@ -145,26 +145,26 @@ type topList struct {
|
|||||||
Pst int `json:"pst"`
|
Pst int `json:"pst"`
|
||||||
T int `json:"t"`
|
T int `json:"t"`
|
||||||
Ar []struct {
|
Ar []struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Tns []interface{} `json:"tns"`
|
Tns []any `json:"tns"`
|
||||||
Alias []interface{} `json:"alias"`
|
Alias []any `json:"alias"`
|
||||||
} `json:"ar"`
|
} `json:"ar"`
|
||||||
Alia []string `json:"alia"`
|
Alia []string `json:"alia"`
|
||||||
Pop int `json:"pop"`
|
Pop int `json:"pop"`
|
||||||
St int `json:"st"`
|
St int `json:"st"`
|
||||||
Rt string `json:"rt"`
|
Rt string `json:"rt"`
|
||||||
Fee int `json:"fee"`
|
Fee int `json:"fee"`
|
||||||
V int `json:"v"`
|
V int `json:"v"`
|
||||||
Crbt interface{} `json:"crbt"`
|
Crbt any `json:"crbt"`
|
||||||
Cf string `json:"cf"`
|
Cf string `json:"cf"`
|
||||||
Al struct {
|
Al struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
PicURL string `json:"picUrl"`
|
PicURL string `json:"picUrl"`
|
||||||
Tns []interface{} `json:"tns"`
|
Tns []any `json:"tns"`
|
||||||
PicStr string `json:"pic_str"`
|
PicStr string `json:"pic_str"`
|
||||||
Pic int64 `json:"pic"`
|
Pic int64 `json:"pic"`
|
||||||
} `json:"al"`
|
} `json:"al"`
|
||||||
Dt int `json:"dt"`
|
Dt int `json:"dt"`
|
||||||
H struct {
|
H struct {
|
||||||
@ -188,101 +188,101 @@ type topList struct {
|
|||||||
Vd float64 `json:"vd"`
|
Vd float64 `json:"vd"`
|
||||||
Sr int `json:"sr"`
|
Sr int `json:"sr"`
|
||||||
} `json:"l"`
|
} `json:"l"`
|
||||||
Sq interface{} `json:"sq"`
|
Sq any `json:"sq"`
|
||||||
Hr interface{} `json:"hr"`
|
Hr any `json:"hr"`
|
||||||
A interface{} `json:"a"`
|
A any `json:"a"`
|
||||||
Cd string `json:"cd"`
|
Cd string `json:"cd"`
|
||||||
No int `json:"no"`
|
No int `json:"no"`
|
||||||
RtURL interface{} `json:"rtUrl"`
|
RtURL any `json:"rtUrl"`
|
||||||
Ftype int `json:"ftype"`
|
Ftype int `json:"ftype"`
|
||||||
RtUrls []interface{} `json:"rtUrls"`
|
RtUrls []any `json:"rtUrls"`
|
||||||
DjID int `json:"djId"`
|
DjID int `json:"djId"`
|
||||||
Copyright int `json:"copyright"`
|
Copyright int `json:"copyright"`
|
||||||
SID int `json:"s_id"`
|
SID int `json:"s_id"`
|
||||||
Mark int `json:"mark"`
|
Mark int `json:"mark"`
|
||||||
OriginCoverType int `json:"originCoverType"`
|
OriginCoverType int `json:"originCoverType"`
|
||||||
OriginSongSimpleData interface{} `json:"originSongSimpleData"`
|
OriginSongSimpleData any `json:"originSongSimpleData"`
|
||||||
TagPicList interface{} `json:"tagPicList"`
|
TagPicList any `json:"tagPicList"`
|
||||||
ResourceState bool `json:"resourceState"`
|
ResourceState bool `json:"resourceState"`
|
||||||
Version int `json:"version"`
|
Version int `json:"version"`
|
||||||
SongJumpInfo interface{} `json:"songJumpInfo"`
|
SongJumpInfo any `json:"songJumpInfo"`
|
||||||
EntertainmentTags interface{} `json:"entertainmentTags"`
|
EntertainmentTags any `json:"entertainmentTags"`
|
||||||
Single int `json:"single"`
|
Single int `json:"single"`
|
||||||
NoCopyrightRcmd interface{} `json:"noCopyrightRcmd"`
|
NoCopyrightRcmd any `json:"noCopyrightRcmd"`
|
||||||
Alg interface{} `json:"alg"`
|
Alg any `json:"alg"`
|
||||||
Rtype int `json:"rtype"`
|
Rtype int `json:"rtype"`
|
||||||
Rurl interface{} `json:"rurl"`
|
Rurl any `json:"rurl"`
|
||||||
Mst int `json:"mst"`
|
Mst int `json:"mst"`
|
||||||
Cp int `json:"cp"`
|
Cp int `json:"cp"`
|
||||||
Mv int `json:"mv"`
|
Mv int `json:"mv"`
|
||||||
PublishTime int64 `json:"publishTime"`
|
PublishTime int64 `json:"publishTime"`
|
||||||
Tns []string `json:"tns,omitempty"`
|
Tns []string `json:"tns,omitempty"`
|
||||||
} `json:"tracks"`
|
} `json:"tracks"`
|
||||||
VideoIds interface{} `json:"videoIds"`
|
VideoIds any `json:"videoIds"`
|
||||||
Videos interface{} `json:"videos"`
|
Videos any `json:"videos"`
|
||||||
TrackIds []struct {
|
TrackIds []struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
V int `json:"v"`
|
V int `json:"v"`
|
||||||
T int `json:"t"`
|
T int `json:"t"`
|
||||||
At int64 `json:"at"`
|
At int64 `json:"at"`
|
||||||
Alg interface{} `json:"alg"`
|
Alg any `json:"alg"`
|
||||||
UID int `json:"uid"`
|
UID int `json:"uid"`
|
||||||
RcmdReason string `json:"rcmdReason"`
|
RcmdReason string `json:"rcmdReason"`
|
||||||
Sc interface{} `json:"sc"`
|
Sc any `json:"sc"`
|
||||||
Lr int `json:"lr,omitempty"`
|
Lr int `json:"lr,omitempty"`
|
||||||
} `json:"trackIds"`
|
} `json:"trackIds"`
|
||||||
ShareCount int `json:"shareCount"`
|
ShareCount int `json:"shareCount"`
|
||||||
CommentCount int `json:"commentCount"`
|
CommentCount int `json:"commentCount"`
|
||||||
RemixVideo interface{} `json:"remixVideo"`
|
RemixVideo any `json:"remixVideo"`
|
||||||
SharedUsers interface{} `json:"sharedUsers"`
|
SharedUsers any `json:"sharedUsers"`
|
||||||
HistorySharedUsers interface{} `json:"historySharedUsers"`
|
HistorySharedUsers any `json:"historySharedUsers"`
|
||||||
GradeStatus string `json:"gradeStatus"`
|
GradeStatus string `json:"gradeStatus"`
|
||||||
Score interface{} `json:"score"`
|
Score any `json:"score"`
|
||||||
AlgTags interface{} `json:"algTags"`
|
AlgTags any `json:"algTags"`
|
||||||
} `json:"playlist"`
|
} `json:"playlist"`
|
||||||
Urls interface{} `json:"urls"`
|
Urls any `json:"urls"`
|
||||||
Privileges []struct {
|
Privileges []struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
Fee int `json:"fee"`
|
Fee int `json:"fee"`
|
||||||
Payed int `json:"payed"`
|
Payed int `json:"payed"`
|
||||||
RealPayed int `json:"realPayed"`
|
RealPayed int `json:"realPayed"`
|
||||||
St int `json:"st"`
|
St int `json:"st"`
|
||||||
Pl int `json:"pl"`
|
Pl int `json:"pl"`
|
||||||
Dl int `json:"dl"`
|
Dl int `json:"dl"`
|
||||||
Sp int `json:"sp"`
|
Sp int `json:"sp"`
|
||||||
Cp int `json:"cp"`
|
Cp int `json:"cp"`
|
||||||
Subp int `json:"subp"`
|
Subp int `json:"subp"`
|
||||||
Cs bool `json:"cs"`
|
Cs bool `json:"cs"`
|
||||||
Maxbr int `json:"maxbr"`
|
Maxbr int `json:"maxbr"`
|
||||||
Fl int `json:"fl"`
|
Fl int `json:"fl"`
|
||||||
Pc interface{} `json:"pc"`
|
Pc any `json:"pc"`
|
||||||
Toast bool `json:"toast"`
|
Toast bool `json:"toast"`
|
||||||
Flag int `json:"flag"`
|
Flag int `json:"flag"`
|
||||||
PaidBigBang bool `json:"paidBigBang"`
|
PaidBigBang bool `json:"paidBigBang"`
|
||||||
PreSell bool `json:"preSell"`
|
PreSell bool `json:"preSell"`
|
||||||
PlayMaxbr int `json:"playMaxbr"`
|
PlayMaxbr int `json:"playMaxbr"`
|
||||||
DownloadMaxbr int `json:"downloadMaxbr"`
|
DownloadMaxbr int `json:"downloadMaxbr"`
|
||||||
MaxBrLevel string `json:"maxBrLevel"`
|
MaxBrLevel string `json:"maxBrLevel"`
|
||||||
PlayMaxBrLevel string `json:"playMaxBrLevel"`
|
PlayMaxBrLevel string `json:"playMaxBrLevel"`
|
||||||
DownloadMaxBrLevel string `json:"downloadMaxBrLevel"`
|
DownloadMaxBrLevel string `json:"downloadMaxBrLevel"`
|
||||||
PlLevel string `json:"plLevel"`
|
PlLevel string `json:"plLevel"`
|
||||||
DlLevel string `json:"dlLevel"`
|
DlLevel string `json:"dlLevel"`
|
||||||
FlLevel string `json:"flLevel"`
|
FlLevel string `json:"flLevel"`
|
||||||
Rscl int `json:"rscl"`
|
Rscl int `json:"rscl"`
|
||||||
FreeTrialPrivilege struct {
|
FreeTrialPrivilege struct {
|
||||||
ResConsumable bool `json:"resConsumable"`
|
ResConsumable bool `json:"resConsumable"`
|
||||||
UserConsumable bool `json:"userConsumable"`
|
UserConsumable bool `json:"userConsumable"`
|
||||||
ListenType interface{} `json:"listenType"`
|
ListenType any `json:"listenType"`
|
||||||
} `json:"freeTrialPrivilege"`
|
} `json:"freeTrialPrivilege"`
|
||||||
ChargeInfoList []struct {
|
ChargeInfoList []struct {
|
||||||
Rate int `json:"rate"`
|
Rate int `json:"rate"`
|
||||||
ChargeURL interface{} `json:"chargeUrl"`
|
ChargeURL any `json:"chargeUrl"`
|
||||||
ChargeMessage interface{} `json:"chargeMessage"`
|
ChargeMessage any `json:"chargeMessage"`
|
||||||
ChargeType int `json:"chargeType"`
|
ChargeType int `json:"chargeType"`
|
||||||
} `json:"chargeInfoList"`
|
} `json:"chargeInfoList"`
|
||||||
} `json:"privileges"`
|
} `json:"privileges"`
|
||||||
SharedPrivilege interface{} `json:"sharedPrivilege"`
|
SharedPrivilege any `json:"sharedPrivilege"`
|
||||||
ResEntrance interface{} `json:"resEntrance"`
|
ResEntrance any `json:"resEntrance"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type topMusicInfo struct {
|
type topMusicInfo struct {
|
||||||
@ -292,26 +292,26 @@ type topMusicInfo struct {
|
|||||||
Pst int `json:"pst"`
|
Pst int `json:"pst"`
|
||||||
T int `json:"t"`
|
T int `json:"t"`
|
||||||
Ar []struct {
|
Ar []struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Tns []interface{} `json:"tns"`
|
Tns []any `json:"tns"`
|
||||||
Alias []interface{} `json:"alias"`
|
Alias []any `json:"alias"`
|
||||||
} `json:"ar"`
|
} `json:"ar"`
|
||||||
Alia []string `json:"alia"`
|
Alia []string `json:"alia"`
|
||||||
Pop int `json:"pop"`
|
Pop int `json:"pop"`
|
||||||
St int `json:"st"`
|
St int `json:"st"`
|
||||||
Rt string `json:"rt"`
|
Rt string `json:"rt"`
|
||||||
Fee int `json:"fee"`
|
Fee int `json:"fee"`
|
||||||
V int `json:"v"`
|
V int `json:"v"`
|
||||||
Crbt interface{} `json:"crbt"`
|
Crbt any `json:"crbt"`
|
||||||
Cf string `json:"cf"`
|
Cf string `json:"cf"`
|
||||||
Al struct {
|
Al struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
PicURL string `json:"picUrl"`
|
PicURL string `json:"picUrl"`
|
||||||
Tns []interface{} `json:"tns"`
|
Tns []any `json:"tns"`
|
||||||
PicStr string `json:"pic_str"`
|
PicStr string `json:"pic_str"`
|
||||||
Pic int64 `json:"pic"`
|
Pic int64 `json:"pic"`
|
||||||
} `json:"al"`
|
} `json:"al"`
|
||||||
Dt int `json:"dt"`
|
Dt int `json:"dt"`
|
||||||
H struct {
|
H struct {
|
||||||
@ -335,35 +335,35 @@ type topMusicInfo struct {
|
|||||||
Vd float32 `json:"vd"`
|
Vd float32 `json:"vd"`
|
||||||
Sr int `json:"sr"`
|
Sr int `json:"sr"`
|
||||||
} `json:"l"`
|
} `json:"l"`
|
||||||
Sq interface{} `json:"sq"`
|
Sq any `json:"sq"`
|
||||||
Hr interface{} `json:"hr"`
|
Hr any `json:"hr"`
|
||||||
A interface{} `json:"a"`
|
A any `json:"a"`
|
||||||
Cd string `json:"cd"`
|
Cd string `json:"cd"`
|
||||||
No int `json:"no"`
|
No int `json:"no"`
|
||||||
RtURL interface{} `json:"rtUrl"`
|
RtURL any `json:"rtUrl"`
|
||||||
Ftype int `json:"ftype"`
|
Ftype int `json:"ftype"`
|
||||||
RtUrls []interface{} `json:"rtUrls"`
|
RtUrls []any `json:"rtUrls"`
|
||||||
DjID int `json:"djId"`
|
DjID int `json:"djId"`
|
||||||
Copyright int `json:"copyright"`
|
Copyright int `json:"copyright"`
|
||||||
SID int `json:"s_id"`
|
SID int `json:"s_id"`
|
||||||
Mark int `json:"mark"`
|
Mark int `json:"mark"`
|
||||||
OriginCoverType int `json:"originCoverType"`
|
OriginCoverType int `json:"originCoverType"`
|
||||||
OriginSongSimpleData interface{} `json:"originSongSimpleData"`
|
OriginSongSimpleData any `json:"originSongSimpleData"`
|
||||||
TagPicList interface{} `json:"tagPicList"`
|
TagPicList any `json:"tagPicList"`
|
||||||
ResourceState bool `json:"resourceState"`
|
ResourceState bool `json:"resourceState"`
|
||||||
Version int `json:"version"`
|
Version int `json:"version"`
|
||||||
SongJumpInfo interface{} `json:"songJumpInfo"`
|
SongJumpInfo any `json:"songJumpInfo"`
|
||||||
EntertainmentTags interface{} `json:"entertainmentTags"`
|
EntertainmentTags any `json:"entertainmentTags"`
|
||||||
AwardTags interface{} `json:"awardTags"`
|
AwardTags any `json:"awardTags"`
|
||||||
Single int `json:"single"`
|
Single int `json:"single"`
|
||||||
NoCopyrightRcmd interface{} `json:"noCopyrightRcmd"`
|
NoCopyrightRcmd any `json:"noCopyrightRcmd"`
|
||||||
Rtype int `json:"rtype"`
|
Rtype int `json:"rtype"`
|
||||||
Rurl interface{} `json:"rurl"`
|
Rurl any `json:"rurl"`
|
||||||
Mst int `json:"mst"`
|
Mst int `json:"mst"`
|
||||||
Cp int `json:"cp"`
|
Cp int `json:"cp"`
|
||||||
Mv int `json:"mv"`
|
Mv int `json:"mv"`
|
||||||
PublishTime int64 `json:"publishTime"`
|
PublishTime int64 `json:"publishTime"`
|
||||||
Tns []string `json:"tns,omitempty"`
|
Tns []string `json:"tns,omitempty"`
|
||||||
} `json:"songs"`
|
} `json:"songs"`
|
||||||
Privileges []struct {
|
Privileges []struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
@ -391,15 +391,15 @@ type topMusicInfo struct {
|
|||||||
FlLevel string `json:"flLevel"`
|
FlLevel string `json:"flLevel"`
|
||||||
Rscl int `json:"rscl"`
|
Rscl int `json:"rscl"`
|
||||||
FreeTrialPrivilege struct {
|
FreeTrialPrivilege struct {
|
||||||
ResConsumable bool `json:"resConsumable"`
|
ResConsumable bool `json:"resConsumable"`
|
||||||
UserConsumable bool `json:"userConsumable"`
|
UserConsumable bool `json:"userConsumable"`
|
||||||
ListenType interface{} `json:"listenType"`
|
ListenType any `json:"listenType"`
|
||||||
} `json:"freeTrialPrivilege"`
|
} `json:"freeTrialPrivilege"`
|
||||||
ChargeInfoList []struct {
|
ChargeInfoList []struct {
|
||||||
Rate int `json:"rate"`
|
Rate int `json:"rate"`
|
||||||
ChargeURL interface{} `json:"chargeUrl"`
|
ChargeURL any `json:"chargeUrl"`
|
||||||
ChargeMessage interface{} `json:"chargeMessage"`
|
ChargeMessage any `json:"chargeMessage"`
|
||||||
ChargeType int `json:"chargeType"`
|
ChargeType int `json:"chargeType"`
|
||||||
} `json:"chargeInfoList"`
|
} `json:"chargeInfoList"`
|
||||||
} `json:"privileges"`
|
} `json:"privileges"`
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
|
|||||||
@ -83,7 +83,7 @@ func (sdb *scoredb) InsertOrUpdateScoreByUID(uid int64, score int) (err error) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = db.Model(&scoretable{}).Where("uid = ? ", uid).Update(
|
err = db.Model(&scoretable{}).Where("uid = ? ", uid).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"score": score,
|
"score": score,
|
||||||
}).Error
|
}).Error
|
||||||
}
|
}
|
||||||
@ -111,7 +111,7 @@ func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err er
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = db.Model(&signintable{}).Where("uid = ? ", uid).Update(
|
err = db.Model(&signintable{}).Where("uid = ? ", uid).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"count": count,
|
"count": count,
|
||||||
}).Error
|
}).Error
|
||||||
}
|
}
|
||||||
|
|||||||
@ -77,7 +77,7 @@ func (sdb *sleepdb) sleep(gid, uid int64) (position int, awakeTime time.Duration
|
|||||||
log.Debugln("sleeptime为", st)
|
log.Debugln("sleeptime为", st)
|
||||||
awakeTime = now.Sub(st.SleepTime)
|
awakeTime = now.Sub(st.SleepTime)
|
||||||
db.Model(&SleepManage{}).Where("group_id = ? and user_id = ?", gid, uid).Update(
|
db.Model(&SleepManage{}).Where("group_id = ? and user_id = ?", gid, uid).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"sleep_time": now,
|
"sleep_time": now,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ func (sdb *sleepdb) getUp(gid, uid int64) (position int, sleepTime time.Duration
|
|||||||
log.Debugln("sleeptime为", st)
|
log.Debugln("sleeptime为", st)
|
||||||
sleepTime = now.Sub(st.SleepTime)
|
sleepTime = now.Sub(st.SleepTime)
|
||||||
db.Model(&SleepManage{}).Where("group_id = ? and user_id = ?", gid, uid).Update(
|
db.Model(&SleepManage{}).Where("group_id = ? and user_id = ?", gid, uid).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"sleep_time": now,
|
"sleep_time": now,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -223,7 +223,7 @@ func (vdb *VtbDB) GetVtbList() (uidList []string, err error) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
db.Model(&FirstCategory{}).Where("first_category_uid = ?", fc.FirstCategoryUID).Update(
|
db.Model(&FirstCategory{}).Where("first_category_uid = ?", fc.FirstCategoryUID).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"first_category_index": i,
|
"first_category_index": i,
|
||||||
"first_category_name": item.Get("name").String(),
|
"first_category_name": item.Get("name").String(),
|
||||||
"first_category_description": item.Get("description").String(),
|
"first_category_description": item.Get("description").String(),
|
||||||
@ -283,7 +283,7 @@ func (vdb *VtbDB) StoreVtb(uid string) (err error) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
db.Model(&SecondCategory{}).Where("first_category_uid = ? and second_category_index = ?", uid, secondIndex).Update(
|
db.Model(&SecondCategory{}).Where("first_category_uid = ? and second_category_index = ?", uid, secondIndex).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"second_category_name": secondItem.Get("categoryName").String(),
|
"second_category_name": secondItem.Get("categoryName").String(),
|
||||||
"second_category_author": secondItem.Get("author").String(),
|
"second_category_author": secondItem.Get("author").String(),
|
||||||
"second_category_description": secondItem.Get("categoryDescription.zh-CN").String(),
|
"second_category_description": secondItem.Get("categoryDescription.zh-CN").String(),
|
||||||
@ -313,7 +313,7 @@ func (vdb *VtbDB) StoreVtb(uid string) (err error) {
|
|||||||
} else {
|
} else {
|
||||||
db.Model(&ThirdCategory{}).Where("first_category_uid = ? and second_category_index = ? and third_category_index = ?",
|
db.Model(&ThirdCategory{}).Where("first_category_uid = ? and second_category_index = ? and third_category_index = ?",
|
||||||
uid, secondIndex, thirdIndex).Update(
|
uid, secondIndex, thirdIndex).Update(
|
||||||
map[string]interface{}{
|
map[string]any{
|
||||||
"third_category_name": thirdItem.Get("name").String(),
|
"third_category_name": thirdItem.Get("name").String(),
|
||||||
"third_category_description": thirdItem.Get("description.zh-CN").String(),
|
"third_category_description": thirdItem.Get("description.zh-CN").String(),
|
||||||
"third_category_path": thirdItem.Get("path").String(),
|
"third_category_path": thirdItem.Get("path").String(),
|
||||||
|
|||||||
@ -69,7 +69,7 @@ func (gdb *ymgaldb) insertOrUpdateYmgalByID(id int64, title, pictureType, pictur
|
|||||||
err = db.Model(&ymgal{}).Create(&y).Error // newUser not user
|
err = db.Model(&ymgal{}).Create(&y).Error // newUser not user
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = db.Model(&ymgal{}).Where("id = ? ", id).Update(map[string]interface{}{
|
err = db.Model(&ymgal{}).Where("id = ? ", id).Update(map[string]any{
|
||||||
"title": title,
|
"title": title,
|
||||||
"picture_type": pictureType,
|
"picture_type": pictureType,
|
||||||
"picture_description": pictureDescription,
|
"picture_description": pictureDescription,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user