v0版本不保证对外函数、结构的不变性,请勿大规模用于生产环境
BiliBili API 的 Golang 实现,目前已经实现了 100+ API,还在进一步更新中
- 良好的设计,支持自定义
client与UA - 完善的单元测试,易懂的函数命名,极少的第三方库依赖
- 代码、结构体注释完善,无需文档开箱即用
- 其他功能性代码,例如
AV/BV互转,GetVideoZone()获取分区信息... - 配套工具 biligo-live 封装直播
WebSocket协议
- 该项目永远不会编写直接涉及滥用的接口
- 该项目仅供学习,请勿用于商业用途。任何使用该项目造成的后果由开发者自行承担
感谢以下所有项目的贡献者
https://github.com/SocialSisterYi/bilibili-API-collect
https://github.com/MoyuScript/bilibili-api
请让 biligo 永远保持在最新版本
go get -u github.com/iyear/biligoimport "github.com/iyear/biligo"package main
import (
"fmt"
bg "github.com/iyear/biligo"
"log"
)
func main() {
b, err := bg.NewBiliClient(&bg.BiliSetting{
// 均来自Web登录的Cookie
Auth: &bg.CookieAuth{
// DedeUserID
DedeUserID: "YOUR_DedeUserID",
// SESSDATA
SESSDATA: "YOUR_SESSDATA",
// bili_jct
BiliJCT: "YOUR_BiliJCT",
// DedeUserID__ckMd5
DedeUserIDCkMd5: "YOUR_DedeUserIdCkMd5",
},
// DEBUG 模式将输出请求和响应
DebugMode: true,
// Client: myClient,
// UserAgent: "My UA",
})
if err != nil {
log.Fatal("failed to make new bili client; error: ", err)
return
}
fmt.Printf("mid: %d, uname: %s,userID: %s,rank: %s\n", b.Me.MID, b.Me.UName, b.Me.UserID, b.Me.Rank)
fmt.Printf("birthday: %s,sex: %s\n", b.Me.Birthday, b.Me.Sex)
fmt.Printf("sign: %s\n", b.Me.Sign)
}同目录下的 example 文件夹
共有两种 Client
一种为 BiliClient,必须提供有效的 Auth 信息,公共接口不在此提供
另一种为 CommClient ,只提供公共接口
一些接口同时在两种 Client 中,因为其中某些字段在登录与非登录状态下有所区别
除了维护API列表、
example目录、测试文件,不会有任何其他的专用文档。请利用好注释和测试。
常规的函数命名方式
由于API众多,函数名显得冗长。只能尽可能简化,但不会失去原有语义,这是无文档的基础
除无对应分类的API外,其余对应分类API均以 分类名+动作+描述 命名
无对应分类的API以 动作+描述 命名 例如: VideoGetTags VideoIsFavoured VideoSetFavour
Video-视频Audio-音频Fav-收藏夹Chan-频道Space-个人空间Danmaku-弹幕Emote-表情Charge-充电Dyna-动态Live-直播Followings-关注
结构体编写规范
嵌套可分离可不分离,结构体和数组用指针。
具体看 types.go 即可
只要以下名词出现在该库的任何地方,可能将不做任何解释,请提交PR时尽可能遵守以下约定
aid-稿件av(库中所有参数均使用aid,bvid请开发者自行使用BV2AV())cid-稿件分P的ID(单P视频中aid≠cid) 或频道IDmid-B站IDmlid-收藏夹IDauid-音频IDdmid-弹幕IDdyid-动态IDdfid-定时发布动态IDoid- 根据上下文不同分别指代以上不同的ID,具体看注释ID而不是IdURL而不是Url
关于大接口
对于评论、搜索这种超大的响应,可能不会做对应的接口,一方面这种接口经常变更,另一方面大多数的响应字段是无用的,所以请开发者自行使用 Raw() or RawParse() + gjson 获取需要的数据
示例:
package main
import (
"fmt"
bg "github.com/iyear/biligo"
"github.com/tidwall/gjson"
"log"
)
func GetComments() {
resp, err := bg.NewCommClient(&bg.CommSetting{}).RawParse(
bg.BiliApiURL,
"x/v2/reply/main",
"GET",
map[string]string{
"next": "0",
"type": "1",
"oid": "591018280",
"mode": "3",
"plat": "1",
},
)
if err != nil {
log.Println(err)
return
}
for i, r := range gjson.Get(string(resp.Data), "replies.#.content.message").Array() {
fmt.Printf("[%d] %s\n\n", i+1, r.String())
}
}- 这个库的日常维护基本都是体力活
- 安全水平有限,部分新接口我无法分析
- 欢迎
typo和 完善注释、文档的PR - 不接受无脑无贡献的催更
- 尽量遵守约定提交PR
- 由于项目特殊性,随时可能删库,随时可能弃坑
这个库是在暑假开始写的,其实写到一半已经不想写了,90%的代码都是在重复着查接口、写响应结构体、测试的过程,只是看到 python 有一套还在更新的 SDK,想着还是为 Golang 也写一套
后来某天突然想把这个项目给弄完 ,所以目前动态与直播的部分基本没写
map[string]string 而不是 map[string]interface{} 因为在这个项目里 interface{} 的无约束很容易在一些特定的参数下忘记转换。
GPL