哔哩哔哩直播间开播提醒脚本

当你指定的主播开播时,进行及时的系统提醒

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         哔哩哔哩直播间开播提醒脚本
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  当你指定的主播开播时,进行及时的系统提醒
// @author       伊吹dv子
// @match        https://t.bilibili.com/*
// @grant        none
// @license      MIT
// ==/UserScript==


(function() {
    'use strict';
    const targetRoomIds = [33989, 42062, 5085, 17961, 5252, 24371440]; // 需要检测的直播间房间号
    const roomNames = {
        33989: "诶嘿酱",
        42062: "牛子豪",
        5085: "小智",
        17961: "赫萝",
        5252: "天堂",
        24371440: "测试"
    }; // 房间号对应主播名字



    const checkInterval = 10000; // 检测间隔时间为10秒

    // 从 localStorage 读取直播状态
    function loadRoomLiveStatus() {
        let status = localStorage.getItem('roomLiveStatus');
        try {
            return JSON.parse(status) || {};
        } catch (e) {
            console.error('localStorage 读取失败,重置状态:', e);
            return {};
        }
    }

    // 保存直播状态到 localStorage
    function saveRoomLiveStatus(status) {
        try {
            localStorage.setItem('roomLiveStatus', JSON.stringify(status));
        } catch (e) {
            console.error('localStorage 保存失败:', e);
        }
    }

    // 初始化直播状态
    let roomLiveStatus = loadRoomLiveStatus();
    targetRoomIds.forEach(roomId => {
        if (!roomLiveStatus[roomId]) {
            roomLiveStatus[roomId] = { notified: false, status: 'offline' }; // 默认状态为未提醒且离线
        }
    });

    // 检查某个房间的直播状态
    async function checkRoomStatus(roomId) {
        try {
            const apiUrl = `https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${roomId}`;
            const response = await fetch(apiUrl);
            const data = await response.json();

            if (data && data.data) {
                const isLive = data.data.live_status === 1;

                // 如果主播直播且未提醒过,发送提醒
                if (isLive && roomLiveStatus[roomId].status === 'offline' && !roomLiveStatus[roomId].notified) {
                    notifyUser(roomId); // 发送提醒
                    roomLiveStatus[roomId] = { notified: true, status: 'live' }; // 更新状态为直播且已提醒
                    saveRoomLiveStatus(roomLiveStatus); // 保存状态
                }

                // 如果主播下播,重置提醒状态
                if (!isLive && roomLiveStatus[roomId].status === 'live') {
                    roomLiveStatus[roomId] = { notified: false, status: 'offline' }; // 更新状态为离线
                    saveRoomLiveStatus(roomLiveStatus); // 保存状态
                }
            }
        } catch (error) {
            console.error(`获取房间 ${roomId} 的直播状态失败:`, error);
        }
    }

    // 通知用户
    function notifyUser(roomId) {
        const roomUrl = `https://live.bilibili.com/${roomId}`;
        const roomName = roomNames[roomId] || `直播间${roomId}`; // 获取主播名字,找不到时显示房间号

        if (Notification.permission === 'granted') {
            const notification = new Notification('主播已开播!', {
                body: `哔哩哔哩直播间:【${roomName}】正在直播!`,
                icon: 'https://i0.hdslb.com/bfs/live/cb040181b80e61b94473b2e42d39fa06de09ae2a.png'
            });

            // 点击通知跳转到直播间
            notification.onclick = () => {
                window.open(roomUrl, '_blank'); // 打开直播间
            };
        } else if (Notification.permission !== 'denied') {
            Notification.requestPermission().then(permission => {
                if (permission === 'granted') {
                    const notification = new Notification('主播已开播!', {
                        body: `哔哩哔哩直播间:【${roomName}】正在直播!`,
                        icon: 'https://i0.hdslb.com/bfs/live/cb040181b80e61b94473b2e42d39fa06de09ae2a.png'
                    });

                    // 点击通知跳转到直播间
                    notification.onclick = () => {
                        window.open(roomUrl, '_blank'); // 打开直播间
                    };
                }
            });
        }
    }

    // 定时检查所有房间的状态
    function checkLiveStatus() {
        targetRoomIds.forEach(roomId => {
            checkRoomStatus(roomId);
        });
    }

    // 定时循环监控,使用 setTimeout 控制检查间隔
    function startMonitoring() {
        checkLiveStatus();
        setTimeout(startMonitoring, checkInterval); // 每10秒检测一次
    }

    // 请求通知权限并开始监控
    if (Notification.permission !== 'granted') {
        Notification.requestPermission();
    }

    // 延迟3秒后开始监控,避免页面刚加载时增加压力
    setTimeout(() => startMonitoring(), 3000);

})();