Skip to content

iyear/biligo

Repository files navigation

简介

Go Reference

v0版本不保证对外函数、结构的不变性,请勿大规模用于生产环境

BiliBili APIGolang 实现,目前已经实现了 100+ API,还在进一步更新中

特性

  • 良好的设计,支持自定义 clientUA
  • 完善的单元测试,易懂的函数命名,极少的第三方库依赖
  • 代码、结构体注释完善,无需文档开箱即用
  • 其他功能性代码,例如 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/biligo
import "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 (库中所有参数均使用 aidbvid 请开发者自行使用 BV2AV())
  • cid - 稿件分P的ID (单P视频中aidcid) 或 频道ID
  • mid - B站ID
  • mlid - 收藏夹ID
  • auid - 音频ID
  • dmid - 弹幕ID
  • dyid - 动态ID
  • dfid - 定时发布动态ID
  • oid - 根据上下文不同分别指代以上不同的ID,具体看注释
  • ID 而不是 Id
  • URL 而不是 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
  • 由于项目特殊性,随时可能删库,随时可能弃坑

已实现API

v0

留言

1

这个库是在暑假开始写的,其实写到一半已经不想写了,90%的代码都是在重复着查接口、写响应结构体、测试的过程,只是看到 python 有一套还在更新的 SDK,想着还是为 Golang 也写一套

后来某天突然想把这个项目给弄完 ,所以目前动态与直播的部分基本没写

2

map[string]string 而不是 map[string]interface{} 因为在这个项目里 interface{} 的无约束很容易在一些特定的参数下忘记转换。

LICENSE

GPL