czp3009 / bilibili-api

Bilibili API library for Kotlin
GNU General Public License v3.0
512 stars 50 forks source link

可以提供下普通视频的标签和评论接口吗 #10

Closed candrwow closed 5 years ago

candrwow commented 6 years ago

希望获取到这部分数据用来进行rnn,up有这些api方面的研究吗

czp3009 commented 6 years ago

由于时间的问题,总站API还没做。视频(普通投稿视频和番剧)的API(视频基本信息,评论,分类等)之前已经截包分析过,有空我会把它做一下。 如果急着要用的话我可以把接口的参数整理一下发在这里,这样就可以自己用Python实现了(我想做深度学习得大多都用Python吧)

candrwow commented 6 years ago

@czp3009 我发现评论接口确实是不需要appkey和验签的,但是点进视频后根据aid获取视频的标题,up名是需要appkey,时间戳验签这两样的,其他地方好像都无法直接根据aid获取视频标题

czp3009 commented 5 years ago

获取评论示例

GET https://api.bilibili.com/x/v2/reply/main?appkey=1d8b6e7d45233436&build=5370000&channel=html5_app_bili&mobi_app=android&mode=1&next=1338&oid=16622855&plat=2&platform=android&ps=20&ts=1550740107&type=1&sign=2e1fe81b59ba668169407bc5ad445b85

oid 与 type 为必填参数, oid 即 aid, 视频的唯一标识, 俗称 av 号.

type 不明确含义, 客户端上总是为 1.

返回值示例如下 https://api.bilibili.com/x/v2/reply/main?oid=16622855&type=1

(这里就不贴了)

next 参数是一个分页参数, 表示想要请求的评论(复数)从哪个评论开始, 即 offset. 没有这个参数则从最后一楼开始.

ps 为 pageSize, 分页长度.

评论是降序排序的, 也就是楼层大的排在前面, next 会不停的变小直到某一页的返回值中最后一条评论为 1 楼.

获取子评论示例

GET https://api.bilibili.com/x/v2/reply/reply/cursor?appkey=1d8b6e7d45233436&build=5370000&channel=html5_app_bili&min_id=22&mobi_app=android&oid=16622855&plat=2&platform=android&root=500111085&size=20&sort=0&ts=1550733922&type=1&sign=5492077ec071af953b5e81fcd0e734e4 HTTP/1.1

子评论即对一个评论的评论.

oid, root, type 必填.

oid 即 aid, 同上.

root 为父评论的 id(在上面那个接口的返回值里面, rpid 就是评论的 id).

type 也同上.

子评论是升序排序的, 楼层逐渐变大, min_id 是分页偏移量, 没有这个参数则从最上面开始.

示例 https://api.bilibili.com/x/v2/reply/reply/cursor?oid=16622855&type=1&root=1405602348

获取视频的基本信息

这个比较麻烦, 因为必须要签名, 示例如下

GET https://app.bilibili.com/x/v2/view?ad_extra=D804FD0051D642264E5542E8CB228E41A378FECF9DDF4AD7B378C56B1D2CE1C78EDDA708D5C4420620688F7F73E9D3C1390AE0207C69C017DC9674B851586590736CA994FDDE83E3C3D9C219992C62246D2417FC7E8B5DCABF861325E05F2408CC9448D5751CE0BD5A3FF857DF145C218EE6898A5C7515150A50D3C54D1E10EEB5ED748F597AC35354B30C12DB52CF3E3EB991D49ADE750DF7591291619729F8F72B00F451E5962EA1C5E9D2B39D027613F6E8F95357711C191ADD53B18791B38A4D2B8ED75464542D9EFC9E1244FEF03092D03975B9C61D765C06F24DD9E87EB6D2066A3B11F2DBDF1A2EBC408073A3C110EFBE166543FEF2777EF679FA8B722937B575643F7E3663D85C29490E4C2C35DFAECFB24766F975B9827BF19E3A815FC333BB244FCC067E56A47F5DDD13E2D8FE45FB08AC6AEBD1BEECDC4181FEFE890A7BB5F510274EC27986273F6506C28C0B438F7547DFB6C8A9C553BF4E32ABF3AE5998D42A2ED8C8E99EB1D3F478AB4272B4935D88C7975A723EA6627C82D9ECF6B1A7EC89DCE0B424C0D78CE08614B87215D6D2F2F6CC39AE20ED54ACDA57157F74CC38EA2D555797FCEA9F2815429E5B9ED70EC4BEC5B1E90219278668326135459E78E2BE5BB34EA4CEF2393E2B81E3A965BB7F894D4A0E2F9FC8450DA2943BD04DFF120EF6835B4F187E8BECCBA3EE438A6ED965BEEDB8D0E2C82703D4BE9E6C35EA72C055DEE648AB029A39406336C031D97AA7548820761B2C1DA17082AD23F86F51A251667D653A95F5B0A8BD6C34A3D08355946741F61FFCC7ECE578530C9FE9D89AA32ADD42D36742826A9B993FB019E557C8DA9BB11E4EC82C0B11A3255A2A5E3616B4125C4693365235&aid=42463605&appkey=1d8b6e7d45233436&autoplay=0&build=5370000&channel=html5_app_bili&fnval=16&fnver=0&force_host=0&from=7&mobi_app=android&plat=0&platform=android&qn=32&trackid=all_15.shylf-ai-recsys-235.1550742259901.511&ts=1550742265&sign=0c02ccfdb7bd0477eef4816aba8e26c8

里面的 ad_extra 很长很长, 但是不是必须的参数, 访问上面这个地址就可以看到返回内容了, 其中的 tag 就是该视频的标签.

签名算法比较简单, 我描述一下

先把所有参数排好顺序(字典序)(包括 = & 这些符号), 然后把 appSecret 拼接在后面(直接拼接, 没有 &). 最后做一次 md5 就得到了 sign 的值. 将 sign 的值再拼接到全部东西的后面就可以了.

    companion object {
        /**
         * 签名算法为 "$排序后的参数字符串$appSecret".md5()
         */
        private fun calculateSign(string: String, appSecret: String) =
                MessageDigest.getInstance("MD5")
                        .digest((string + appSecret).toByteArray())
                        .joinToString(separator = "") {
                            "%02x".format(it)
                        }
    }
    /**
     * Android 平台的 appKey(该默认值为普通版客户端, 非概念版)
     */
    var appKey = "1d8b6e7d45233436"

    /**
     * 由反编译 so 文件得到的 appSecret, 与 appKey 必须匹配
     */
    @Suppress("SpellCheckingInspection")
    var appSecret = "560c52ccd288fed045859ed18bffd973"

appSecret 如上所述.

不要问为什么这么久了才回复这个 issue, 因为太忙