Bilibili-API

BilibiliAPI,PC端抓包研究所得

As of 2018-02-09. See the latest version.

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greasyfork.org/scripts/38140/249987/Bilibili-API.js

// ==UserScript==
// @name         Bilibili-API
// @namespace    SeaLoong
// @version      1.0.3
// @description  BilibiliAPI,PC端抓包研究所得
// @author       SeaLoong
// @require      http://code.jquery.com/jquery-3.3.1.min.js
// @license      MIT License
// ==/UserScript==

var BilibiliAPI = {
    last_ajax: 0,
    cnt_frequently_ajax: 0,
    ajax: function(settings) {
        if (Date.now() - BilibiliAPI.last_ajax < 20) {
            BilibiliAPI.cnt_frequently_ajax++;
        } else {
            BilibiliAPI.cnt_frequently_ajax = 0;
        }
        BilibiliAPI.last_ajax = Date.now();
        if (BilibiliAPI.cnt_frequently_ajax > 5) throw new Error('调用Bilibili API太快,可能出现了bug');
        if (settings.xhrFields) {
            $.extend(settings.xhrFields, {
                withCredentials: true
            });
        } else {
            settings.xhrFields = {
                withCredentials: true
            };
        }
        $.extend(settings, {
            url: (settings.url.substr(0, 2) === '//' ? '' : '//api.live.bilibili.com/') + settings.url,
            type: settings.type || 'GET',
            crossDomain: true,
            dataType: settings.dataType || 'json'
        });
        return $.ajax(settings);
    },
    ajaxGetCaptchaKey: function() {
        return BilibiliAPI.ajax({
            url: '//www.bilibili.com/plus/widget/ajaxGetCaptchaKey.php?js'
        });
    },
    msg: function(roomid, csrf_token) {
        return BilibiliAPI.ajax({
            type: 'POST',
            url: 'ajax/msg',
            data: {
                roomid: roomid,
                csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
            }
        });
    },
    ajaxCapsule: function(id, ts, platform, player_type) {
        return BilibiliAPI.ajax({
            url: 'api/ajaxCapsule'
        });
    },
    player: function(id, ts, platform, player_type) {
        return BilibiliAPI.ajax({
            url: 'api/player',
            data: {
                id: id,
                ts: ts, // HEX
                platform: platform || 'pc',
                player_type: player_type || 'web'
            },
            dataType: 'text'
        });
    },
    create: function(width, height) {
        // 生成一个验证码(用于节奏风暴)
        return BilibiliAPI.ajax({
            url: 'captcha/v1/Captcha/create',
            data: {
                width: width,
                height: height,
                _: ts_ms()
            }
        });
    },
    topList: function(roomid, page, ruid) {
        return BilibiliAPI.ajax({
            url: 'guard/topList',
            data: {
                roomid: roomid,
                page: page,
                ruid: ruid
            }
        });
    },
    getSuser: function() {
        return BilibiliAPI.ajax({
            url: 'msg/getSuser'
        });
    },
    refresh: function(area) {
        return BilibiliAPI.ajax({
            url: 'index/refresh?area=' + area || 'all'
        });
    },
    get_ip_addr: function() {
        return BilibiliAPI.ajax({
            url: 'ip_service/v1/ip_service/get_ip_addr'
        });
    },
    ajaxGetMyMedalList: function() {
        return BilibiliAPI.ajax({
            url: '//live.bilibili.com/i/ajaxGetMyMedalList'
        });
    },
    getuserinfo: function() {
        return BilibiliAPI.ajax({
            url: '//live.bilibili.com/user/getuserinfo'
        });
    },
    coin2silver: function(coin) {
        // 硬币兑换银瓜子(旧API),1硬币=900银瓜子
        return BilibiliAPI.ajax({
            type: 'POST',
            url: '//live.bilibili.com/exchange/coin2silver',
            data: {
                coin: coin
            }
        });
    },
    MyInfo: function() {
        return BilibiliAPI.ajax({
            url: '//space.bilibili.com/ajax/member/MyInfo'
        });
    },
    activity: {
        mobileActivity: function() {
            return BilibiliAPI.ajax({
                url: 'activity/v1/Common/mobileActivity'
            });
        },
        roomInfo: function(roomid, ruid) {
            return BilibiliAPI.ajax({
                url: 'activity/v1/Common/roomInfo',
                data: {
                    roomid: roomid,
                    ruid: ruid
                }
            });
        },
        welcomeInfo: function(roomid) {
            return BilibiliAPI.ajax({
                url: 'activity/v1/Common/welcomeInfo?roomid=' + roomid
            });
        },
        master_invite_task: function() {
            return BilibiliAPI.ajax({
                url: 'activity/v1/invite/master_invite_task'
            });
        },
        check: function(roomid) {
            // 检查是否有活动抽奖
            return BilibiliAPI.ajax({
                url: 'activity/v1/Raffle/check?roomid=' + roomid
            });
        },
        join: function(roomid, raffleId) {
            // 参加活动抽奖
            return BilibiliAPI.ajax({
                url: 'activity/v1/Raffle/join',
                data: {
                    roomid: roomid,
                    raffleId: raffleId
                }
            });
        },
        notice: function(roomid, raffleId) {
            // 领取活动抽奖奖励
            return BilibiliAPI.ajax({
                url: 'activity/v1/Raffle/notice',
                data: {
                    roomid: roomid,
                    raffleId: raffleId
                }
            });
        },
        master_limit_tasks: function() {
            return BilibiliAPI.ajax({
                url: 'activity/v1/task/master_limit_tasks'
            });
        },
        receive_award: function(task_id, csrf_token) {
            // 领取任务奖励
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'activity/v1/task/receive_award',
                data: {
                    task_id: task_id,
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        },
        user_limit_tasks: function() {
            return BilibiliAPI.ajax({
                url: 'activity/v1/task/user_limit_tasks'
            });
        }
    },
    feed: {
        getList: function(page, page_size) {
            return BilibiliAPI.ajax({
                url: 'feed/v1/feed/getList',
                data: {
                    page: page,
                    page_size: page_size,
                    _: ts_ms()
                }
            });
        },
        heartBeat: function(_cb) {
            return BilibiliAPI.ajax({
                url: 'feed/v1/feed/heartBeat',
                data: {
                    _cb: _cb
                }
            });
        },
        GetUserFc: function(follow) { // follow: 主播uid===ruid
            return BilibiliAPI.ajax({
                url: 'feed/v1/Feed/GetUserFc?follow=' + follow
            });
        },
        IsUserFollow: function(follow) { // follow: 主播uid===ruid
            return BilibiliAPI.ajax({
                url: 'feed/v1/Feed/IsUserFollow?follow=' + follow
            });
        },
    },
    feed_svr: {
        notice: function(csrf_token) {
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'feed_svr/v1/feed_svr/notice',
                data: {
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        },
        my: function(page_size, csrf_token, live_status, type, offset) {
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'feed_svr/v1/feed_svr/my',
                data: {
                    live_status: live_status || 0,
                    type: type || 0,
                    page_size: page_size,
                    offset: offset || 0,
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        }
    },
    FreeSilver: {
        getSurplus: function() {
            return BilibiliAPI.ajax({
                url: 'FreeSilver/getSurplus'
            });
        },
        getAward: function(time_start, end_time, captcha) {
            // 领取银瓜子
            return BilibiliAPI.ajax({
                url: 'FreeSilver/getAward',
                data: {
                    time_start: time_start,
                    end_time: end_time,
                    captcha: captcha
                }
            });
        },
        getCurrentTask: function() {
            // 获取领取银瓜子的任务
            return BilibiliAPI.ajax({
                url: 'FreeSilver/getCurrentTask'
            });
        },
        getCaptcha: function(ts, callback) {
            // 获取领取银瓜子的验证码图片
            var url = "//api.live.bilibili.com/freeSilver/getCaptcha?ts=" + ts;
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url);
            xhr.responseType = 'blob';
            xhr.withCredentials = true;
            xhr.onload = function() {
                var reader = new FileReader();
                reader.onloadend = function() {
                    callback(reader.result);
                };
                reader.readAsDataURL(xhr.response);
            };
            xhr.send();
        }
    },
    gift: {
        bag_list: function() {
            // 获取包裹礼物列表
            return BilibiliAPI.ajax({
                url: 'gift/v2/gift/bag_list'
            });
        },
        send: function(uid, gift_id, ruid, gift_num, coin_type, biz_id, rnd, csrf_token, platform, biz_code, storm_beat_id) {
            // 消耗瓜子送礼
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'gift/v2/gift/send',
                data: {
                    uid: uid,
                    gift_id: gift_id,
                    ruid: ruid,
                    gift_num: gift_num,
                    coin_type: coin_type || 'silver',
                    bag_id: 0,
                    platform: platform || 'pc',
                    biz_code: biz_code || 'live',
                    biz_id: biz_id, //roomid
                    rnd: rnd,
                    storm_beat_id: storm_beat_id || 0,
                    // metadata: metadata,
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        },
        bag_send: function(uid, gift_id, ruid, gift_num, bag_id, biz_id, rnd, csrf_token, platform, biz_code, storm_beat_id) {
            // 送出包裹中的礼物
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'gift/v2/live/bag_send',
                data: {
                    uid: uid,
                    gift_id: gift_id,
                    ruid: ruid,
                    gift_num: gift_num,
                    bag_id: bag_id,
                    platform: platform || 'pc',
                    biz_code: biz_code || 'live',
                    biz_id: biz_id, //roomid
                    rnd: rnd,
                    storm_beat_id: storm_beat_id || 0,
                    // metadata: metadata,
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        },
        heart_gift_receive: function(roomid, area_v2_id) {
            return BilibiliAPI.ajax({
                url: 'gift/v2/live/heart_gift_receive',
                data: {
                    roomid: roomid,
                    area_v2_id: area_v2_id
                }
            });
        },
        heart_gift_status: function(roomid, area_v2_id) {
            return BilibiliAPI.ajax({
                url: 'gift/v2/live/heart_gift_status',
                data: {
                    roomid: roomid,
                    area_v2_id: area_v2_id
                }
            });
        },
        receive_daily_bag: function() {
            // 领取每日礼物
            return BilibiliAPI.ajax({
                url: 'gift/v2/live/receive_daily_bag'
            });
        },
        room_gift_list: function(roomid, area_v2_id) {
            return BilibiliAPI.ajax({
                url: 'gift/v2/live/room_gift_list',
                data: {
                    roomid: roomid,
                    area_v2_id: area_v2_id
                }
            });
        },
        smalltv: {
            check: function(roomid) {
                // 检查是否有小电视
                return BilibiliAPI.ajax({
                    url: 'gift/v2/smalltv/check',
                    data: {
                        roomid: roomid
                    }
                });
            },
            join: function(roomid, raffleId) {
                // 参加小电视抽奖
                return BilibiliAPI.ajax({
                    url: 'gift/v2/smalltv/join',
                    data: {
                        roomid: roomid,
                        raffleId: raffleId
                    }
                });
            },
            notice: function(roomid, raffleId) {
                // 领取小电视抽奖奖励
                return BilibiliAPI.ajax({
                    url: 'gift/v2/smalltv/notice',
                    data: {
                        roomid: roomid,
                        raffleId: raffleId
                    }
                });
            }
        }
    },
    giftBag: {
        getSendGift: function() {
            return BilibiliAPI.ajax({
                url: 'giftBag/getSendGift'
            });
        },
        sendDaily: function() {
            return BilibiliAPI.ajax({
                url: 'giftBag/sendDaily'
            });
        }
    },
    i: {
        ajaxGetAchieve: function(page, pageSize, type, status, category, keywords) {
            return BilibiliAPI.ajax({
                url: 'i/api/ajaxGetAchieve',
                data: {
                    type: type || 'normal', // or'legend'
                    status: status || 0,
                    category: category || 'all',
                    keywords: keywords,
                    page: page,
                    pageSize: pageSize || 6
                }
            });
        },
        ajaxCancelWear: function() {
            // 取消佩戴勋章
            return BilibiliAPI.ajax({
                url: 'i/ajaxCancelWear'
            });
        },
        ajaxWearFansMedal: function(medal_id) {
            // 佩戴勋章/更换当前佩戴的勋章
            return BilibiliAPI.ajax({
                url: 'i/ajaxWearFansMedal?medal_id=' + medal_id
            });
        },
        following: function(page, pageSize) {
            return BilibiliAPI.ajax({
                url: 'i/api/following',
                data: {
                    page: page,
                    pageSize: pageSize
                }
            });
        },
        guard: function(page, pageSize) {
            return BilibiliAPI.ajax({
                url: 'i/api/guard',
                data: {
                    page: page,
                    pageSize: pageSize
                }
            });
        },
        liveinfo: function() {
            return BilibiliAPI.ajax({
                url: 'i/api/liveinfo'
            });
        },
        medal: function(page, pageSize) {
            // 获取勋章信息
            return BilibiliAPI.ajax({
                url: 'i/api/medal',
                data: {
                    page: page,
                    pageSize: pageSize
                }
            });
        },
        operation: function(page) {
            return BilibiliAPI.ajax({
                url: 'i/api/operation?page=' + page
            });
        },
        taskInfo: function() {
            return BilibiliAPI.ajax({
                url: 'i/api/taskInfo'
            });
        }
    },
    live: {
        getRoomKanBanModel: function(roomid) {
            return BilibiliAPI.ajax({
                url: 'live/getRoomKanBanModel?roomid' + roomid
            });
        },
        rankTab: function(roomid) {
            return BilibiliAPI.ajax({
                url: 'live/rankTab?roomid=' + roomid
            });
        },
        roomAdList: function() {
            return BilibiliAPI.ajax({
                url: 'live/roomAdList'
            });
        }
    },
    live_user: {
        get_anchor_in_room: function(roomid) {
            return BilibiliAPI.ajax({
                url: 'live_user/v1/UserInfo/get_anchor_in_room?roomid=' + roomid
            });
        },
        get_info_in_room: function(roomid) {
            return BilibiliAPI.ajax({
                url: 'live_user/v1/UserInfo/get_info_in_room?roomid=' + roomid
            });
        },
        get_weared_medal: function(uid, target_id, csrf_token, source) {
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'live_user/v1/UserInfo/get_weared_medal',
                data: {
                    source: source || 1,
                    uid: uid,
                    target_id: target_id, // roomid
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        }
    },
    lottery: {
        getRoomActivityByRoomid: function(roomid) {
            return BilibiliAPI.ajax({
                url: 'lottery/v1/box/getRoomActivityByRoomid?roomid=' + roomid
            });
        },
        check: function(roomid) {
            // 检查是否有节奏风暴
            return BilibiliAPI.ajax({
                url: 'lottery/v1/Storm/check?roomid=' + roomid
            });
        },
        join: function(id, captcha_token, captcha_phrase, csrf_token, color) {
            // 参加节奏风暴
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'lottery/v1/Storm/join',
                data: {
                    id: id,
                    color: color || 16777215,
                    captcha_token: captcha_token,
                    captcha_phrase: captcha_phrase,
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        }
    },
    pay: {
        coin2silver: function(num, csrf_token, platform) {
            // 硬币兑换银瓜子(新API),1硬币=450银瓜子
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'pay/v1/Exchange/coin2silver',
                data: {
                    num: num,
                    platform: platform || 'pc',
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        },
        getRule: function(platform) {
            return BilibiliAPI.ajax({
                url: 'pay/v1/Exchange/getRule?platform=' + platform || 'pc'
            });
        },
        getStatus: function(platform) {
            return BilibiliAPI.ajax({
                url: 'pay/v1/Exchange/getStatus?platform=' + platform || 'pc'
            });
        },
        silver2coin: function(csrf_token, platform) {
            // 银瓜子兑换硬币,700银瓜子=1硬币
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'pay/v1/Exchange/silver2coin',
                data: {
                    platform: platform || 'pc',
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        }
    },
    rankdb: {
        roomInfo: function(ruid, roomid, areaId) {
            return BilibiliAPI.ajax({
                url: 'rankdb/v1/Common/roomInfo',
                data: {
                    ruid: ruid,
                    roomid: roomid,
                    areaId: areaId
                }
            });
        }
    },
    room: {
        get_info: function(room_id, from) {
            return BilibiliAPI.ajax({
                url: 'room/v1/Room/get_info',
                data: {
                    room_id: room_id,
                    from: from || 'room'
                }
            });
        },
        playUrl: function(cid, quality, platform) {
            return BilibiliAPI.ajax({
                url: 'room/v1/Room/playUrl',
                data: {
                    cid: cid, // roomid
                    quality: quality || '0',
                    platform: platform || 'web'
                }
            });
        },
        room_entry_action: function(room_id, csrf_token, platform) {
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'room/v1/Room/room_entry_action',
                data: {
                    room_id: room_id,
                    platform: platform || 'pc',
                    csrf_token: typeof csrf_token === 'function' ? csrf_token() : csrf_token
                }
            });
        },
        room_init: function(id) {
            return BilibiliAPI.ajax({
                url: 'room/v1/Room/room_init?id=' + id
            });
        }
    },
    sign: {
        doSign: function() {
            // 签到
            return BilibiliAPI.ajax({
                url: 'sign/doSign'
            });
        },
        GetSignInfo: function() {
            // 获取签到信息
            return BilibiliAPI.ajax({
                url: 'sign/GetSignInfo'
            });
        },
        getLastMonthSignDays: function() {
            return BilibiliAPI.ajax({
                url: 'sign/getLastMonthSignDays'
            });
        }
    },
    user: {
        getWear: function(uid) {
            return BilibiliAPI.ajax({
                url: 'user/v1/user_title/getWear?uid=' + uid
            });
        },
        isBiliVip: function(uid) {
            return BilibiliAPI.ajax({
                url: 'user/v1/user/isBiliVip?uid=' + uid
            });
        },
        userOnlineHeart: function() {
            return BilibiliAPI.ajax({
                type: 'POST',
                url: 'User/userOnlineHeart'
            });
        },
        getUserInfo: function(ts) { // ms
            return BilibiliAPI.ajax({
                url: 'User/getUserInfo?ts=' + ts
            });
        }
    },
    YearWelfare: {
        checkFirstCharge: function() {
            return BilibiliAPI.ajax({
                url: 'YearWelfare/checkFirstCharge'
            });
        },
        inviteUserList: function() {
            return BilibiliAPI.ajax({
                url: 'YearWelfare/inviteUserList/1'
            });
        }
    }
};