diff --git a/article.go b/article.go index 046978e..1e2af6c 100644 --- a/article.go +++ b/article.go @@ -1,363 +1,260 @@ package bilibili import ( - "encoding/json" - "github.com/pkg/errors" - "github.com/tidwall/gjson" - "strconv" + "github.com/go-resty/resty/v2" ) +type GetArticlesInfoParam struct { + Id int `json:"id"` // 文集rlid +} + +type Articles struct { + Id int `json:"id"` // 文集rlid + Mid int `json:"mid"` // 文集作者mid + Name string `json:"name"` // 文集名称 + ImageUrl string `json:"image_url"` // 文集封面图片url + UpdateTime int `json:"update_time"` // 文集更新时间。时间戳 + Ctime int `json:"ctime"` // 文集创建时间。时间戳 + PublishTime int `json:"publish_time"` // 文集发布时间。时间戳 + Summary string `json:"summary"` // 文集简介 + Words int `json:"words"` // 文集字数 + Read int `json:"read"` // 文集阅读量 + ArticlesCount int `json:"articles_count"` // 文集内文章数量 + State int `json:"state"` // 1或3。作用尚不明确 + Reason string `json:"reason"` // 空。作用尚不明确 + ApplyTime string `json:"apply_time"` // 空。作用尚不明确 + CheckTime string `json:"check_time"` // 空。作用尚不明确 +} + +type ArticleStats struct { + View int `json:"view"` // 阅读数 + Favorite int `json:"favorite"` // 收藏数 + Like int `json:"like"` // 点赞数 + Dislike int `json:"dislike"` // 点踩数 + Reply int `json:"reply"` // 评论数 + Share int `json:"share"` // 分享数 + Coin int `json:"coin"` // 投币数 + Dynamic int `json:"dynamic"` // 动态转发数 +} + +type Category struct { + Id int `json:"id"` // 分类id + ParentId int `json:"parent_id"` // 父级分类id + Name string `json:"name"` // 分类名称 +} + +type Tag struct { + Tid int `json:"tid"` // 标签id + Name string `json:"name"` // 标签名称 +} + +type Media struct { + Score int `json:"score"` // 0 + MediaId int `json:"media_id"` // 0 + Title string `json:"title"` // 空串 + Cover string `json:"cover"` // 空串 + Area string `json:"area"` // 空串 + TypeId int `json:"type_id"` // 0 + TypeName string `json:"type_name"` // 空串 + Spoiler int `json:"spoiler"` // 0 +} + type Article struct { - Id int `json:"id"` // 专栏cvid - Title string `json:"title"` // 文章标题 - State int `json:"state"` // 固定值0,作用尚不明确 - PublishTime int `json:"publish_time"` // 发布时间戳(秒) - Words int `json:"words"` // 文章字数 - ImageUrls []string `json:"image_urls"` // 文章封面 - Category struct { // 文章标签 - Id int `json:"id"` - ParentId int `json:"parent_id"` - Name string `json:"name"` - } `json:"category"` - Categories []struct { // 文章标签列表 - Id int `json:"id"` - ParentId int `json:"parent_id"` - Name string `json:"name"` - } `json:"categories"` - Summary string `json:"summary"` // 文章摘要 - Stats struct { // 文章状态数信息 - View int `json:"view"` // 阅读数 - Favorite int `json:"favorite"` // 收藏数 - Like int `json:"like"` // 点赞数 - Dislike int `json:"dislike"` // 点踩数 - Reply int `json:"reply"` // 评论数 - Share int `json:"share"` // 分享数 - Coin int `json:"coin"` // 投币数 - Dynamic int `json:"dynamic"` // 动态转发数 - } `json:"stats"` - LikeState int `json:"like_state"` // 是否点赞 + Id int `json:"id"` // 专栏文章id + Category Category `json:"category"` // 分类 + Categories []Category `json:"categories"` // 分类 + Title string `json:"title"` // 标题 + Summary string `json:"summary"` // 摘要 + BannerUrl string `json:"banner_url"` // 封面图 + TemplateId int `json:"template_id"` + State int `json:"state"` + Author *Author `json:"author"` // UP主信息 + Reprint int `json:"reprint"` + ImageUrls []string `json:"image_urls"` + PublishTime int `json:"publish_time"` // 发布时间戳。单位:秒 + Ctime int `json:"ctime"` // 提交时间戳。单位:秒 + Stats ArticleStats `json:"stats"` // 专栏文章数据统计 + Tags []Tag `json:"tags"` // 标签 + Words int `json:"words"` + Dynamic string `json:"dynamic"` // 粉丝动态文案 + OriginImageUrls []string `json:"origin_image_urls"` + IsLike bool `json:"is_like"` + Media *Media `json:"media"` + ApplyTime string `json:"apply_time"` // 空串 + CheckTime string `json:"check_time"` // 空串 + Original int `json:"original"` + ActId int `json:"act_id"` + CoverAvid int `json:"cover_avid"` + Type int `json:"type"` + LikeState int `json:"like_state"` // 是否点赞。0:未点赞。1:已点赞。需要登录(Cookie) 。未登录为0 +} + +type Nameplate struct { + Nid int `json:"nid"` // 勋章id + Name string `json:"name"` // 勋章名称 + Image string `json:"image"` // 勋章图标 + ImageSmall string `json:"image_small"` // 勋章图标(小) + Level string `json:"level"` // 勋章等级 + Condition string `json:"condition"` // 获取条件 +} + +type Author struct { + Mid int `json:"mid"` // 作者mid + Name string `json:"name"` // 作者昵称 + Face string `json:"face"` // 作者头像url + OfficialVerify OfficialVerify `json:"official_verify"` // 作者认证信息 + Nameplate Nameplate `json:"nameplate"` // 作者勋章 + Vip Vip `json:"vip"` // 作者大会员状态 } type ArticlesInfo struct { - List struct { // 文集概览 - Id int `json:"id"` // 文集rlid - Mid int `json:"mid"` // 文集作者mid - Name string `json:"name"` // 文集名称 - ImageUrl string `json:"image_url"` // 文集封面图片url - UpdateTime int `json:"update_time"` // 文集更新时间戳 - Ctime int `json:"ctime"` // 文集创建时间戳 - PublishTime int `json:"publish_time"` // 文集发布时间戳 - Summary string `json:"summary"` // 文集简介 - Words int `json:"words"` // 文集字数 - Read int `json:"read"` // 文集阅读量 - ArticlesCount int `json:"articles_count"` // 1或3,作用尚不明确 - State int `json:"state"` // 空,作用尚不明确 - Reason string `json:"reason"` // 空,作用尚不明确 - ApplyTime string `json:"apply_time"` // 空,作用尚不明确 - CheckTime string `json:"check_time"` // 空,作用尚不明确 - } `json:"list"` - Articles []Article `json:"articles"` // 文集内的文章列表 - Author struct { // 文集作者信息 - Mid int `json:"mid"` // 作者mid - Name string `json:"name"` // 作者昵称 - Face string `json:"face"` // 作者头像url - Pendant Pendant `json:"pendant"` - OfficialVerify OfficialVerify `json:"official_verify"` // 作者认证信息 - Nameplate NamePlate `json:"nameplate"` - Vip Vip `json:"vip"` - } `json:"author"` - Last Article `json:"last"` // 作用尚不明确 - Attention bool `json:"attention"` // 是否关注文集作者 + List Articles `json:"list"` // 文集概览 + Articles []Article `json:"articles"` // 文集内的文章列表 + Author Author `json:"author"` // 文集作者信息 + Last Article `json:"last"` // -。作用尚不明确。结构与data.articles[]中相似 + Attention bool `json:"attention"` // 是否关注文集作者。false:未关注。true:已关注。需要登录(Cookie) 。未登录为false } // GetArticlesInfo 获取文集基本信息 -func (c *Client) GetArticlesInfo(id int) (*ArticlesInfo, error) { - resp, err := c.resty.R(). - SetQueryParam("id", strconv.Itoa(id)).Get("https://api.bilibili.com/x/article/list/web/articles") - if err != nil { - return nil, errors.WithStack(err) - } - data, err := getRespData(resp, "获取文集基本信息") - if err != nil { - return nil, err - } - var ret *ArticlesInfo - err = json.Unmarshal(data, &ret) - return ret, errors.WithStack(err) +func (c *Client) GetArticlesInfo(param GetArticlesInfoParam) (*ArticlesInfo, error) { + const ( + method = resty.MethodGet + url = "https://api.bilibili.com/x/article/list/web/articles" + ) + return execute[*ArticlesInfo](c, method, url, param) } -type ArticleViewInfo struct { - Like int `json:"like"` // 是否点赞,0:未点赞,1:已点赞 - Attention bool `json:"attention"` // 是否关注文章作者 - Favorite bool `json:"favorite"` // 是否收藏 - Coin int `json:"coin"` // 为文章投币数 - Stats struct { // 状态数信息 - View int `json:"view"` // 阅读数 - Favorite int `json:"favorite"` // 收藏数 - Like int `json:"like"` // 点赞数 - Dislike int `json:"dislike"` // 点踩数 - Reply int `json:"reply"` // 评论数 - Share int `json:"share"` // 分享数 - Coin int `json:"coin"` // 投币数 - Dynamic int `json:"dynamic"` // 动态转发数 - } `json:"stats"` - Title string `json:"title"` // 文章标题 - BannerUrl string `json:"banner_url"` // 文章头图url - Mid int `json:"mid"` // 文章作者mid - AuthorName string `json:"author_name"` // 文章作者昵称 - IsAuthor bool `json:"is_author"` // 固定值true,作用尚不明确 - ImageUrls []string `json:"image_urls"` // 动态封面图片url - OriginImageUrls []string `json:"origin_image_urls"` // 文章封面图片url - Shareable bool `json:"shareable"` // 固定值true,作用尚不明确 - ShowLaterWatch bool `json:"show_later_watch"` // 固定值true,作用尚不明确 - ShowSmallWindow bool `json:"show_small_window"` // 固定值true,作用尚不明确 - InList bool `json:"in_list"` // 是否收于文集 - Pre int `json:"pre"` // 上一篇文章cvid - Next int `json:"next"` // 下一篇文章cvid - ShareChannels []struct { // 分享方式列表 - Name string `json:"name"` // 分享名称:QQ,QQ空间,微信,朋友圈,微博 - Picture string `json:"picture"` // 分享图片url - ShareChannel string `json:"share_channel"` // 分享代号:QQ,QZONE,WEIXIN,WEIXIN_MOMENT,SINA - } `json:"share_channels"` +type ShareChannel struct { + Name string `json:"name"` // 分享名称 + Picture string `json:"picture"` // 分享图片url + ShareChannel string `json:"share_channel"` // 分享代号 } -// GetArticleViewInfo 获取专栏文章基本信息 -func (c *Client) GetArticleViewInfo(id int) (*ArticleViewInfo, error) { - resp, err := c.resty.R(). - SetQueryParam("id", strconv.Itoa(id)).Get("https://api.bilibili.com/x/article/viewinfo") - if err != nil { - return nil, errors.WithStack(err) - } - data, err := getRespData(resp, "获取专栏文章基本信息") - if err != nil { - return nil, err - } - var ret *ArticleViewInfo - err = json.Unmarshal(data, &ret) - return ret, errors.WithStack(err) +type ArticleInfo struct { + Like int `json:"like"` // 是否点赞。0:未点赞。1:已点赞。需要登录(Cookie) 。未登录为0 + Attention bool `json:"attention"` // 是否关注文章作者。false:未关注。true:已关注。需要登录(Cookie) 。未登录为false + Favorite bool `json:"favorite"` // 是否收藏。false:未收藏。true:已收藏。需要登录(Cookie) 。未登录为false + Coin int `json:"coin"` // 为文章投币数 + Stats ArticleStats `json:"stats"` // 状态数信息 + Title string `json:"title"` // 文章标题 + BannerUrl string `json:"banner_url"` // 文章头图url + Mid int `json:"mid"` // 文章作者mid + AuthorName string `json:"author_name"` // 文章作者昵称 + IsAuthor bool `json:"is_author"` // true。作用尚不明确 + ImageUrls []string `json:"image_urls"` // 动态封面 + OriginImageUrls []string `json:"origin_image_urls"` // 封面图片 + Shareable bool `json:"shareable"` // true。作用尚不明确 + ShowLaterWatch bool `json:"show_later_watch"` // true。作用尚不明确 + ShowSmallWindow bool `json:"show_small_window"` // true。作用尚不明确 + InList bool `json:"in_list"` // 是否收于文集。false:否。true:是 + Pre int `json:"pre"` // 上一篇文章cvid。无为0 + Next int `json:"next"` // 下一篇文章cvid。无为0 + ShareChannels []ShareChannel `json:"share_channels"` // 分享方式列表 + Type int `json:"type"` // 文章类别。0:文章。2:笔记 } -// LikeArticle 点赞文章,like为false表示取消点赞 -func (c *Client) LikeArticle(id int, like bool) error { - biliJct := c.getCookie("bili_jct") - if len(biliJct) == 0 { - return errors.New("B站登录过期") - } - var typeNum string - if like { - typeNum = "1" - } else { - typeNum = "2" - } - resp, err := c.resty.R().SetQueryParams(map[string]string{ - "id": strconv.Itoa(id), - "type": typeNum, - "csrf": biliJct, - }).Post("https://api.bilibili.com/x/article/like") - if err != nil { - return errors.WithStack(err) - } - _, err = getRespData(resp, "点赞文章") +type GetArticleInfoParam struct { + Id int `json:"id"` // 专栏cvid +} + +// GetArticleInfo 获取专栏文章基本信息 +func (c *Client) GetArticleInfo(param GetArticleInfoParam) (*ArticleInfo, error) { + const ( + method = resty.MethodGet + url = "https://api.bilibili.com/x/article/viewinfo" + ) + return execute[*ArticleInfo](c, method, url, param) +} + +type LikeArticleParam struct { + Id int `json:"id"` // 文章cvid + Type int `json:"type"` // 操作方式。1:点赞。2:取消赞 +} + +// LikeArticle 点赞文章 +func (c *Client) LikeArticle(param LikeArticleParam) error { + const ( + method = resty.MethodPost + url = "https://api.bilibili.com/x/article/like" + ) + _, err := execute[any](c, method, url, param, fillCsrf(c)) return err } -// CoinArticle 投币文章,id为文章cvid,upid为作者mid,mutiply为投币数量。返回的bool值为是否附加点赞成功,若已赞过则附加点赞失败 -func (c *Client) CoinArticle(id, upid, multiply int) (bool, error) { - biliJct := c.getCookie("bili_jct") - if len(biliJct) == 0 { - return false, errors.New("B站登录过期") - } - resp, err := c.resty.R().SetQueryParams(map[string]string{ - "aid": strconv.Itoa(id), - "upid": strconv.Itoa(upid), - "multiply": strconv.Itoa(multiply), - "avtype": "2", - "csrf": biliJct, - }).Post("https://api.bilibili.com/x/web-interface/coin/add") - if err != nil { - return false, errors.WithStack(err) - } - data, err := getRespData(resp, "投币文章") - if err != nil { - return false, err - } - return gjson.GetBytes(data, "like").Bool(), nil +type CoinArticleParam struct { + Aid int `json:"aid"` // 文章cvid + Upid int `json:"upid"` // 文章作者mid + Multiply int `json:"multiply"` // 投币数量。上限为2 + Avtype int `json:"avtype"` // 2。必须为2 +} + +type CoinArticleResult struct { + Like bool `json:"like"` // 是否点赞成功。true:成功。false:失败。已赞过则附加点赞失败 } -// FavourArticle 收藏文章 -func (c *Client) FavourArticle(id int) error { - biliJct := c.getCookie("bili_jct") - if len(biliJct) == 0 { - return errors.New("B站登录过期") - } - resp, err := c.resty.R().SetQueryParams(map[string]string{ - "id": strconv.Itoa(id), - "csrf": biliJct, - }).Post("https://api.bilibili.com/x/article/favorites/add") - if err != nil { - return errors.WithStack(err) - } - _, err = getRespData(resp, "收藏文章") +// CoinArticle 投币文章 +func (c *Client) CoinArticle(param CoinArticleParam) (*CoinArticleResult, error) { + const ( + method = resty.MethodPost + url = "https://api.bilibili.com/x/web-interface/coin/add" + ) + return execute[*CoinArticleResult](c, method, url, param, fillCsrf(c)) +} + +type FavoritesArticleParam struct { + Id int `json:"id"` // 文章cvid +} + +// FavoritesArticle 收藏文章 +func (c *Client) FavoritesArticle(param FavoritesArticleParam) error { + const ( + method = resty.MethodPost + url = "https://api.bilibili.com/x/article/favorites/add" + ) + _, err := execute[any](c, method, url, param, fillCsrf(c)) return err } +type GetUserArticleListParam struct { + Mid int `json:"mid"` // 用户uid + Pn int `json:"pn,omitempty"` // 默认:1 + Ps int `json:"ps,omitempty"` // 默认:30。范围:[1,30] + Sort string `json:"sort,omitempty"` // publish_time:最新发布。view:最多阅读。fav:最多收藏。默认:publish_time +} + type UserArticleList struct { - Articles []struct { // 专栏文章信息列表 - Id int `json:"id"` // 专栏文章id - Category struct { // 分类 - Id int `json:"id"` // 分类id - ParentId int `json:"parent_id"` // 父级分类id - Name string `json:"name"` // 分类名称 - } `json:"category"` - Categories []struct { // 分类 - Id int `json:"id"` // 分类id - ParentId int `json:"parent_id"` // 父级分类id - Name string `json:"name"` // 分类名称 - } `json:"categories"` - Title string `json:"title"` // 标题 - Summary string `json:"summary"` // 摘要 - BannerUrl string `json:"banner_url"` // 封面图 - TemplateId int `json:"template_id"` - State int `json:"state"` - Author struct { // UP主信息 - Mid int `json:"mid"` // 用户uid - Name string `json:"name"` // 用户名 - Face string `json:"face"` // 头像 - Pendant struct { // 头像框信息 - Pid int `json:"pid"` // 头像框id - Name string `json:"name"` // 头像框名称 - Image string `json:"image"` // 头像框图片url - Expire int `json:"expire"` // 过期时间 - } `json:"pendant"` - OfficialVerify struct { // 账号认证信息 - Type int `json:"type"` // 是否认证,-1:无,0:个人认证,1:机构认证 - Desc string `json:"desc"` // 认证备注 - } `json:"official_verify"` - Nameplate struct { // 成就勋章信息 - Nid int `json:"nid"` // 勋章id - Name string `json:"name"` // 勋章名称 - Image string `json:"image"` // 勋章图标 - ImageSmall string `json:"image_small"` // 勋章图标(小) - Level string `json:"level"` // 勋章等级 - Condition string `json:"condition"` // 获取条件 - } `json:"nameplate"` - Vip struct { // 大会员信息 - Type int `json:"type"` // 大会员类型,0:无,1:月大会员,2:年度及以上大会员 - Status int `json:"status"` // 大会员状态,0:无,1:有 - DueDate int `json:"due_date"` // 大会员过期时间时间戳,单位:毫秒 - VipPayType int `json:"vip_pay_type"` // 支付类型 - ThemeType int `json:"theme_type"` // 固定值0 - Label struct { // 大会员标签 - Path string `json:"path"` // 空串 - Text string `json:"text"` // 会员类型文案,大会员,年度大会员,十年大会员,百年大会员,最强绿鲤鱼 - LabelTheme string `json:"label_theme"` // 会员标签,vip,annual_vip,ten_annual_vip,hundred_annual_vip,fools_day_hundred_annual_vip - } `json:"label"` - AvatarSubscript int `json:"avatar_subscript"` // 是否显示大会员图标,0:不显示,1:显示 - NicknameColor string `json:"nickname_color"` // 大会员昵称颜色 - } `json:"vip"` - } `json:"author"` - Reprint int `json:"reprint"` - ImageUrls []string `json:"image_urls"` - PublishTime int `json:"publish_time"` // 发布时间戳,单位:秒 - Ctime int `json:"ctime"` // 提交时间戳,单位:秒 - Stats struct { // 专栏文章数据统计 - View int `json:"view"` // 浏览数 - Favorite int `json:"favorite"` // 收藏数 - Like int `json:"like"` // 点赞数 - Dislike int `json:"dislike"` // 点踩数 - Reply int `json:"reply"` // 回复数 - Share int `json:"share"` // 转发数 - Coin int `json:"coin"` // 投币数 - Dynamic int `json:"dynamic"` - } `json:"stats"` - Words int `json:"words"` - Dynamic string `json:"dynamic"` // 粉丝动态文案 - OriginImageUrls []string `json:"origin_image_urls"` - IsLike bool `json:"is_like"` - Media struct { - Score int `json:"score"` - MediaId int `json:"media_id"` - Title string `json:"title"` - Cover string `json:"cover"` - Area string `json:"area"` - TypeId int `json:"type_id"` - TypeName string `json:"type_name"` - Spoiler int `json:"spoiler"` - } `json:"media"` - ApplyTime string `json:"apply_time"` - CheckTime string `json:"check_time"` - Original int `json:"original"` - ActId int `json:"act_id"` - CoverAvid int `json:"cover_avid"` - Type int `json:"type"` - Tags []struct { // 标签 - Tid int `json:"tid"` // 标签id - Name string `json:"name"` // 标签名称 - } `json:"tags,omitempty"` - } `json:"articles"` - Pn int `json:"pn"` // 本次请求分页页数 - Ps int `json:"ps"` // 本次请求分页大小 - Count int `json:"count"` // 专栏文章总数 + Articles []Article `json:"articles"` // 专栏文章信息列表 + Pn int `json:"pn"` // 本次请求分页页数 + Ps int `json:"ps"` // 本次请求分页大小 + Count int `json:"count"` // 专栏文章总数 +} + +// GetUserArticleList 获取用户专栏文章列表 +func (c *Client) GetUserArticleList(param GetUserArticleListParam) (*UserArticleList, error) { + const ( + method = resty.MethodGet + url = "https://api.bilibili.com/x/space/article" + ) + return execute[*UserArticleList](c, method, url, param, fillCsrf(c)) } -// GetUserArticleList 获取用户专栏文章列表。sort可选值"publish_time","view","fav",不填默认"publish_time"。 -func (c *Client) GetUserArticleList(mid, pn, ps int, sort string) (*UserArticleList, error) { - if len(sort) == 0 { - sort = "publish_time" - } - resp, err := c.resty.R().SetQueryParams(map[string]string{ - "mid": strconv.Itoa(mid), - "pn": strconv.Itoa(pn), - "ps": strconv.Itoa(ps), - "sort": sort, - }).Get("https://api.bilibili.com/x/space/article") - if err != nil { - return nil, errors.WithStack(err) - } - data, err := getRespData(resp, "获取用户专栏文章列表") - if err != nil { - return nil, err - } - var ret *UserArticleList - err = json.Unmarshal(data, &ret) - return ret, errors.WithStack(err) +type GetUserArticlesListParam struct { + Mid int `json:"mid"` // 用户uid + Sort int `json:"sort,omitempty"` // 排序方式。0:最近更新。1:最多阅读 + Jsonp string `json:"jsonp,omitempty"` + Callback string `json:"callback,omitempty"` } type UserArticlesList struct { - Lists []struct { // 文集信息列表 - Id int `json:"id"` // 文集id - Mid int `json:"mid"` // 作者uid - Name string `json:"name"` // 文集名称 - ImageUrl string `json:"image_url"` // 封面 - UpdateTime int `json:"update_time"` // 最后更新时间戳,单位:秒 - Ctime int `json:"ctime"` // 创建时间戳,单位:秒 - PublishTime int `json:"publish_time"` // 发布时间戳,单位:秒 - Summary string `json:"summary"` - Words int `json:"words"` // 总字数 - Read int `json:"read"` // 阅读量 - ArticlesCount int `json:"articles_count"` // 包含文章数 - State int `json:"state"` // 固定值1 - Reason string `json:"reason"` - ApplyTime string `json:"apply_time"` - CheckTime string `json:"check_time"` - } `json:"lists"` - Total int `json:"total"` // 文集总数 + Lists []ArticlesInfo `json:"lists"` // 文集信息列表 + Total int `json:"total"` // 文集总数 } -// GetUserArticlesList 获取用户专栏文集列表。sort可选值,0:最近更新,1:最多阅读。 -func (c *Client) GetUserArticlesList(mid, sort int) (*UserArticlesList, error) { - resp, err := c.resty.R().SetQueryParams(map[string]string{ - "mid": strconv.Itoa(mid), - "sort": strconv.Itoa(sort), - }).Get("https://api.bilibili.com/x/article/up/lists") - if err != nil { - return nil, errors.WithStack(err) - } - data, err := getRespData(resp, "获取用户专栏文集列表") - if err != nil { - return nil, err - } - var ret *UserArticlesList - err = json.Unmarshal(data, &ret) - return ret, errors.WithStack(err) +// GetUserArticlesList 获取用户专栏文集列表 +func (c *Client) GetUserArticlesList(param GetUserArticlesListParam) (*UserArticlesList, error) { + const ( + method = resty.MethodGet + url = "https://api.bilibili.com/x/article/up/lists" + ) + return execute[*UserArticlesList](c, method, url, param, fillCsrf(c)) } diff --git a/tools/gen_struct.py b/tools/gen_struct.py index d7711ac..b4f9956 100644 --- a/tools/gen_struct.py +++ b/tools/gen_struct.py @@ -10,6 +10,7 @@ def snake_to_camel(snake_str): head_mapping = { '参数名': 'name', '字段': 'name', + '字段名': 'name', '类型': 'type', '内容': 'content', '必要性': 'notnull', @@ -72,7 +73,7 @@ def snake_to_camel(snake_str): m['type'] = '[]bool' elif m['type'] == 'obj': m['type'] = name - if m.get('notnull', '必要') == '必要': + if m.get('notnull', '必要') in ('必要', '√'): m['notnull'] = '' else: m['notnull'] = ',omitempty'