Nemo2011 / bilibili-api

哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api
https://nemo2011.github.io/bilibili-api/
GNU General Public License v3.0
2.17k stars 205 forks source link

[需求] 放映室 #325

Closed z0z0r4 closed 1 year ago

z0z0r4 commented 1 year ago

从来没用过,今天不小心点到发现偶尔还是有人用的...

https://www.bilibili.com/watchroom/100063959?wepid=752679&seasonid=45305

挖个坑,里面和直播间一样,接口挺多的233

z0z0r4 commented 1 year ago

端午我来实现这个

z0z0r4 commented 1 year ago

创建放映室 POST https://api.bilibili.com/pgc/freya/web/room/create

data

season_id: 45303
episode_id: 752900
is_open: 0
platform: web
csrf: 24ac5ad5da36e98b3f5b23b01e56bfa0

resp

{
  "code": 0,
  "data": {
    "com_room_id": 0,
    "enter_id": "",
    "episode_id": 752900,
    "init_sequence_id": 0,
    "is_new": 1,
    "latest_seq_id": 0,
    "report_time": 5,
    "room_id": 102337299,
    "room_mode": 0,
    "season_id": 45303
  },
  "message": "success"
}
z0z0r4 commented 1 year ago

完全看不懂 from_typefail_fast 的意义

"match": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/match",
            "method": "POST",
            "verify": true,
            "data": {
                "fail_fast": "int",
                "season_id": "int: 季id",
                "from_type": "int",
                "season_type": "int",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "匹配放映室"
        }
z0z0r4 commented 1 year ago

活见鬼,接口返回错误代码:6006079,信息:啊哦,放映室走失了,创建一个吧。 image

z0z0r4 commented 1 year ago

毁灭吧,这玩意有人接就接,没人接就爆炸吧,死活报错,复制的PS都没用,只有浏览器里重播才有200OK,封装个毛

$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.51"
$session.Cookies.Add((New-Object System.Net.Cookie("i-wanna-go-back", "-1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("buvid_fp_plain", "undefined", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("nostalgia_conf", "-1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("LIVE_BUVID", "AUTO7316682671482426", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("CURRENT_BLACKGAP", "0", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("rpdid", "|(J~RYkk||lm0J'uYYmJm|YR|", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("_uuid", "5410110B84-74DE-97AA-8C1F-F51074171311558203infoc", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("PVID", "2", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("hit-new-style-dyn", "0", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("hit-dyn-v2", "1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("dy_spec_agreed", "1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("buvid3", "931081E9D-AE3E-9F5F-9109F-6E1521591018836102infoc", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("is-2022-channel", "1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("blackside_state", "1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("header_theme_version", "CLOSE", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("CURRENT_PID", "58478c40-d092-11ed-a0b0-b75f1eda933b", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("opus-goback", "1", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("CURRENT_QUALITY", "112", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("FEED_LIVE_VERSION", "V8", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("DedeUserID", "558830935", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("DedeUserID__ckMd5", "2123f10c198e6caa", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("b_ut", "5", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("SESSDATA", "", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("bili_jct", "", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("fingerprint", "0287102c9275fb2a803d40bb46099b92", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("buvid_fp", "0287102c9275fb2a803d40bb46099b92", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("b_nut", "1687423841", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("i-wanna-go-feeds", "2", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("home_feed_column", "5", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("browser_resolution", "1536-714", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("b_lsid", "10F81FA4A_188E795A66F", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("bp_video_offset_558830935", "810346138723942400", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("sid", "5tm3u9nl", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("CURRENT_FNVAL", "80", "/", ".bilibili.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("buvid4", "ArNV1JztoIl6FXo4yYsDmg%3D%3D", "/", ".bilibili.com")))
Invoke-WebRequest -UseBasicParsing -Uri "https://api.bilibili.com/pgc/freya/web/room/info?room_id=102415923&platform=web" `
-WebSession $session `
-Headers @{
"authority"="api.bilibili.com"
  "method"="GET"
  "path"="/pgc/freya/web/room/info?room_id=102415923&platform=web"
  "scheme"="https"
  "accept"="application/json, text/plain, */*"
  "accept-encoding"="gzip, deflate, br"
  "accept-language"="zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"
  "cache-control"="no-cache"
  "origin"="https://www.bilibili.com"
  "pragma"="no-cache"
  "referer"="https://www.bilibili.com/"
  "sec-ch-ua"="`"Not.A/Brand`";v=`"8`", `"Chromium`";v=`"114`", `"Microsoft Edge`";v=`"114`""
  "sec-ch-ua-mobile"="?0"
  "sec-ch-ua-platform"="`"Windows`""
  "sec-fetch-dest"="empty"
  "sec-fetch-mode"="cors"
  "sec-fetch-site"="same-site"
}

StatusCode        : 200
StatusDescription : OK
Content           : !${"code":6006079,"message":"åå¦ï¼æ¾æï¼å»ºä¸ä¸ªå

image

z0z0r4 commented 1 year ago
# bilibili_api/watchroom.py
"""
bilibili_api.watchroom

放映室相关 API
"""

from .utils.network_httpx import request
from .utils.utils import get_api
from .credential import Credential

API = get_api("watchroom")

class WatchRoom:
    """
    放映室类

    AttributesL
        credential      (Credential): 凭据类

        room_id (int)       : 放映室 id
    """
    def __init__(self, room_id: int, credential: Credential):
        self.room_id: int = room_id
        self.credential: Credential = credential

    async def get_info(self) -> dict:
        """
        获取放映室信息

        Returns:
            dict: 调用 API 返回的结果
        """
        api = API["info"]["info"]
        params = {"room_id": self.room_id, "platform": "web"}
        return await request(
            "GET", api["url"], params=params, credential=self.credential
        )

    async def open(self) -> None:
        """
        开放放映室
        """
        api = API["operate"]["open"]
        data = {"room_id": self.room_id, "is_open": 1, "csrf": self.credential.bili_jct, "platform": "web"}
        await request("POST", url=api["url"], data=data, credential=self.credential)

    async def close(self) -> None:
        """
        关闭放映室
        """
        api = API["operate"]["open"]
        data = {"room_id": self.room_id, "is_open": 0}
        await request("POST", api["url"], data=data, credential=self.credential)

bilibili_api/data/api/watchroom.json

{
    "info": {
        "info": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/info",
            "method": "GET",
            "verify": true,
            "params": {
                "room_id": "int: 放映室id",
                "platform": "str: web"
            },
            "comment": "放映室信息"
        }
    },
    "operate": {
        "match": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/match",
            "method": "POST",
            "verify": true,
            "data": {
                "fail_fast": "int",
                "season_id": "int: 番剧的 season_id",
                "from_type": "int",
                "season_type": "int",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "匹配放映室"
        },
        "create": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/create",
            "method": "POST",
            "verify": true,
            "data": {
                "season_id": "int: 番剧的 season_id",
                "episode_id": "int: 剧集id",
                "is_open": "int: 是否公开 0 不公开 1 公开",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "创建放映室"
        },
        "join": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/join",
            "method": "POST",
            "verify": true,
            "data": {
                "room_id": "int: 放映室id",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "加入放映室"
        },
        "open": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/modify/info",
            "method": "POST",
            "verify": true,
            "data": {
                "room_id": "int: 放映室id",
                "is_open": "int: 是否公开 0 不公开 1 公开",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "开启放映室"
        },
        "progress": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/modify/progress",
            "method": "POST",
            "verify": true,
            "data": {
                "room_id": "int: 放映室id",
                "status": "状态 1 播放中 0 暂停中 2 已结束",
                "progress": "int: 进度 s",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "修改放映室进度"
        },
        "kickout": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/kickout",
            "method": "POST",
            "verify": true,
            "data": {
                "room_id": "int: 放映室id",
                "mid": "int: 被踢出用户uid",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "踢出放映室"
        },
        "season": {
            "url": "https://api.bilibili.com/pgc/freya/web/room/modify/season",
            "method": "POST",
            "verify": true,
            "data": {
                "room_id": "int: 放映室id",
                "season_id": "int: 番剧的 season_id",
                "episode_id": "int: 剧集id",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "修改放映室播放内容"
        },
        "send": {
            "url": "https://api.bilibili.com/pgc/freya/web/im/msg/send",
            "method": "POST",
            "verify": true,
            "data": {
                "room_id": "int: 放映室id",
                "content_type": "int: 0",
                "content": "str: 发送内容",
                "req_id": "int: 时间戳",
                "platform": "str: web",
                "csrf": "str: csrf"
            },
            "comment": "发送弹幕"
        }
    }
}
z0z0r4 commented 1 year ago

https://api.bilibili.com/pgc/view/web/freya/season?season_id=5016&ep_id=90822&room_id=117104009&platform=web&csrf=

z0z0r4 commented 1 year ago

接口如果涉及房主是自己或者需要房主权限的情况下,必须验证buvid3为开房的那个...

天坑,气炸了

z0z0r4 commented 1 year ago

GET https://api.bilibili.com/pgc/freya/web/room/heartbeat 久不发就会被踢出 默认30s一次

data room_id=117136123&mid=129323413&season_id=5016&episode_id=90901&type=0&play_status=1&buvid=

z0z0r4 commented 1 year ago

获取即时播放情况,get_info 是同步操作 wss://vega-dsa.biliapi.net:8443/pgc/vega/websocket

z0z0r4 commented 1 year ago

progress 房主特有,操作进度条和播放状态

z0z0r4 commented 1 year ago

做完这个发release