From 1c9a7eb15888d2787b34b379f7122cd3084846f1 Mon Sep 17 00:00:00 2001
From: himawari <54976075+guohuiyuan@users.noreply.github.com>
Date: Thu, 21 Jul 2022 12:54:52 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E4=BF=AE=E6=94=B9bilibili,bilib?=
=?UTF-8?q?iliparse=E6=8F=92=E4=BB=B6=E7=BB=93=E6=9E=84=EF=BC=8C=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0bilibili=E5=8A=A8=E6=80=81=E7=9B=B4=E6=92=AD=E4=B8=93?=
=?UTF-8?q?=E6=A0=8F=E8=A7=A3=E6=9E=90=20(#319)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 🎨 修改bilibili,bilibiliparse插件结构,添加bilibili动态直播专栏解析
* 💩 修改大小写
* 🎨 正则全局,错误处理
* 🎨 使用json.NewDecoder()
* 💚 空使用
* 💚 修lint
---
README.md | 6 +-
main.go | 117 +++++-----
plugin/bilibili/api.go | 153 +++++--------
plugin/bilibili/{info.go => bilibili.go} | 65 +++---
plugin/bilibili/bilibili_parse.go | 105 +++++++++
plugin/bilibili/card2msg.go | 233 ++++++++++++++++++++
plugin/bilibili/card2msg_test.go | 82 +++++++
plugin/bilibili/types.go | 267 +++++++++++++++++++++++
plugin/bilibili/util.go | 24 ++
plugin/bilibili_parse/bilibili_parse.go | 190 ----------------
plugin/gif/gif.go | 25 +++
plugin/gif/png.go | 28 +++
plugin/github/repo_searcher.go | 12 +-
13 files changed, 909 insertions(+), 398 deletions(-)
rename plugin/bilibili/{info.go => bilibili.go} (89%)
create mode 100644 plugin/bilibili/bilibili_parse.go
create mode 100644 plugin/bilibili/card2msg.go
create mode 100644 plugin/bilibili/card2msg_test.go
create mode 100644 plugin/bilibili/types.go
create mode 100644 plugin/bilibili/util.go
delete mode 100644 plugin/bilibili_parse/bilibili_parse.go
diff --git a/README.md b/README.md
index 5120f9cb61..65b64a2fe8 100644
--- a/README.md
+++ b/README.md
@@ -387,11 +387,11 @@ print("run[CQ:image,file="+j["img"]+"]")
- b站视频链接解析
+ b站动态、专栏、视频、直播解析
- `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili_parse"`
+ `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili"`
- - [x] https://www.bilibili.com/video/BV1xx411c7BF | https://www.bilibili.com/video/av1605 | https://b23.tv/I8uzWCA | https://www.bilibili.com/video/bv1xx411c7BF
+ - [x] t.bilibili.com/642277677329285174 | bilibili.com/read/cv17134450 | bilibili.com/video/BV13B4y1x7pS | live.bilibili.com/22603245
diff --git a/main.go b/main.go
index 5bedfba806..343e109b2b 100644
--- a/main.go
+++ b/main.go
@@ -55,65 +55,64 @@ import (
// vvvvvvvvvvvvvv //
// vvvv //
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ai_false" // 服务器监控
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aiwife" // 随机老婆
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/b14" // base16384加解密
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/baidu" // 百度一下
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili" // 查询b站用户信息
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili_parse" // b站视频链接解析
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/book_review" // 哀伤雪刃吧推书记录
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/cangtoushi" // 藏头诗
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/choose" // 选择困难症帮手
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/chouxianghua" // 说抽象话
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/coser" // 三次元小姐姐
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/cpstory" // cp短打
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/danbooru" // DeepDanbooru二次元图标签识别
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/diana" // 嘉心糖发病
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/drift_bottle" // 漂流瓶
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/emojimix" // 合成emoji
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/epidemic" // 城市疫情查询
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/font" // 渲染任意文字到图片
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/fortune" // 运势
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/funny" // 笑话
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/genshin" // 原神抽卡
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/gif" // 制图
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/github" // 搜索GitHub仓库
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/guessmusic" // 猜歌
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/hs" // 炉石
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/hyaku" // 百人一首
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/image_finder" // 关键字搜图
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/inject" // 注入指令
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jandan" // 煎蛋网无聊图
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu" // 摸鱼
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu_calendar" // 摸鱼人日历
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/music" // 点歌
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nativesetu" // 本地涩图
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nativewife" // 本地老婆
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nbnhhsh" // 拼音首字母缩写释义工具
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/novel" // 铅笔小说网搜索
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nsfw" // nsfw图片识别
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/omikuji" // 浅草寺求签
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/qqwife" // 一群一天一夫一妻制群老婆
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/reborn" // 投胎
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/runcode" // 在线运行代码
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/saucenao" // 以图搜图
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/scale" // 叔叔的AI二次元图片放大
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/score" // 分数
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/setutime" // 来份涩图
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/shadiao" // 沙雕app
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/shindan" // 测定
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tarot" // 抽塔罗牌
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou" // 舔狗日记
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tracemoe" // 搜番
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/translation" // 翻译
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/vtb_quotation" // vtb语录
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wangyiyun" // 网易云音乐热评
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/word_count" // 聊天热词
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle" // 猜单词
- _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ymgal" // 月幕galgame
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ai_false" // 服务器监控
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aiwife" // 随机老婆
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/b14" // base16384加解密
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/baidu" // 百度一下
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili" // b站相关
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/book_review" // 哀伤雪刃吧推书记录
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/cangtoushi" // 藏头诗
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/choose" // 选择困难症帮手
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/chouxianghua" // 说抽象话
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/coser" // 三次元小姐姐
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/cpstory" // cp短打
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/danbooru" // DeepDanbooru二次元图标签识别
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/diana" // 嘉心糖发病
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/drift_bottle" // 漂流瓶
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/emojimix" // 合成emoji
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/epidemic" // 城市疫情查询
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/font" // 渲染任意文字到图片
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/fortune" // 运势
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/funny" // 笑话
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/genshin" // 原神抽卡
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/gif" // 制图
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/github" // 搜索GitHub仓库
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/guessmusic" // 猜歌
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/hs" // 炉石
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/hyaku" // 百人一首
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/image_finder" // 关键字搜图
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/inject" // 注入指令
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jandan" // 煎蛋网无聊图
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu" // 摸鱼
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu_calendar" // 摸鱼人日历
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/music" // 点歌
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nativesetu" // 本地涩图
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nativewife" // 本地老婆
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nbnhhsh" // 拼音首字母缩写释义工具
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/novel" // 铅笔小说网搜索
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/nsfw" // nsfw图片识别
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/omikuji" // 浅草寺求签
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/qqwife" // 一群一天一夫一妻制群老婆
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/reborn" // 投胎
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/runcode" // 在线运行代码
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/saucenao" // 以图搜图
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/scale" // 叔叔的AI二次元图片放大
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/score" // 分数
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/setutime" // 来份涩图
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/shadiao" // 沙雕app
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/shindan" // 测定
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tarot" // 抽塔罗牌
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou" // 舔狗日记
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tracemoe" // 搜番
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/translation" // 翻译
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/vtb_quotation" // vtb语录
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wangyiyun" // 网易云音乐热评
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/word_count" // 聊天热词
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle" // 猜单词
+ _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ymgal" // 月幕galgame
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wtf" // 鬼东西
diff --git a/plugin/bilibili/api.go b/plugin/bilibili/api.go
index 7914c7fdd3..ec54542bb5 100644
--- a/plugin/bilibili/api.go
+++ b/plugin/bilibili/api.go
@@ -3,8 +3,9 @@ package bilibili
import (
"encoding/json"
"errors"
- "io"
+ "fmt"
"net/http"
+ "strconv"
"github.com/FloatTech/zbputils/binary"
"github.com/FloatTech/zbputils/web"
@@ -15,18 +16,9 @@ var (
errNeedCookie = errors.New("该api需要设置b站cookie,请发送命令设置cookie,例如\"设置b站cookie SESSDATA=82da790d,1663822823,06ecf*31\"")
)
-type searchResult struct {
- Mid int64 `json:"mid"`
- Uname string `json:"uname"`
- Gender int64 `json:"gender"`
- Usign string `json:"usign"`
- Level int64 `json:"level"`
-}
-
-// 搜索api:通过把触发指令传入的昵称找出uid返回
-func search(keyword string) (r []searchResult, err error) {
- searchURL := "http://api.bilibili.com/x/web-interface/search/type?search_type=bili_user&keyword=" + keyword
- data, err := web.GetData(searchURL)
+// searchUser 查找b站用户
+func searchUser(keyword string) (r []searchResult, err error) {
+ data, err := web.GetData(fmt.Sprintf(searchUserURL, keyword))
if err != nil {
return
}
@@ -42,35 +34,35 @@ func search(keyword string) (r []searchResult, err error) {
return
}
-type follower 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"`
+// 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
}
-// 请求api
-func fansapi(uid string) (result follower, err error) {
- fanURL := "https://api.vtbs.moe/v1/detail/" + uid
- data, err := web.GetData(fanURL)
+// getMemberCard 获取b站个人详情
+func getMemberCard(uid interface{}) (result memberCard, err error) {
+ data, err := web.GetData(fmt.Sprintf(memberCardURL, uid))
if err != nil {
return
}
- if err = json.Unmarshal(data, &result); err != nil {
+ err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("card").Raw), &result)
+ if err != nil {
return
}
return
}
-func followings(uid string) (s string, err error) {
- followingURL := "https://api.bilibili.com/x/relation/same/followings?vmid=" + uid
- method := "GET"
+// getMedalwall 用b站uid获得牌子
+func getMedalwall(uid string) (result []medal, err error) {
client := &http.Client{}
- req, err := http.NewRequest(method, followingURL, nil)
+ req, err := http.NewRequest("GET", fmt.Sprintf(medalwallURL, uid), nil)
if err != nil {
return
}
@@ -81,99 +73,56 @@ func followings(uid string) (s string, err error) {
return
}
defer res.Body.Close()
- body, err := io.ReadAll(res.Body)
+ var md medalData
+ err = json.NewDecoder(res.Body).Decode(&md)
if err != nil {
return
}
- j := gjson.ParseBytes(body)
- s = j.Get("data.list.#.uname").Raw
- if j.Get("code").Int() == -101 {
+ if md.Code == -101 {
err = errNeedCookie
return
}
- if j.Get("code").Int() != 0 {
- err = errors.New(j.Get("message").String())
- return
+ if md.Code != 0 {
+ err = errors.New(md.Message)
}
+ result = md.Data.List
return
}
-type userinfo struct {
- Name string `json:"name"`
- Mid string `json:"mid"`
- Face string `json:"face"`
- Fans int64 `json:"fans"`
- Regtime int64 `json:"regtime"`
- Attentions []int64 `json:"attentions"`
-}
-
-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
-}
-
-// 获取详情
-func card(uid string) (result userinfo, err error) {
- cardURL := "https://account.bilibili.com/api/member/getCardByMid?mid=" + uid
- data, err := web.GetData(cardURL)
- if err != nil {
- return
- }
- err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("card").Raw), &result)
+// 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
}
-// 获得牌子
-func medalwall(uid string) (result []medal, err error) {
- medalwallURL := "https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall?target_id=" + uid
- method := "GET"
- client := &http.Client{}
- req, err := http.NewRequest(method, medalwallURL, nil)
+// 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
}
- c := vdb.getBilibiliCookie()
- req.Header.Add("cookie", c.Value)
- res, err := client.Do(req)
- 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))
}
- defer res.Body.Close()
- data, err := io.ReadAll(res.Body)
if err != nil {
return
}
- j := gjson.ParseBytes(data)
- if j.Get("code").Int() == -101 {
- err = errNeedCookie
- return
- }
- if j.Get("code").Int() != 0 {
- err = errors.New(j.Get("message").String())
- }
- _ = json.Unmarshal(binary.StringToBytes(j.Get("data.list").Raw), &result)
+ err = json.Unmarshal(binary.StringToBytes(gjson.ParseBytes(data).Get("data").Raw), &card)
return
}
diff --git a/plugin/bilibili/info.go b/plugin/bilibili/bilibili.go
similarity index 89%
rename from plugin/bilibili/info.go
rename to plugin/bilibili/bilibili.go
index 0f84a96d32..6451cdd6a1 100644
--- a/plugin/bilibili/info.go
+++ b/plugin/bilibili/bilibili.go
@@ -27,20 +27,20 @@ import (
"github.com/wdvxdr1123/ZeroBot/message"
)
-var engine = control.Register("bilibili", &ctrl.Options[*zero.Ctx]{
- DisableOnDefault: false,
- Help: "bilibili\n" +
- "- >vup info [xxx]\n" +
- "- >user info [xxx]\n" +
- "- 查成分 [xxx]\n" +
- "- 设置b站cookie SESSDATA=82da790d,1663822823,06ecf*31\n" +
- "- 更新vup",
- PublicDataFolder: "Bilibili",
-})
var re = regexp.MustCompile(`^\d+$`)
// 查成分的
func init() {
+ engine := control.Register("bilibili", &ctrl.Options[*zero.Ctx]{
+ DisableOnDefault: false,
+ Help: "bilibili\n" +
+ "- >vup info [xxx]\n" +
+ "- >user info [xxx]\n" +
+ "- 查成分 [xxx]\n" +
+ "- 设置b站cookie SESSDATA=82da790d,1663822823,06ecf*31\n" +
+ "- 更新vup",
+ PublicDataFolder: "Bilibili",
+ })
cachePath := engine.DataFolder() + "cache/"
_ = os.RemoveAll(cachePath)
_ = os.MkdirAll(cachePath, 0755)
@@ -55,46 +55,35 @@ func init() {
return true
})
- engine.OnRegex(`^>user info\s?(.{1,25})$`, getdb).SetBlock(true).
+ engine.OnRegex(`^>user info\s?(.{1,25})$`, getPara).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
- keyword := ctx.State["regex_matched"].([]string)[1]
- uidRes, err := search(keyword)
+ id := ctx.State["uid"].(string)
+ card, err := getMemberCard(id)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return
}
- id := strconv.FormatInt(uidRes[0].Mid, 10)
- follwings, err := followings(id)
- if err != nil {
- ctx.SendChain(message.Text("ERROR:", err))
- }
ctx.SendChain(message.Text(
- "search: ", uidRes[0].Mid, "\n",
- "name: ", uidRes[0].Uname, "\n",
- "sex: ", []string{"", "男", "女", "未知"}[uidRes[0].Gender], "\n",
- "sign: ", uidRes[0].Usign, "\n",
- "level: ", uidRes[0].Level, "\n",
- "follow: ", follwings,
+ "uid: ", card.Mid, "\n",
+ "name: ", card.Name, "\n",
+ "sex: ", card.Sex, "\n",
+ "sign: ", card.Sign, "\n",
+ "level: ", card.LevelInfo.CurrentLevel, "\n",
+ "birthday: ", card.Birthday,
))
})
- engine.OnRegex(`^>vup info\s?(.{1,25})$`).SetBlock(true).
+ engine.OnRegex(`^>vup info\s?(.{1,25})$`, getPara).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
- keyword := ctx.State["regex_matched"].([]string)[1]
- res, err := search(keyword)
- if err != nil {
- ctx.SendChain(message.Text("ERROR:", err))
- return
- }
- id := strconv.FormatInt(res[0].Mid, 10)
+ id := ctx.State["uid"].(string)
// 获取详情
- fo, err := fansapi(id)
+ fo, err := getVtbDetail(id)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return
}
ctx.SendChain(message.Text(
- "search: ", fo.Mid, "\n",
+ "b站id: ", fo.Mid, "\n",
"名字: ", fo.Uname, "\n",
"当前粉丝数: ", fo.Follower, "\n",
"24h涨粉数: ", fo.Rise, "\n",
@@ -116,7 +105,7 @@ func init() {
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
return
}
- u, err := card(id)
+ u, err := getMemberCard(id)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return
@@ -127,7 +116,7 @@ func init() {
return
}
vupLen := len(vups)
- medals, err := medalwall(id)
+ medals, err := getMedalwall(id)
sort.Sort(medalSlice(medals))
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
@@ -312,7 +301,7 @@ func int2rbg(t int64) (int64, int64, int64) {
func getPara(ctx *zero.Ctx) bool {
keyword := ctx.State["regex_matched"].([]string)[1]
if !re.MatchString(keyword) {
- searchRes, err := search(keyword)
+ searchRes, err := searchUser(keyword)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
@@ -345,7 +334,7 @@ func getPara(ctx *zero.Ctx) bool {
ctx.State["uid"] = keyword
return true
} else if num == 1 {
- searchRes, err := search(keyword)
+ searchRes, err := searchUser(keyword)
if err != nil {
ctx.SendChain(message.Text("ERROR:", err))
return false
diff --git a/plugin/bilibili/bilibili_parse.go b/plugin/bilibili/bilibili_parse.go
new file mode 100644
index 0000000000..ac5c9932a3
--- /dev/null
+++ b/plugin/bilibili/bilibili_parse.go
@@ -0,0 +1,105 @@
+package bilibili
+
+import (
+ "regexp"
+ "time"
+
+ ctrl "github.com/FloatTech/zbpctrl"
+ "github.com/FloatTech/zbputils/control"
+ "github.com/FloatTech/zbputils/ctxext"
+ zero "github.com/wdvxdr1123/ZeroBot"
+ "github.com/wdvxdr1123/ZeroBot/message"
+)
+
+var (
+ limit = ctxext.NewLimiterManager(time.Second*10, 1)
+ searchVideo = `bilibili.com/video/(?:av(\d+)|([bB][vV][0-9a-zA-Z]+))`
+ searchDynamic = `(t.bilibili.com|m.bilibili.com/dynamic)/(\d+)`
+ searchArticle = `bilibili.com/read/(?:cv|mobile/)(\d+)`
+ searchLiveRoom = `live.bilibili.com/(\d+)`
+ searchVideoRe = regexp.MustCompile(searchVideo)
+ searchDynamicRe = regexp.MustCompile(searchDynamic)
+ searchArticleRe = regexp.MustCompile(searchArticle)
+ searchLiveRoomRe = regexp.MustCompile(searchLiveRoom)
+)
+
+// 插件主体
+func init() {
+ en := control.Register("bilibiliparse", &ctrl.Options[*zero.Ctx]{
+ DisableOnDefault: false,
+ Help: "b站动态、专栏、视频、直播解析\n" +
+ "- t.bilibili.com/642277677329285174 | bilibili.com/read/cv17134450 | bilibili.com/video/BV13B4y1x7pS | live.bilibili.com/22603245 ",
+ })
+ en.OnRegex(`((b23|acg).tv|bili2233.cn)/[0-9a-zA-Z]+`).SetBlock(true).Limit(limit.LimitByGroup).
+ Handle(func(ctx *zero.Ctx) {
+ url := ctx.State["regex_matched"].([]string)[0]
+ realurl, err := getrealurl("https://" + url)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ switch {
+ case searchVideoRe.MatchString(realurl):
+ ctx.State["regex_matched"] = searchVideoRe.FindStringSubmatch(realurl)
+ handleVideo(ctx)
+ case searchDynamicRe.MatchString(realurl):
+ ctx.State["regex_matched"] = searchDynamicRe.FindStringSubmatch(realurl)
+ handleDynamic(ctx)
+ case searchArticleRe.MatchString(realurl):
+ ctx.State["regex_matched"] = searchArticleRe.FindStringSubmatch(realurl)
+ handleArticle(ctx)
+ case searchLiveRoomRe.MatchString(realurl):
+ ctx.State["regex_matched"] = searchLiveRoomRe.FindStringSubmatch(realurl)
+ handleLive(ctx)
+ }
+ })
+ en.OnRegex(searchVideo).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleVideo)
+ en.OnRegex(searchDynamic).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleDynamic)
+ en.OnRegex(searchArticle).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleArticle)
+ en.OnRegex(searchLiveRoom).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleLive)
+}
+
+func handleVideo(ctx *zero.Ctx) {
+ id := ctx.State["regex_matched"].([]string)[1]
+ if id == "" {
+ id = ctx.State["regex_matched"].([]string)[2]
+ }
+ card, err := getVideoInfo(id)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR:", err))
+ return
+ }
+ msg, err := videoCard2msg(card)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR:", err))
+ return
+ }
+ ctx.SendChain(msg...)
+}
+
+func handleDynamic(ctx *zero.Ctx) {
+ msg, err := dynamicDetail(ctx.State["regex_matched"].([]string)[2])
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR:", err))
+ return
+ }
+ ctx.SendChain(msg...)
+}
+
+func handleArticle(ctx *zero.Ctx) {
+ card, err := getArticleInfo(ctx.State["regex_matched"].([]string)[1])
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR:", err))
+ return
+ }
+ ctx.SendChain(articleCard2msg(card, ctx.State["regex_matched"].([]string)[1])...)
+}
+
+func handleLive(ctx *zero.Ctx) {
+ card, err := getLiveRoomInfo(ctx.State["regex_matched"].([]string)[1])
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR:", err))
+ return
+ }
+ ctx.SendChain(liveCard2msg(card)...)
+}
diff --git a/plugin/bilibili/card2msg.go b/plugin/bilibili/card2msg.go
new file mode 100644
index 0000000000..607ad24e2f
--- /dev/null
+++ b/plugin/bilibili/card2msg.go
@@ -0,0 +1,233 @@
+package bilibili
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "time"
+
+ "github.com/FloatTech/zbputils/binary"
+ "github.com/FloatTech/zbputils/web"
+ "github.com/tidwall/gjson"
+ "github.com/wdvxdr1123/ZeroBot/message"
+)
+
+var (
+ typeMsg = map[int]string{
+ 1: "转发了动态",
+ 2: "有图营业",
+ 4: "无图营业",
+ 8: "投稿了视频",
+ 16: "投稿了短视频",
+ 64: "投稿了文章",
+ 256: "投稿了音频",
+ 2048: "发布了简报",
+ 4200: "发布了直播",
+ 4308: "发布了直播",
+ }
+)
+
+// dynamicCard2msg cType=0时,处理DynCard字符串,cType=1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308时,处理Card字符串,cType为card类型
+func dynamicCard2msg(str string, cType int) (msg []message.MessageSegment, err error) {
+ var (
+ dynamicCard dynamicCard
+ card Card
+ vote Vote
+ )
+ msg = make([]message.MessageSegment, 0, 16)
+ // 初始化结构体
+ switch cType {
+ case 0:
+ 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
+ }
+ // 生成消息
+ switch cType {
+ case 1:
+ msg = append(msg, message.Text(card.User.Uname, typeMsg[cType], "\n",
+ card.Item.Content, "\n",
+ "转发的内容: \n"))
+ var originMsg []message.MessageSegment
+ originMsg, err = dynamicCard2msg(card.Origin, 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"), typeMsg[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"), typeMsg[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",
+ "参与人数: ", 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"), typeMsg[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"), typeMsg[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]interface{})["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), typeMsg[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"), typeMsg[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, typeMsg[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, typeMsg[cType], "\n"))
+ }
+ msg = append(msg, message.Image(card.LivePlayInfo.Cover))
+ msg = append(msg, message.Text(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("动态链接: ", tURL, dynamicCard.Desc.DynamicIDStr))
+ }
+ return
+}
+
+// dynamicDetail 用动态id查动态信息
+func dynamicDetail(dynamicIDStr string) (msg []message.MessageSegment, err error) {
+ var data []byte
+ data, err = web.GetData(fmt.Sprintf(dynamicDetailURL, dynamicIDStr))
+ if err != nil {
+ return
+ }
+ return dynamicCard2msg(gjson.ParseBytes(data).Get("data.card").Raw, 0)
+}
+
+// articleCard2msg 专栏转消息
+func articleCard2msg(card Card, defaultID string) (msg []message.MessageSegment) {
+ msg = make([]message.MessageSegment, 0, 16)
+ for i := 0; i < len(card.OriginImageUrls); i++ {
+ msg = append(msg, message.Image(card.OriginImageUrls[i]))
+ }
+ msg = append(msg, message.Text(card.Title, "\n", "UP主: ", card.AuthorName, "\n",
+ "阅读: ", humanNum(card.Stats.View), " 评论: ", humanNum(card.Stats.Reply), "\n",
+ cvURL, defaultID))
+ return
+}
+
+// liveCard2msg 直播卡片转消息
+func liveCard2msg(card roomCard) (msg []message.MessageSegment) {
+ msg = make([]message.MessageSegment, 0, 16)
+ msg = append(msg, message.Image(card.RoomInfo.Keyframe))
+ msg = append(msg, message.Text(card.RoomInfo.Title, "\n",
+ "主播: ", card.AnchorInfo.BaseInfo.Uname, "\n",
+ "房间号: ", card.RoomInfo.RoomID, "\n"))
+ if card.RoomInfo.ShortID != 0 {
+ msg = append(msg, message.Text("短号: ", card.RoomInfo.ShortID, "\n"))
+ }
+ msg = append(msg, message.Text("分区: ", card.RoomInfo.ParentAreaName))
+ if card.RoomInfo.ParentAreaName != card.RoomInfo.AreaName {
+ msg = append(msg, message.Text("-", card.RoomInfo.AreaName))
+ }
+ if card.RoomInfo.LiveStatus == 0 {
+ msg = append(msg, message.Text("未开播 \n"))
+ } else {
+ msg = append(msg, message.Text("直播中 ", humanNum(card.RoomInfo.Online), "人气\n"))
+ }
+ if card.RoomInfo.ShortID != 0 {
+ msg = append(msg, message.Text("直播间链接: ", lURL, card.RoomInfo.ShortID))
+ } else {
+ msg = append(msg, message.Text("直播间链接: ", lURL, card.RoomInfo.RoomID))
+ }
+
+ return
+}
+
+// videoCard2msg 视频卡片转消息
+func videoCard2msg(card Card) (msg []message.MessageSegment, err error) {
+ var mCard memberCard
+ msg = make([]message.MessageSegment, 0, 16)
+ mCard, err = getMemberCard(card.Owner.Mid)
+ if err != nil {
+ return
+ }
+ msg = append(msg, message.Text("标题: ", card.Title, "\n"))
+ if card.Rights.IsCooperation == 1 {
+ 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"))
+ }
+ } else {
+ msg = append(msg, message.Text("UP主: ", card.Owner.Name, " 粉丝: ", humanNum(mCard.Fans), "\n"))
+ }
+ msg = append(msg, message.Text("播放: ", humanNum(card.Stat.View), " 弹幕: ", humanNum(card.Stat.Danmaku)))
+ msg = append(msg, message.Image(card.Pic))
+ msg = append(msg, message.Text("点赞: ", humanNum(card.Stat.Like), " 投币: ", humanNum(card.Stat.Coin), "\n",
+ "收藏: ", humanNum(card.Stat.Favorite), " 分享: ", humanNum(card.Stat.Share), "\n",
+ vURL, card.BvID))
+ return
+}
diff --git a/plugin/bilibili/card2msg_test.go b/plugin/bilibili/card2msg_test.go
new file mode 100644
index 0000000000..272fed5b73
--- /dev/null
+++ b/plugin/bilibili/card2msg_test.go
@@ -0,0 +1,82 @@
+package bilibili
+
+import (
+ "testing"
+)
+
+func TestArticleInfo(t *testing.T) {
+ card, err := getArticleInfo("17279244")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(articleCard2msg(card, "17279244"))
+
+}
+
+func TestDynamicDetail(t *testing.T) {
+ t.Log("cType = 1")
+ t.Log(dynamicDetail("642279068898689029"))
+
+ t.Log("cType = 2")
+ t.Log(dynamicDetail("642470680290394121"))
+
+ t.Log("cType = 2048")
+ t.Log(dynamicDetail("642277677329285174"))
+
+ t.Log("cType = 4")
+ t.Log(dynamicDetail("642154347357011968"))
+
+ t.Log("cType = 8")
+ t.Log(dynamicDetail("675892999274627104"))
+
+ t.Log("cType = 4308")
+ t.Log(dynamicDetail("668598718656675844"))
+
+ t.Log("cType = 64")
+ t.Log(dynamicDetail("675966082178088963"))
+
+ t.Log("cType = 256")
+ t.Log(dynamicDetail("599253048535707632"))
+
+ t.Log("cType = 4,投票类型")
+ t.Log(dynamicDetail("677231070435868704"))
+}
+
+func TestMemberCard(t *testing.T) {
+ card, err := getMemberCard(2)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("%+v\n", card)
+}
+
+func TestVideoInfo(t *testing.T) {
+ card, err := getVideoInfo("10007")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(videoCard2msg(card))
+ card, err = getVideoInfo("BV1xx411c7mD")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(videoCard2msg(card))
+ card, err = getVideoInfo("bv1xx411c7mD")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(videoCard2msg(card))
+ card, err = getVideoInfo("BV1mF411j7iU")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(videoCard2msg(card))
+}
+
+func TestLiveRoomInfo(t *testing.T) {
+ card, err := getLiveRoomInfo("83171")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(liveCard2msg(card))
+}
diff --git a/plugin/bilibili/types.go b/plugin/bilibili/types.go
new file mode 100644
index 0000000000..c29192a044
--- /dev/null
+++ b/plugin/bilibili/types.go
@@ -0,0 +1,267 @@
+package bilibili
+
+const (
+ // tURL bilibili动态前缀
+ tURL = "https://t.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"
+)
+
+// 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"`
+}
+
+// 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"`
+}
diff --git a/plugin/bilibili/util.go b/plugin/bilibili/util.go
new file mode 100644
index 0000000000..f8c9ce8c00
--- /dev/null
+++ b/plugin/bilibili/util.go
@@ -0,0 +1,24 @@
+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
+ }
+ realurl = data.Request.URL.String()
+ return
+}
diff --git a/plugin/bilibili_parse/bilibili_parse.go b/plugin/bilibili_parse/bilibili_parse.go
deleted file mode 100644
index 0a2742b22d..0000000000
--- a/plugin/bilibili_parse/bilibili_parse.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Package bilibiliparse b站视频链接解析
-package bilibiliparse
-
-import (
- "encoding/json"
- "net/http"
- "regexp"
- "strconv"
- "strings"
- "time"
-
- ctrl "github.com/FloatTech/zbpctrl"
- "github.com/FloatTech/zbputils/control"
- "github.com/FloatTech/zbputils/ctxext"
- "github.com/FloatTech/zbputils/web"
- zero "github.com/wdvxdr1123/ZeroBot"
- "github.com/wdvxdr1123/ZeroBot/message"
-)
-
-type result struct {
- Data struct {
- Bvid string `json:"bvid"`
- Aid int `json:"aid"`
- Copyright int `json:"copyright"`
- Pic string `json:"pic"`
- Title string `json:"title"`
- Pubdate int `json:"pubdate"`
- Ctime int `json:"ctime"`
- Rights struct {
- IsCooperation int `json:"is_cooperation"`
- } `json:"rights"`
- Owner struct {
- Mid int `json:"mid"`
- Name string `json:"name"`
- } `json:"owner"`
- 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"`
- Staff []struct {
- Title string `json:"title"`
- Name string `json:"name"`
- Follower int `json:"follower"`
- } `json:"staff"`
- } `json:"data"`
-}
-
-type owner struct {
- Data struct {
- Card struct {
- Fans int `json:"fans"`
- } `json:"card"`
- } `json:"data"`
-}
-
-const (
- videoapi = "https://api.bilibili.com/x/web-interface/view?"
- cardapi = "http://api.bilibili.com/x/web-interface/card?"
- origin = "https://www.bilibili.com/video/"
-)
-
-var (
- reg = regexp.MustCompile(`https://www.bilibili.com/video/([0-9a-zA-Z]+)`)
- limit = ctxext.NewLimiterManager(time.Second*10, 1)
-)
-
-// 插件主体
-func init() {
- en := control.Register("bilibiliparse", &ctrl.Options[*zero.Ctx]{
- DisableOnDefault: false,
- Help: "b站视频链接解析\n" +
- "- https://www.bilibili.com/video/BV1xx411c7BF | https://www.bilibili.com/video/av1605 | https://b23.tv/I8uzWCA | https://www.bilibili.com/video/bv1xx411c7BF",
- })
- en.OnRegex(`(av[0-9]+|BV[0-9a-zA-Z]{10}){1}`).SetBlock(true).Limit(limit.LimitByGroup).
- Handle(func(ctx *zero.Ctx) {
- if strings.Contains(ctx.MessageString(), "[CQ:forward") {
- return
- }
- id := ctx.State["regex_matched"].([]string)[1]
- m, err := parse(id)
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- ctx.Send(m)
- })
- en.OnRegex(`https://www.bilibili.com/video/([0-9a-zA-Z]+)`).SetBlock(true).Limit(limit.LimitByGroup).
- Handle(func(ctx *zero.Ctx) {
- id := ctx.State["regex_matched"].([]string)[1]
- m, err := parse(id)
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- ctx.Send(m)
- })
- en.OnRegex(`(https://b23.tv/[0-9a-zA-Z]+)`).SetBlock(true).Limit(limit.LimitByGroup).
- Handle(func(ctx *zero.Ctx) {
- url := ctx.State["regex_matched"].([]string)[1]
- realurl, err := getrealurl(url)
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- m, err := parse(cuturl(realurl))
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- ctx.Send(m)
- })
-}
-
-// parse 解析视频数据
-func parse(id string) (m message.Message, err error) {
- var vid string
- switch id[:2] {
- case "av":
- vid = "aid=" + id[2:]
- case "BV":
- vid = "bvid=" + id
- }
- data, err := web.GetData(videoapi + vid)
- if err != nil {
- return
- }
- var r result
- err = json.Unmarshal(data, &r)
- if err != nil {
- return
- }
- m = make(message.Message, 0, 16)
- m = append(m, message.Text("标题: ", r.Data.Title, "\n"))
- if r.Data.Rights.IsCooperation == 1 {
- for i := 0; i < len(r.Data.Staff); i++ {
- m = append(m, message.Text(r.Data.Staff[i].Title, ": ", r.Data.Staff[i].Name, ", 粉丝: ", row(r.Data.Staff[i].Follower), "\n"))
- }
- } else {
- o, err := getcard(r.Data.Owner.Mid)
- if err != nil {
- return m, err
- }
- m = append(m, message.Text("UP主: ", r.Data.Owner.Name, ", 粉丝: ", row(o.Data.Card.Fans), "\n"))
- }
- m = append(m, message.Text("播放: ", row(r.Data.Stat.View), ", 弹幕: ", row(r.Data.Stat.Danmaku), "\n"),
- message.Image(r.Data.Pic),
- message.Text("\n点赞: ", row(r.Data.Stat.Like), ", 投币: ", row(r.Data.Stat.Coin), "\n收藏: ", row(r.Data.Stat.Favorite), ", 分享: ", row(r.Data.Stat.Share), "\n", origin, id))
- return
-}
-
-// getrealurl 获取跳转后的链接
-func getrealurl(url string) (realurl string, err error) {
- data, err := http.Head(url)
- if err != nil {
- return
- }
- realurl = data.Request.URL.String()
- return
-}
-
-// cuturl 获取aid或者bvid
-func cuturl(url string) (id string) {
- if !reg.MatchString(url) {
- return
- }
- return reg.FindStringSubmatch(url)[1]
-}
-
-// getcard 获取个人信息
-func getcard(mid int) (o owner, err error) {
- data, err := web.GetData(cardapi + "mid=" + strconv.Itoa(mid))
- if err != nil {
- return
- }
- err = json.Unmarshal(data, &o)
- return
-}
-
-func row(res int) string {
- if res/10000 != 0 {
- return strconv.FormatFloat(float64(res)/10000, 'f', 2, 64) + "万"
- }
- return strconv.Itoa(res)
-}
diff --git a/plugin/gif/gif.go b/plugin/gif/gif.go
index 406b144395..4389502c43 100644
--- a/plugin/gif/gif.go
+++ b/plugin/gif/gif.go
@@ -12,6 +12,7 @@ import (
// mo 摸
func mo(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -48,6 +49,7 @@ func mo(cc *context, value ...string) (string, error) {
// cuo 搓
func cuo(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -88,6 +90,7 @@ func cuo(cc *context, value ...string) (string, error) {
// qiao 敲
func qiao(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -121,6 +124,7 @@ func qiao(cc *context, value ...string) (string, error) {
// chi 吃
func chi(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -155,6 +159,7 @@ func chi(cc *context, value ...string) (string, error) {
// ceng 蹭
func ceng(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -196,6 +201,7 @@ func ceng(cc *context, value ...string) (string, error) {
// ken 啃
func ken(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -243,6 +249,7 @@ func ken(cc *context, value ...string) (string, error) {
// pai 拍
func pai(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -276,6 +283,7 @@ func pai(cc *context, value ...string) (string, error) {
// xqe 冲
func xqe(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -309,6 +317,7 @@ func xqe(cc *context, value ...string) (string, error) {
// diu 丢
func diu(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -348,6 +357,7 @@ func diu(cc *context, value ...string) (string, error) {
// kiss 亲
func kiss(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -386,6 +396,7 @@ func kiss(cc *context, value ...string) (string, error) {
// garbage 垃圾 垃圾桶
func garbage(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -418,6 +429,7 @@ func garbage(cc *context, value ...string) (string, error) {
// thump 捶
func thump(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -450,6 +462,7 @@ func thump(cc *context, value ...string) (string, error) {
// jiujiu 啾啾
func jiujiu(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -481,6 +494,7 @@ func jiujiu(cc *context, value ...string) (string, error) {
// knock 2敲
func knock(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -513,6 +527,7 @@ func knock(cc *context, value ...string) (string, error) {
// 听音乐 listenMusic
func listenMusic(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -544,6 +559,7 @@ func listenMusic(cc *context, value ...string) (string, error) {
// loveYou 永远爱你
func loveYou(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -576,6 +592,7 @@ func loveYou(cc *context, value ...string) (string, error) {
// pat 2拍
func pat(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -617,6 +634,7 @@ func pat(cc *context, value ...string) (string, error) {
// jackUp 顶
func jackUp(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -659,6 +677,7 @@ func jackUp(cc *context, value ...string) (string, error) {
// pound 捣
func pound(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -691,6 +710,7 @@ func pound(cc *context, value ...string) (string, error) {
// punch 打拳
func punch(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -723,6 +743,7 @@ func punch(cc *context, value ...string) (string, error) {
// roll 滚
func roll(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -755,6 +776,7 @@ func roll(cc *context, value ...string) (string, error) {
// suck 吸 嗦
func suck(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -787,6 +809,7 @@ func suck(cc *context, value ...string) (string, error) {
// hammer 锤
func hammer(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -819,6 +842,7 @@ func hammer(cc *context, value ...string) (string, error) {
// tightly 紧贴 紧紧贴着
func tightly(cc *context, value ...string) (string, error) {
+ _ = value
var wg sync.WaitGroup
var err error
var m sync.Mutex
@@ -851,6 +875,7 @@ func tightly(cc *context, value ...string) (string, error) {
// turn 转
func turn(cc *context, value ...string) (string, error) {
+ _ = value
name := cc.usrdir + "Turn.gif"
face, err := cc.getLogo(0, 0)
if err != nil {
diff --git a/plugin/gif/png.go b/plugin/gif/png.go
index 1f7b74bca3..4321aa283d 100644
--- a/plugin/gif/png.go
+++ b/plugin/gif/png.go
@@ -17,6 +17,7 @@ import (
// pa 爬
func pa(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "爬.png"
tou, err := cc.getLogo(0, 0)
if err != nil {
@@ -43,6 +44,7 @@ func pa(cc *context, args ...string) (string, error) {
// si 撕
func si(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "撕.png"
tou, err := cc.getLogo(0, 0)
if err != nil {
@@ -69,6 +71,7 @@ func si(cc *context, args ...string) (string, error) {
// flipV 上翻,下翻
func flipV(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "FlipV.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -81,6 +84,7 @@ func flipV(cc *context, args ...string) (string, error) {
// flipH 左翻,右翻
func flipH(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "FlipH.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -93,6 +97,7 @@ func flipH(cc *context, args ...string) (string, error) {
// invert 反色
func invert(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "Invert.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -105,6 +110,7 @@ func invert(cc *context, args ...string) (string, error) {
// blur 反色
func blur(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "Blur.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -117,6 +123,7 @@ func blur(cc *context, args ...string) (string, error) {
// grayscale 灰度
func grayscale(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "Grayscale.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -129,6 +136,7 @@ func grayscale(cc *context, args ...string) (string, error) {
// invertAndGrayscale 负片
func invertAndGrayscale(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "InvertAndGrayscale.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -141,6 +149,7 @@ func invertAndGrayscale(cc *context, args ...string) (string, error) {
// convolve3x3 浮雕
func convolve3x3(cc *context, args ...string) (string, error) {
+ _ = args
name := cc.usrdir + "Convolve3x3.png"
// 加载图片
im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0)
@@ -186,6 +195,7 @@ func deformation(cc *context, args ...string) (string, error) {
// alike 你像个xxx一样
func alike(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -213,6 +223,7 @@ func alike(cc *context, args ...string) (string, error) {
// marriage
func marriage(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -331,6 +342,7 @@ func alwaysLike(cc *context, args ...string) (string, error) {
// decentKiss 像样的亲亲
func decentKiss(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -358,6 +370,7 @@ func decentKiss(cc *context, args ...string) (string, error) {
// chinaFlag 国旗
func chinaFlag(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -385,6 +398,7 @@ func chinaFlag(cc *context, args ...string) (string, error) {
// dontTouch 不要靠近
func dontTouch(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -490,6 +504,7 @@ func interview(cc *context, args ...string) (string, error) {
// need 需要 你可能需要
func need(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -517,6 +532,7 @@ func need(cc *context, args ...string) (string, error) {
// paint 这像画吗
func paint(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -544,6 +560,7 @@ func paint(cc *context, args ...string) (string, error) {
// painter 小画家
func painter(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -571,6 +588,7 @@ func painter(cc *context, args ...string) (string, error) {
// perfect 完美
func perfect(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -643,6 +661,7 @@ func playGame(cc *context, args ...string) (string, error) {
// police 出警
func police(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -670,6 +689,7 @@ func police(cc *context, args ...string) (string, error) {
// police1 警察
func police1(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -697,6 +717,7 @@ func police1(cc *context, args ...string) (string, error) {
// prpr 舔 舔屏 prpr
func prpr(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -771,6 +792,7 @@ func safeSense(cc *context, args ...string) (string, error) {
// support 精神支柱
func support(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -798,6 +820,7 @@ func support(cc *context, args ...string) (string, error) {
// thinkwhat 想什么
func thinkwhat(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -825,6 +848,7 @@ func thinkwhat(cc *context, args ...string) (string, error) {
// wallpaper 墙纸
func wallpaper(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -852,6 +876,7 @@ func wallpaper(cc *context, args ...string) (string, error) {
// whyatme 为什么at我
func whyatme(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -927,6 +952,7 @@ func makeFriend(cc *context, args ...string) (string, error) {
// backToWork 打工人, 继续干活
func backToWork(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -1004,6 +1030,7 @@ func coupon(cc *context, args ...string) (string, error) {
// distracted 注意力涣散
func distracted(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
@@ -1031,6 +1058,7 @@ func distracted(cc *context, args ...string) (string, error) {
// throw 扔
func throw(cc *context, args ...string) (string, error) {
+ _ = args
var wg sync.WaitGroup
var m sync.Mutex
var err error
diff --git a/plugin/github/repo_searcher.go b/plugin/github/repo_searcher.go
index 06baa6e1b9..227fb7378b 100644
--- a/plugin/github/repo_searcher.go
+++ b/plugin/github/repo_searcher.go
@@ -61,9 +61,9 @@ func init() { // 插件主体
"Star/Fork/Issue: ",
repo.Get("watchers").Int(), "/", repo.Get("forks").Int(), "/", repo.Get("open_issues").Int(), "\n",
"Language: ",
- notnull(repo.Get("language").Str, "None"), "\n",
+ notnull(repo.Get("language").Str), "\n",
"License: ",
- notnull(strings.ToUpper(repo.Get("license.key").Str), "None"), "\n",
+ notnull(strings.ToUpper(repo.Get("license.key").Str)), "\n",
"Last pushed: ",
repo.Get("pushed_at").Str, "\n",
"Jump: ",
@@ -79,9 +79,9 @@ func init() { // 插件主体
"Star/Fork/Issue: ",
repo.Get("watchers").Int(), "/", repo.Get("forks").Int(), "/", repo.Get("open_issues").Int(), "\n",
"Language: ",
- notnull(repo.Get("language").Str, "None"), "\n",
+ notnull(repo.Get("language").Str), "\n",
"License: ",
- notnull(strings.ToUpper(repo.Get("license.key").Str), "None"), "\n",
+ notnull(strings.ToUpper(repo.Get("license.key").Str)), "\n",
"Last pushed: ",
repo.Get("pushed_at").Str, "\n",
"Jump: ",
@@ -97,9 +97,9 @@ func init() { // 插件主体
// notnull 如果传入文本为空,则返回默认值
-func notnull(text, defstr string) string {
+func notnull(text string) string {
if text == "" {
- return defstr
+ return "None"
}
return text
}