mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-20 22:40:23 +08:00
🎨 更新代码
This commit is contained in:
parent
04593e2147
commit
f9f7fa08fb
@ -85,11 +85,8 @@
|
|||||||
- [x] 设置随机图片网址[url]
|
- [x] 设置随机图片网址[url]
|
||||||
- [x] 太涩了(撤回最近发的图)
|
- [x] 太涩了(撤回最近发的图)
|
||||||
- [x] 评价图片:发送一张图片进行评分
|
- [x] 评价图片:发送一张图片进行评分
|
||||||
- 关注bilibili的DD功能 `暂时失效`
|
- bilibili `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_bilibili"`
|
||||||
- [x] /查 uid: 通过uid查询成分(与关注了2000uvp小号的共同关注)
|
- [x] >bili info [名字]
|
||||||
- [x] /查 name: 通过名字查询成分(与关注了2000uvp小号的共同关注)
|
|
||||||
- [x] /粉丝 name:查询粉丝实时数据(例:/粉丝 嘉然)
|
|
||||||
- [x] /搜索 name:通过名字查询用户uid
|
|
||||||
- 嘉然 `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_diana"`
|
- 嘉然 `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_diana"`
|
||||||
- [x] @BOT 小作文
|
- [x] @BOT 小作文
|
||||||
- [x] @BOT 发大病
|
- [x] @BOT 发大病
|
||||||
|
|||||||
107
fensi/cha.go
107
fensi/cha.go
@ -1,107 +0,0 @@
|
|||||||
package fensi
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
zero "github.com/wdvxdr1123/ZeroBot"
|
|
||||||
"github.com/wdvxdr1123/ZeroBot/message"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
zero.OnRegex(`^/查 (.{1,25})$`).
|
|
||||||
Handle(func(ctx *zero.Ctx) {
|
|
||||||
keyword := ctx.State["regex_matched"].([]string)[1]
|
|
||||||
uid := searchapi(keyword).Data.Result[0].Mid
|
|
||||||
|
|
||||||
if searchapi(keyword).Data.NumResults == 0 {
|
|
||||||
ctx.Send("名字没搜到")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
accinfojson := accinfo(strconv.Itoa(uid))
|
|
||||||
hanjian := follow(strconv.Itoa(uid))
|
|
||||||
ctx.SendChain(message.Text(
|
|
||||||
"uid: ", accinfojson.Data.Mid, "\n",
|
|
||||||
"name: ", accinfojson.Data.Name, "\n",
|
|
||||||
"sex: ", accinfojson.Data.Sex, "\n",
|
|
||||||
"sign: ", accinfojson.Data.Sign, "\n",
|
|
||||||
"level: ", accinfojson.Data.Level, "\n",
|
|
||||||
"birthday: ", accinfojson.Data.Birthday, "\n",
|
|
||||||
"follow: ", gjson.Get(hanjian, "data.list.#.uname"),
|
|
||||||
))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
zero.OnRegex(`^/查UID:(.{1,25})$`).
|
|
||||||
Handle(func(ctx *zero.Ctx) {
|
|
||||||
uid := ctx.State["regex_matched"].([]string)[1]
|
|
||||||
accinfojson := accinfo(uid)
|
|
||||||
hanjian := follow(uid)
|
|
||||||
status := accinfojson.Code
|
|
||||||
|
|
||||||
if status != 0 {
|
|
||||||
ctx.Send("UID非法")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.SendChain(message.Text(
|
|
||||||
"uid: ", accinfojson.Data.Mid, "\n",
|
|
||||||
"name: ", accinfojson.Data.Name, "\n",
|
|
||||||
"sex: ", accinfojson.Data.Sex, "\n",
|
|
||||||
"sign: ", accinfojson.Data.Sign, "\n",
|
|
||||||
"level: ", accinfojson.Data.Level, "\n",
|
|
||||||
"birthday: ", accinfojson.Data.Birthday, "\n",
|
|
||||||
"follow: ", gjson.Get(hanjian, "data.list.#.uname"),
|
|
||||||
))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func accinfo(uid string) *accInfo {
|
|
||||||
|
|
||||||
url := "http://api.bilibili.com/x/space/acc/info?mid=" + uid
|
|
||||||
resp, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
result := &accInfo{}
|
|
||||||
if err := json.NewDecoder(resp.Body).Decode(result); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func follow(uid string) string {
|
|
||||||
|
|
||||||
url := "https://api.bilibili.com/x/relation/same/followings?vmid=" + uid
|
|
||||||
method := "GET"
|
|
||||||
|
|
||||||
client := &http.Client {
|
|
||||||
}
|
|
||||||
req, err := http.NewRequest(method, url, nil)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
req.Header.Add("cookie", "CURRENT_FNVAL=80; _uuid=772B88E8-3ED1-D589-29BB-F6CB5214239A06137infoc; blackside_state=1; bfe_id=6f285c892d9d3c1f8f020adad8bed553; rpdid=|(umY~Jkl|kJ0J'uYkR|)lu|); fingerprint=0ec2b1140fb30b56d7b5e415bc3b5fb1; buvid_fp=C91F5265-3DF4-4D5A-9FF3-C546370B14C0143096infoc; buvid_fp_plain=C91F5265-3DF4-4D5A-9FF3-C546370B14C0143096infoc; SESSDATA=9e0266f6%2C1639637127%2Cb0172%2A61; bili_jct=96ddbd7e22d527abdc0501339a12d4d3; DedeUserID=695737880; DedeUserID__ckMd5=0117660e75db7b01; sid=5labuhaf; PVID=1; bfe_id=1e33d9ad1cb29251013800c68af42315")
|
|
||||||
|
|
||||||
res, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(res.Body)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
return string(body)
|
|
||||||
}
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
package fensi
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
zero "github.com/wdvxdr1123/ZeroBot"
|
|
||||||
"github.com/wdvxdr1123/ZeroBot/message"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
zero.OnRegex(`^/粉丝 (.{1,25})$`).
|
|
||||||
Handle(func(ctx *zero.Ctx) {
|
|
||||||
keyword := ctx.State["regex_matched"].([]string)[1]
|
|
||||||
uid := searchapi(keyword).Data.Result[0].Mid
|
|
||||||
fensijson := fensiapi(strconv.Itoa(uid))
|
|
||||||
ctx.SendChain(message.Text(
|
|
||||||
"uid: ", fensijson.Mid, "\n",
|
|
||||||
"名字: ", fensijson.Uname, "\n",
|
|
||||||
"当前粉丝数: ", fensijson.Follower, "\n",
|
|
||||||
"24h涨粉数: ", fensijson.Rise, "\n",
|
|
||||||
"视频投稿数: ", fensijson.Video, "\n",
|
|
||||||
"直播间id: ", fensijson.Roomid, "\n",
|
|
||||||
"舰队: ", fensijson.GuardNum, "\n",
|
|
||||||
"直播总排名: ", fensijson.AreaRank, "\n",
|
|
||||||
"数据来源: ", "https://vtbs.moe/detail/", uid, "\n",
|
|
||||||
"数据获取时间: ", timeStamp(),
|
|
||||||
))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
zero.OnRegex(`^/info (.{1,25})$`).
|
|
||||||
Handle(func(ctx *zero.Ctx) {
|
|
||||||
keyword := ctx.State["regex_matched"].([]string)[1]
|
|
||||||
uid := searchapi(keyword).Data.Result[0].Mid
|
|
||||||
fensijson := fensiapi(strconv.Itoa(uid))
|
|
||||||
ctx.SendChain(message.Text(
|
|
||||||
"uid: ", fensijson.Mid, "\n",
|
|
||||||
"名字: ", fensijson.Uname, "\n",
|
|
||||||
"当前粉丝数: ", fensijson.Follower, "\n",
|
|
||||||
"24h涨粉数: ", fensijson.Rise, "\n",
|
|
||||||
"视频投稿数: ", fensijson.Video, "\n",
|
|
||||||
"直播间id: ", fensijson.Roomid, "\n",
|
|
||||||
"舰队: ", fensijson.GuardNum, "\n",
|
|
||||||
"直播总排名: ", fensijson.AreaRank, "\n",
|
|
||||||
"数据来源: ", "https://vtbs.moe/detail/", uid, "\n",
|
|
||||||
"数据获取时间: ", timeStamp(),
|
|
||||||
))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func fensiapi(uid string) *follower {
|
|
||||||
|
|
||||||
url := "https://api.vtbs.moe/v1/detail/" + uid
|
|
||||||
resp, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
result := &follower{}
|
|
||||||
if err := json.NewDecoder(resp.Body).Decode(result); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func timeStamp() string{
|
|
||||||
unixtime := time.Now().Unix()
|
|
||||||
timestamp := time.Unix(unixtime, 0)
|
|
||||||
return timestamp.Format("2006-01-02 15:04:05")
|
|
||||||
}
|
|
||||||
@ -1,57 +0,0 @@
|
|||||||
package fensi
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
zero "github.com/wdvxdr1123/ZeroBot"
|
|
||||||
"github.com/wdvxdr1123/ZeroBot/message"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
zero.OnRegex(`^/搜索 (.*)$`).
|
|
||||||
Handle(func(ctx *zero.Ctx) {
|
|
||||||
keyword := ctx.State["regex_matched"].([]string)[1]
|
|
||||||
searchJson := searchapi(keyword)
|
|
||||||
|
|
||||||
if searchapi(keyword).Data.NumResults == 0 {
|
|
||||||
ctx.Send("名字没搜到")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if searchapi(keyword).Data.NumResults < 5 {
|
|
||||||
ctx.SendChain(message.Text(
|
|
||||||
"uid: ", searchJson.Data.Result[0].Mid, "\n",
|
|
||||||
"name: ", searchJson.Data.Result[0].Uname, "\n",
|
|
||||||
))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.SendChain(message.Text(
|
|
||||||
"搜索结果很多,请尽量准确关键字,以下为你返回前5条结果", "\n\n",
|
|
||||||
"uid1: ", searchJson.Data.Result[0].Mid, "\n",
|
|
||||||
"name1: ", searchJson.Data.Result[0].Uname, "\n\n",
|
|
||||||
"uid2: ", searchJson.Data.Result[1].Mid, "\n",
|
|
||||||
"name2: ", searchJson.Data.Result[1].Uname, "\n\n",
|
|
||||||
"uid3: ", searchJson.Data.Result[2].Mid, "\n",
|
|
||||||
"name3: ", searchJson.Data.Result[2].Uname, "\n\n",
|
|
||||||
"uid4: ", searchJson.Data.Result[3].Mid, "\n",
|
|
||||||
"name4: ", searchJson.Data.Result[3].Uname, "\n\n",
|
|
||||||
"uid5: ", searchJson.Data.Result[4].Mid, "\n",
|
|
||||||
"name5: ", searchJson.Data.Result[4].Uname,
|
|
||||||
))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func searchapi(keyword string) *search {
|
|
||||||
url := "http://api.bilibili.com/x/web-interface/search/type?search_type=bili_user&&user_type=1&keyword=" + keyword
|
|
||||||
resp, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
result := &search{}
|
|
||||||
if err := json.NewDecoder(resp.Body).Decode(result); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
@ -1,235 +0,0 @@
|
|||||||
package fensi
|
|
||||||
|
|
||||||
// 搜索api的json结构体
|
|
||||||
type search struct {
|
|
||||||
Code int `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
TTL int `json:"ttl"`
|
|
||||||
Data struct {
|
|
||||||
Seid string `json:"seid"`
|
|
||||||
Page int `json:"page"`
|
|
||||||
Pagesize int `json:"pagesize"`
|
|
||||||
NumResults int `json:"numResults"`
|
|
||||||
NumPages int `json:"numPages"`
|
|
||||||
SuggestKeyword string `json:"suggest_keyword"`
|
|
||||||
RqtType string `json:"rqt_type"`
|
|
||||||
CostTime struct {
|
|
||||||
ParamsCheck string `json:"params_check"`
|
|
||||||
GetUpuserLiveStatus string `json:"get upuser live status"`
|
|
||||||
IllegalHandler string `json:"illegal_handler"`
|
|
||||||
AsResponseFormat string `json:"as_response_format"`
|
|
||||||
AsRequest string `json:"as_request"`
|
|
||||||
SaveCache string `json:"save_cache"`
|
|
||||||
DeserializeResponse string `json:"deserialize_response"`
|
|
||||||
AsRequestFormat string `json:"as_request_format"`
|
|
||||||
Total string `json:"total"`
|
|
||||||
MainHandler string `json:"main_handler"`
|
|
||||||
} `json:"cost_time"`
|
|
||||||
ExpList interface{} `json:"exp_list"`
|
|
||||||
EggHit int `json:"egg_hit"`
|
|
||||||
Result []struct {
|
|
||||||
Type string `json:"type"`
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
Usign string `json:"usign"`
|
|
||||||
Fans int `json:"fans"`
|
|
||||||
Videos int `json:"videos"`
|
|
||||||
Upic string `json:"upic"`
|
|
||||||
VerifyInfo string `json:"verify_info"`
|
|
||||||
Level int `json:"level"`
|
|
||||||
Gender int `json:"gender"`
|
|
||||||
IsUpuser int `json:"is_upuser"`
|
|
||||||
IsLive int `json:"is_live"`
|
|
||||||
RoomID int `json:"room_id"`
|
|
||||||
Res []struct {
|
|
||||||
Aid int `json:"aid"`
|
|
||||||
Bvid string `json:"bvid"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
Pubdate int `json:"pubdate"`
|
|
||||||
Arcurl string `json:"arcurl"`
|
|
||||||
Pic string `json:"pic"`
|
|
||||||
Play string `json:"play"`
|
|
||||||
Dm int `json:"dm"`
|
|
||||||
Coin int `json:"coin"`
|
|
||||||
Fav int `json:"fav"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
Duration string `json:"duration"`
|
|
||||||
IsPay int `json:"is_pay"`
|
|
||||||
IsUnionVideo int `json:"is_union_video"`
|
|
||||||
} `json:"res"`
|
|
||||||
OfficialVerify struct {
|
|
||||||
Type int `json:"type"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
} `json:"official_verify"`
|
|
||||||
HitColumns []interface{} `json:"hit_columns"`
|
|
||||||
} `json:"result"`
|
|
||||||
ShowColumn int `json:"show_column"`
|
|
||||||
} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 账号信息api的json结构体
|
|
||||||
type accInfo struct {
|
|
||||||
Code int `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
TTL int `json:"ttl"`
|
|
||||||
Data struct {
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Sex string `json:"sex"`
|
|
||||||
Face string `json:"face"`
|
|
||||||
Sign string `json:"sign"`
|
|
||||||
Rank int `json:"rank"`
|
|
||||||
Level int `json:"level"`
|
|
||||||
Jointime int `json:"jointime"`
|
|
||||||
Moral int `json:"moral"`
|
|
||||||
Silence int `json:"silence"`
|
|
||||||
Birthday string `json:"birthday"`
|
|
||||||
Coins int `json:"coins"`
|
|
||||||
FansBadge bool `json:"fans_badge"`
|
|
||||||
Official struct {
|
|
||||||
Role int `json:"role"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
Type int `json:"type"`
|
|
||||||
} `json:"official"`
|
|
||||||
Vip struct {
|
|
||||||
Type int `json:"type"`
|
|
||||||
Status int `json:"status"`
|
|
||||||
DueDate int64 `json:"due_date"`
|
|
||||||
VipPayType int `json:"vip_pay_type"`
|
|
||||||
ThemeType int `json:"theme_type"`
|
|
||||||
Label struct {
|
|
||||||
Path string `json:"path"`
|
|
||||||
Text string `json:"text"`
|
|
||||||
LabelTheme string `json:"label_theme"`
|
|
||||||
TextColor string `json:"text_color"`
|
|
||||||
BgStyle int `json:"bg_style"`
|
|
||||||
BgColor string `json:"bg_color"`
|
|
||||||
BorderColor string `json:"border_color"`
|
|
||||||
} `json:"label"`
|
|
||||||
AvatarSubscript int `json:"avatar_subscript"`
|
|
||||||
NicknameColor string `json:"nickname_color"`
|
|
||||||
Role int `json:"role"`
|
|
||||||
AvatarSubscriptURL string `json:"avatar_subscript_url"`
|
|
||||||
} `json:"vip"`
|
|
||||||
Pendant struct {
|
|
||||||
Pid int `json:"pid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Image string `json:"image"`
|
|
||||||
Expire int `json:"expire"`
|
|
||||||
ImageEnhance string `json:"image_enhance"`
|
|
||||||
ImageEnhanceFrame string `json:"image_enhance_frame"`
|
|
||||||
} `json:"pendant"`
|
|
||||||
Nameplate struct {
|
|
||||||
Nid int `json:"nid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Image string `json:"image"`
|
|
||||||
ImageSmall string `json:"image_small"`
|
|
||||||
Level string `json:"level"`
|
|
||||||
Condition string `json:"condition"`
|
|
||||||
} `json:"nameplate"`
|
|
||||||
UserHonourInfo struct {
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
Colour interface{} `json:"colour"`
|
|
||||||
Tags interface{} `json:"tags"`
|
|
||||||
} `json:"user_honour_info"`
|
|
||||||
IsFollowed bool `json:"is_followed"`
|
|
||||||
TopPhoto string `json:"top_photo"`
|
|
||||||
Theme struct {
|
|
||||||
} `json:"theme"`
|
|
||||||
SysNotice struct {
|
|
||||||
} `json:"sys_notice"`
|
|
||||||
LiveRoom struct {
|
|
||||||
RoomStatus int `json:"roomStatus"`
|
|
||||||
LiveStatus int `json:"liveStatus"`
|
|
||||||
URL string `json:"url"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
Cover string `json:"cover"`
|
|
||||||
Online int `json:"online"`
|
|
||||||
Roomid int `json:"roomid"`
|
|
||||||
RoundStatus int `json:"roundStatus"`
|
|
||||||
BroadcastType int `json:"broadcast_type"`
|
|
||||||
} `json:"live_room"`
|
|
||||||
} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
//共同关注api的json结构体
|
|
||||||
type followings struct {
|
|
||||||
Code int `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
TTL int `json:"ttl"`
|
|
||||||
Data struct {
|
|
||||||
List []struct {
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
Attribute int `json:"attribute"`
|
|
||||||
Mtime int `json:"mtime"`
|
|
||||||
Tag interface{} `json:"tag"`
|
|
||||||
Special int `json:"special"`
|
|
||||||
ContractInfo struct {
|
|
||||||
IsContractor bool `json:"is_contractor"`
|
|
||||||
Ts int `json:"ts"`
|
|
||||||
IsContract bool `json:"is_contract"`
|
|
||||||
} `json:"contract_info"`
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
Face string `json:"face"`
|
|
||||||
Sign string `json:"sign"`
|
|
||||||
OfficialVerify struct {
|
|
||||||
Type int `json:"type"`
|
|
||||||
Desc string `json:"desc"`
|
|
||||||
} `json:"official_verify"`
|
|
||||||
Vip struct {
|
|
||||||
VipType int `json:"vipType"`
|
|
||||||
VipDueDate int64 `json:"vipDueDate"`
|
|
||||||
DueRemark string `json:"dueRemark"`
|
|
||||||
AccessStatus int `json:"accessStatus"`
|
|
||||||
VipStatus int `json:"vipStatus"`
|
|
||||||
VipStatusWarn string `json:"vipStatusWarn"`
|
|
||||||
ThemeType int `json:"themeType"`
|
|
||||||
Label struct {
|
|
||||||
Path string `json:"path"`
|
|
||||||
Text string `json:"text"`
|
|
||||||
LabelTheme string `json:"label_theme"`
|
|
||||||
TextColor string `json:"text_color"`
|
|
||||||
BgStyle int `json:"bg_style"`
|
|
||||||
BgColor string `json:"bg_color"`
|
|
||||||
BorderColor string `json:"border_color"`
|
|
||||||
} `json:"label"`
|
|
||||||
AvatarSubscript int `json:"avatar_subscript"`
|
|
||||||
NicknameColor string `json:"nickname_color"`
|
|
||||||
AvatarSubscriptURL string `json:"avatar_subscript_url"`
|
|
||||||
} `json:"vip"`
|
|
||||||
} `json:"list"`
|
|
||||||
ReVersion int64 `json:"re_version"`
|
|
||||||
Total int `json:"total"`
|
|
||||||
} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 粉丝信息api的json结构体
|
|
||||||
type follower struct {
|
|
||||||
Mid int `json:"mid"`
|
|
||||||
UUID string `json:"uuid"`
|
|
||||||
Uname string `json:"uname"`
|
|
||||||
Video int `json:"video"`
|
|
||||||
Roomid int `json:"roomid"`
|
|
||||||
Sign string `json:"sign"`
|
|
||||||
Notice string `json:"notice"`
|
|
||||||
Face string `json:"face"`
|
|
||||||
Rise int `json:"rise"`
|
|
||||||
TopPhoto string `json:"topPhoto"`
|
|
||||||
ArchiveView int `json:"archiveView"`
|
|
||||||
Follower int `json:"follower"`
|
|
||||||
LiveStatus int `json:"liveStatus"`
|
|
||||||
RecordNum int `json:"recordNum"`
|
|
||||||
GuardNum int `json:"guardNum"`
|
|
||||||
LastLive struct {
|
|
||||||
Online int `json:"online"`
|
|
||||||
Time int64 `json:"time"`
|
|
||||||
} `json:"lastLive"`
|
|
||||||
GuardChange int `json:"guardChange"`
|
|
||||||
GuardType []int `json:"guardType"`
|
|
||||||
AreaRank int `json:"areaRank"`
|
|
||||||
Online int `json:"online"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
Time int64 `json:"time"`
|
|
||||||
LiveStartTime int `json:"liveStartTime"`
|
|
||||||
}
|
|
||||||
3
main.go
3
main.go
@ -21,7 +21,8 @@ import (
|
|||||||
//_ "github.com/FloatTech/ZeroBot-ACGImage" //简易随机图片
|
//_ "github.com/FloatTech/ZeroBot-ACGImage" //简易随机图片
|
||||||
|
|
||||||
// 嘉然相关
|
// 嘉然相关
|
||||||
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_diana" // 嘉心糖发病
|
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_bilibili" //
|
||||||
|
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_diana" // 嘉心糖发病
|
||||||
|
|
||||||
// 二次元图片
|
// 二次元图片
|
||||||
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_lolicon" // lolicon 随机图片
|
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_lolicon" // lolicon 随机图片
|
||||||
|
|||||||
52
plugin_bilibili/info.go
Normal file
52
plugin_bilibili/info.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package fensi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
|
zero "github.com/wdvxdr1123/ZeroBot"
|
||||||
|
"github.com/wdvxdr1123/ZeroBot/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
zero.OnRegex(`^>bili info\s(.{1,25})$`).
|
||||||
|
Handle(func(ctx *zero.Ctx) {
|
||||||
|
keyword := ctx.State["regex_matched"].([]string)[1]
|
||||||
|
res, err := uid(keyword)
|
||||||
|
if err != nil {
|
||||||
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id := res.Get("data.result.0.mid").Int()
|
||||||
|
url := fmt.Sprintf("https://api.bilibili.com/x/relation/same/followings?vmid=%d", id)
|
||||||
|
client := &http.Client{}
|
||||||
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
if err != nil {
|
||||||
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req.Header.Add("cookie", "CURRENT_FNVAL=80; _uuid=772B88E8-3ED1-D589-29BB-F6CB5214239A06137infoc; blackside_state=1; bfe_id=6f285c892d9d3c1f8f020adad8bed553; rpdid=|(umY~Jkl|kJ0J'uYkR|)lu|); fingerprint=0ec2b1140fb30b56d7b5e415bc3b5fb1; buvid_fp=C91F5265-3DF4-4D5A-9FF3-C546370B14C0143096infoc; buvid_fp_plain=C91F5265-3DF4-4D5A-9FF3-C546370B14C0143096infoc; SESSDATA=9e0266f6%2C1639637127%2Cb0172%2A61; bili_jct=96ddbd7e22d527abdc0501339a12d4d3; DedeUserID=695737880; DedeUserID__ckMd5=0117660e75db7b01; sid=5labuhaf; PVID=1; bfe_id=1e33d9ad1cb29251013800c68af42315")
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.Body.Close()
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
ctx.SendChain(message.Text("ERROR: code ", resp.StatusCode))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
json := gjson.ParseBytes(data)
|
||||||
|
ctx.SendChain(message.Text(
|
||||||
|
"uid: ", res.Get("data.result.0.mid").Int(), "\n",
|
||||||
|
"name: ", res.Get("data.result.0.uname").Str, "\n",
|
||||||
|
"sex: ", []string{"", "", "女", "男"}[res.Get("data.result.0.gender").Int()], "\n",
|
||||||
|
"sign: ", res.Get("data.result.0.usign").Str, "\n",
|
||||||
|
"level: ", res.Get("data.result.0.level").Int(), "\n",
|
||||||
|
"follow: ", json.Get("data.list.#.uname"),
|
||||||
|
))
|
||||||
|
})
|
||||||
|
}
|
||||||
70
plugin_bilibili/live_info.go
Normal file
70
plugin_bilibili/live_info.go
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
package fensi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
|
zero "github.com/wdvxdr1123/ZeroBot"
|
||||||
|
"github.com/wdvxdr1123/ZeroBot/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
zero.OnRegex(`^>bili info\s?(.{1,25})$`).
|
||||||
|
Handle(func(ctx *zero.Ctx) {
|
||||||
|
keyword := ctx.State["regex_matched"].([]string)[1]
|
||||||
|
res, err := uid(keyword)
|
||||||
|
if err != nil {
|
||||||
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id := res.Get("data.result.0.mid").Int()
|
||||||
|
// 获取详情
|
||||||
|
api := fmt.Sprintf("https://api.vtbs.moe/v1/detail/%d", id)
|
||||||
|
resp, err := http.Get(api)
|
||||||
|
if err != nil {
|
||||||
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.Body.Close()
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
ctx.SendChain(message.Text("ERROR: code ", resp.StatusCode))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
json := gjson.ParseBytes(data)
|
||||||
|
ctx.SendChain(message.Text(
|
||||||
|
"uid: ", json.Get("mid").Int(), "\n",
|
||||||
|
"名字: ", json.Get("uname").Str, "\n",
|
||||||
|
"当前粉丝数: ", json.Get("follower").Int(), "\n",
|
||||||
|
"24h涨粉数: ", json.Get("rise").Int(), "\n",
|
||||||
|
"视频投稿数: ", json.Get("video").Int(), "\n",
|
||||||
|
"直播间id: ", json.Get("roomid").Int(), "\n",
|
||||||
|
"舰队: ", json.Get("guardNum").Int(), "\n",
|
||||||
|
"直播总排名: ", json.Get("areaRank").Int(), "\n",
|
||||||
|
"数据来源: ", "https://vtbs.moe/detail/", uid, "\n",
|
||||||
|
"数据获取时间: ", time.Now().Format("2006-01-02 15:04:05"),
|
||||||
|
))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func uid(keyword string) (gjson.Result, error) {
|
||||||
|
api := "http://api.bilibili.com/x/web-interface/search/type?search_type=bili_user&&user_type=1&keyword=" + keyword
|
||||||
|
resp, err := http.Get(api)
|
||||||
|
if err != nil {
|
||||||
|
return gjson.Result{}, err
|
||||||
|
}
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return gjson.Result{}, errors.New("code not 200")
|
||||||
|
}
|
||||||
|
data, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
resp.Body.Close()
|
||||||
|
json := gjson.ParseBytes(data)
|
||||||
|
if json.Get("data.numResults").Int() == 0 {
|
||||||
|
return gjson.Result{}, errors.New("查无此人")
|
||||||
|
}
|
||||||
|
return json, nil
|
||||||
|
}
|
||||||
@ -37,15 +37,18 @@ func init() {
|
|||||||
resp, err := http.Get(API)
|
resp, err := http.Get(API)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR: ", err))
|
ctx.SendChain(message.Text("ERROR: ", err))
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
ctx.SendChain(message.Text("ERROR: code ", resp.StatusCode))
|
ctx.SendChain(message.Text("ERROR: code ", resp.StatusCode))
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
data, _ := ioutil.ReadAll(resp.Body)
|
data, _ := ioutil.ReadAll(resp.Body)
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
json := gjson.ParseBytes(data)
|
json := gjson.ParseBytes(data)
|
||||||
if e := json.Get("error").Str; e != "" {
|
if e := json.Get("error").Str; e != "" {
|
||||||
ctx.SendChain(message.Text("ERROR: ", e))
|
ctx.SendChain(message.Text("ERROR: ", e))
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
url := json.Get("data.0.urls.original").Str
|
url := json.Get("data.0.urls.original").Str
|
||||||
ctx.SendGroupMessage(0, message.Image(url))
|
ctx.SendGroupMessage(0, message.Image(url))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user