🎨 优化 bilibiliparse

This commit is contained in:
源文雨 2022-05-27 19:09:07 +08:00
parent 14096f24ba
commit 4f248c4dc7

View File

@ -2,6 +2,7 @@
package bilibiliparse package bilibiliparse
import ( import (
"errors"
"regexp" "regexp"
"strings" "strings"
@ -12,10 +13,11 @@ import (
) )
const ( const (
bilibiliRe = "https://www.bilibili.com/video/av[0-9]+|https://www.bilibili.com/video/BV[0-9a-zA-Z]+|https://b23.tv/[0-9a-zA-Z]+|https://www.bilibili.com/video/bv[0-9a-zA-Z]+"
validRe = "https://www.bilibili.com/video/(BV[0-9a-zA-Z]+)" validRe = "https://www.bilibili.com/video/(BV[0-9a-zA-Z]+)"
) )
var re = regexp.MustCompile(validRe)
func init() { func init() {
engine := control.Register("bilibiliparse", &control.Options{ engine := control.Register("bilibiliparse", &control.Options{
DisableOnDefault: false, DisableOnDefault: false,
@ -23,16 +25,17 @@ func init() {
"- https://www.bilibili.com/video/BV1xx411c7BF | https://www.bilibili.com/video/av1605 | https://b23.tv/I8uzWCA | https://www.bilibili.com/video/bv1xx411c7BF", "- https://www.bilibili.com/video/BV1xx411c7BF | https://www.bilibili.com/video/av1605 | https://b23.tv/I8uzWCA | https://www.bilibili.com/video/bv1xx411c7BF",
}) })
engine.OnRegex(bilibiliRe).SetBlock(true).Handle(func(ctx *zero.Ctx) { engine.OnRegex("(av[0-9]+|BV[0-9a-zA-Z]+|https://b23.tv/[0-9a-zA-Z]+|bv[0-9a-zA-Z]+){1}").SetBlock(true).Handle(func(ctx *zero.Ctx) {
bilibiliURL := ctx.State["regex_matched"].([]string)[0] bilibiliURL := ctx.State["regex_matched"].([]string)[1]
if bilibiliURL[0] != 'h' {
bilibiliURL = "https://www.bilibili.com/video/" + bilibiliURL
}
m, err := parseURL(bilibiliURL) m, err := parseURL(bilibiliURL)
if err != nil { if err != nil {
ctx.SendChain(message.Text("ERROR:", err)) ctx.SendChain(message.Text("ERROR:", err))
return return
} }
if len(m) != 0 {
ctx.Send(m) ctx.Send(m)
}
}) })
} }
@ -42,29 +45,29 @@ func parseURL(bilibiliURL string) (m message.Message, err error) {
return return
} }
videoURL := htmlquery.FindOne(doc, "/html/head/meta[@itemprop='url']").Attr[2].Val videoURL := htmlquery.FindOne(doc, "/html/head/meta[@itemprop='url']").Attr[2].Val
re := regexp.MustCompile(validRe)
if !re.MatchString(videoURL) { if !re.MatchString(videoURL) {
err = errors.New("parse html error: invalid video url")
return return
} }
bv := re.FindStringSubmatch(videoURL)[1] m = make(message.Message, 0, 8)
title := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/h1/span/text()").Data title := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/h1/span/text()").Data
m = append(m, message.Text(title+"\n")) m = append(m, message.Text(title, "\n"))
upName := strings.TrimSpace(htmlquery.FindOne(doc, "//*[@id='v_upinfo']/div[2]/div[1]/a[1]/text()").Data) upName := strings.TrimSpace(htmlquery.FindOne(doc, "//*[@id='v_upinfo']/div[2]/div[1]/a[1]/text()").Data)
fanNumber := htmlquery.InnerText(htmlquery.FindOne(doc, "//i[@class='van-icon-general_addto_s']").NextSibling.NextSibling) fanNumber := htmlquery.InnerText(htmlquery.FindOne(doc, "//i[@class='van-icon-general_addto_s']").NextSibling.NextSibling)
m = append(m, message.Text("up"+upName+",粉丝:"+fanNumber+"\n")) m = append(m, message.Text("up: "+upName+",粉丝: "+fanNumber+"\n"))
view := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/div/span[@class='view']/text()").Data view := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/div/span[@class='view']/text()").Data
dm := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/div/span[@class='dm']/text()").Data dm := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/div/span[@class='dm']/text()").Data
m = append(m, message.Text(view+dm+"\n")) m = append(m, message.Text(view, dm, "\n"))
t := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/div/span[3]/text()").Data t := htmlquery.FindOne(doc, "//*[@id='viewbox_report']/div/span[3]/text()").Data
m = append(m, message.Text(t)) m = append(m, message.Text(t))
image := htmlquery.FindOne(doc, "/html/head/meta[@itemprop='image']").Attr[2].Val image := htmlquery.FindOne(doc, "/html/head/meta[@itemprop='image']").Attr[2].Val
m = append(m, message.Image(image)) m = append(m, message.Image(image))
like := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='like']/text()").Data like := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='like']/text()").Data
coin := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='coin']/text()").Data coin := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='coin']/text()").Data
m = append(m, message.Text("\n点赞", strings.TrimSpace(like)+",投币", strings.TrimSpace(coin)+"\n")) m = append(m, message.Text("\n点赞: ", strings.TrimSpace(like)+",投币: ", strings.TrimSpace(coin)+"\n"))
collect := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='collect']/text()").Data collect := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='collect']/text()").Data
share := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='share']/text()").Data share := htmlquery.FindOne(doc, "//*[@id='arc_toolbar_report']/div[1]/span[@class='share']/text()").Data
m = append(m, message.Text("收藏", strings.TrimSpace(collect)+",分享", strings.TrimSpace(share)+"\n")) m = append(m, message.Text("收藏: ", strings.TrimSpace(collect)+",分享: ", strings.TrimSpace(share)+"\n"))
m = append(m, message.Text(bv)) m = append(m, message.Text(videoURL))
return return
} }