Skip to content

Commit 986e507

Browse files
authored
fix bilibili (#710)
* fix bilibili * 1 * fix * 123 * 做了一下修改的提交 * 1 * make master happy * 最后一次
1 parent 38b11bb commit 986e507

File tree

1 file changed

+131
-26
lines changed

1 file changed

+131
-26
lines changed

plugin/bilibili/bilibilipush.go

Lines changed: 131 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,56 @@ package bilibili
33

44
import (
55
"bytes"
6+
"crypto/md5"
7+
"encoding/hex"
68
"encoding/json"
79
"fmt"
810
"net/http"
11+
"net/url"
12+
"path/filepath"
13+
"sort"
914
"strconv"
15+
"strings"
1016
"time"
1117

12-
"github.com/pkg/errors"
13-
"github.com/tidwall/gjson"
14-
zero "github.com/wdvxdr1123/ZeroBot"
15-
"github.com/wdvxdr1123/ZeroBot/message"
16-
1718
bz "github.com/FloatTech/AnimeAPI/bilibili"
1819
"github.com/FloatTech/floatbox/binary"
1920
"github.com/FloatTech/floatbox/web"
2021
ctrl "github.com/FloatTech/zbpctrl"
2122
"github.com/FloatTech/zbputils/control"
2223
"github.com/FloatTech/zbputils/img/text"
24+
"github.com/RomiChan/syncx"
25+
"github.com/pkg/errors"
26+
"github.com/tidwall/gjson"
27+
zero "github.com/wdvxdr1123/ZeroBot"
28+
"github.com/wdvxdr1123/ZeroBot/message"
29+
"github.com/wdvxdr1123/ZeroBot/utils/helper"
2330
)
2431

2532
const (
2633
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
27-
referer = "https://www.bilibili.com/"
28-
infoURL = "https://api.bilibili.com/x/space/acc/info?mid=%v"
34+
referer = "https://space.bilibili.com/%v"
35+
infoURL = "https://api.bilibili.com/x/space/wbi/acc/info?mid=%v&token=&platform=web&web_location=1550101"
36+
navURL = "https://api.bilibili.com/x/web-interface/nav"
2937
)
3038

3139
// bdb bilibili推送数据库
3240
var bdb *bilibilipushdb
3341

3442
var (
35-
lastTime = map[int64]int64{}
36-
liveStatus = map[int64]int{}
37-
upMap = map[int64]string{}
43+
lastTime = map[int64]int64{}
44+
liveStatus = map[int64]int{}
45+
upMap = map[int64]string{}
46+
mixinKeyEncTab = [...]int{
47+
46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
48+
33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
49+
61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
50+
36, 20, 34, 44, 52,
51+
}
52+
cache syncx.Map[string, string]
53+
lastUpdateTime time.Time
54+
55+
replacements = [...]string{"!", "'", "(", ")", "*"}
3856
)
3957

4058
func init() {
@@ -60,7 +78,7 @@ func init() {
6078
en.OnRegex(`^添加[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
6179
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
6280
name, err := getName(buid)
63-
if err != nil {
81+
if err != nil || name == "" {
6482
ctx.SendChain(message.Text("ERROR: ", err))
6583
return
6684
}
@@ -175,27 +193,17 @@ func init() {
175193
func getName(buid int64) (name string, err error) {
176194
var ok bool
177195
if name, ok = upMap[buid]; !ok {
178-
var data []byte
179-
data, err = web.RequestDataWithHeaders(web.NewDefaultClient(), fmt.Sprintf(infoURL, buid), "GET", func(r *http.Request) error {
180-
r.Header.Set("refer", referer)
181-
r.Header.Set("user-agent", ua)
182-
cookie := ""
183-
if cfg != nil {
184-
cookie, err = cfg.Load()
185-
if err != nil {
186-
return err
187-
}
188-
}
189-
r.Header.Set("cookie", cookie)
196+
data, err := web.RequestDataWithHeaders(web.NewDefaultClient(), signURL(fmt.Sprintf(infoURL, buid)), "GET", func(r *http.Request) error {
197+
r.Header.Set("User-Agent", ua)
190198
return nil
191199
}, nil)
192200
if err != nil {
193-
return
201+
return "", err
194202
}
195203
status := int(gjson.Get(binary.BytesToString(data), "code").Int())
196204
if status != 0 {
197205
err = errors.New(gjson.Get(binary.BytesToString(data), "message").String())
198-
return
206+
return "", err
199207
}
200208
name = gjson.Get(binary.BytesToString(data), "data.name").String()
201209
bdb.insertBilibiliUp(buid, name)
@@ -204,6 +212,103 @@ func getName(buid int64) (name string, err error) {
204212
return
205213
}
206214

215+
func getMixinKey(orig string) string {
216+
var str strings.Builder
217+
t := 0
218+
for _, v := range mixinKeyEncTab {
219+
if v < len(orig) {
220+
str.WriteByte(orig[v])
221+
t++
222+
}
223+
if t > 31 {
224+
break
225+
}
226+
}
227+
return str.String()
228+
}
229+
230+
func wbiSign(params map[string]string, imgKey string, subKey string) map[string]string {
231+
mixinKey := getMixinKey(imgKey + subKey)
232+
currTime := strconv.FormatInt(time.Now().Unix(), 10)
233+
params["wts"] = currTime
234+
// Sort keys
235+
keys := make([]string, 0, len(params))
236+
for k, v := range params {
237+
keys = append(keys, k)
238+
for _, old := range replacements {
239+
v = strings.ReplaceAll(v, old, "")
240+
}
241+
params[k] = v
242+
}
243+
sort.Strings(keys)
244+
h := md5.New()
245+
for k, v := range keys {
246+
h.Write([]byte(v))
247+
h.Write([]byte{'='})
248+
h.Write([]byte(params[v]))
249+
if k < len(keys)-1 {
250+
h.Write([]byte{'&'})
251+
}
252+
}
253+
h.Write([]byte(mixinKey))
254+
params["w_rid"] = hex.EncodeToString(h.Sum(make([]byte, 0, md5.Size)))
255+
return params
256+
}
257+
258+
func getWbiKeysCached() (string, string) {
259+
if time.Since(lastUpdateTime).Minutes() > 10 {
260+
imgKey, subKey := getWbiKeys()
261+
cache.Store("imgKey", imgKey)
262+
cache.Store("subKey", subKey)
263+
lastUpdateTime = time.Now()
264+
return imgKey, subKey
265+
}
266+
imgKeyI, _ := cache.Load("imgKey")
267+
subKeyI, _ := cache.Load("subKey")
268+
return imgKeyI, subKeyI
269+
}
270+
271+
func getWbiKeys() (string, string) {
272+
data, _ := web.RequestDataWithHeaders(web.NewDefaultClient(), navURL, "GET", func(r *http.Request) error {
273+
if cfg != nil {
274+
cookie, err := cfg.Load()
275+
if err == nil {
276+
r.Header.Set("cookie", cookie)
277+
return nil
278+
}
279+
return err
280+
}
281+
return errors.New("未配置-cookie")
282+
}, nil)
283+
json := helper.BytesToString(data)
284+
imgURL := gjson.Get(json, "data.wbi_img.img_url").String()
285+
subURL := gjson.Get(json, "data.wbi_img.sub_url").String()
286+
imgKey := imgURL[strings.LastIndex(imgURL, "/")+1:]
287+
imgKey = strings.TrimSuffix(imgKey, filepath.Ext(imgKey))
288+
subKey := subURL[strings.LastIndex(subURL, "/")+1:]
289+
subKey = strings.TrimSuffix(subKey, filepath.Ext(subKey))
290+
return imgKey, subKey
291+
}
292+
293+
func signURL(urlStr string) string {
294+
urlObj, _ := url.Parse(urlStr)
295+
imgKey, subKey := getWbiKeysCached()
296+
query := urlObj.Query()
297+
params := map[string]string{}
298+
for k, v := range query {
299+
if len(v) > 0 {
300+
params[k] = v[0]
301+
}
302+
}
303+
newParams := wbiSign(params, imgKey, subKey)
304+
for k, v := range newParams {
305+
query.Set(k, v)
306+
}
307+
urlObj.RawQuery = query.Encode()
308+
newURL := urlObj.String()
309+
return newURL
310+
}
311+
207312
// subscribe 订阅
208313
func subscribe(buid, groupid int64) (err error) {
209314
bpMap := map[string]any{
@@ -276,7 +381,7 @@ func sendDynamic(ctx *zero.Ctx) error {
276381
return err
277382
}
278383
if len(cardList) == 0 {
279-
return errors.Errorf("%v的历史动态数为0", buid)
384+
return nil
280385
}
281386
t, ok := lastTime[buid]
282387
// 第一次先记录时间,啥也不做

0 commit comments

Comments
 (0)